@lifi/widget 4.3.0 → 4.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/config/version.d.ts +1 -1
- package/dist/esm/config/version.js +1 -1
- package/dist/esm/config/version.js.map +1 -1
- package/dist/esm/pages/LanguagesPage.js +19 -7
- package/dist/esm/pages/LanguagesPage.js.map +1 -1
- package/dist/esm/pages/RoutesPage/RoutesPage.js +28 -16
- package/dist/esm/pages/RoutesPage/RoutesPage.js.map +1 -1
- package/package.json +1 -1
- package/src/config/version.ts +1 -1
- package/src/pages/LanguagesPage.tsx +36 -23
- package/src/pages/RoutesPage/RoutesPage.tsx +38 -27
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","names":[],"sources":["../../../src/config/version.ts"],"sourcesContent":["export const name = '@lifi/widget'\nexport const version = '4.3.
|
|
1
|
+
{"version":3,"file":"version.js","names":[],"sources":["../../../src/config/version.ts"],"sourcesContent":["export const name = '@lifi/widget'\nexport const version = '4.3.1'\n"],"mappings":";AAAA,MAAa,OAAO;AACpB,MAAa,UAAU"}
|
|
@@ -1,27 +1,39 @@
|
|
|
1
1
|
import { languageNames } from "../providers/I18nProvider/constants.js";
|
|
2
2
|
import { PageContainer } from "../components/PageContainer.js";
|
|
3
3
|
import { useHeader } from "../hooks/useHeader.js";
|
|
4
|
+
import { useListHeight } from "../hooks/useListHeight.js";
|
|
4
5
|
import { ListItemText as ListItemText$1 } from "../components/ListItemText.js";
|
|
5
6
|
import { SettingsListItemButton } from "../components/SettingsListItemButton.js";
|
|
6
7
|
import { useLanguages } from "../hooks/useLanguages.js";
|
|
7
|
-
import {
|
|
8
|
+
import { useRef } from "react";
|
|
9
|
+
import { Box, List } from "@mui/material";
|
|
8
10
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
11
|
import { useTranslation } from "react-i18next";
|
|
10
12
|
import Check from "@mui/icons-material/Check";
|
|
11
13
|
//#region src/pages/LanguagesPage.tsx
|
|
12
14
|
const LanguagesPage = () => {
|
|
13
15
|
const { t } = useTranslation();
|
|
16
|
+
const listParentRef = useRef(null);
|
|
14
17
|
const { selectedLanguageCode, availableLanguages, setLanguageWithCode } = useLanguages();
|
|
15
18
|
useHeader(t("language.title"));
|
|
19
|
+
const { listHeight } = useListHeight({ listParentRef });
|
|
16
20
|
if (availableLanguages.length < 1) return null;
|
|
17
21
|
return /* @__PURE__ */ jsx(PageContainer, {
|
|
18
22
|
disableGutters: true,
|
|
19
|
-
children: /* @__PURE__ */ jsx(
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
children: /* @__PURE__ */ jsx(Box, {
|
|
24
|
+
className: "long-list",
|
|
25
|
+
ref: listParentRef,
|
|
26
|
+
style: {
|
|
27
|
+
height: listHeight,
|
|
28
|
+
overflow: "auto"
|
|
29
|
+
},
|
|
30
|
+
children: /* @__PURE__ */ jsx(List, {
|
|
31
|
+
sx: { padding: 1.5 },
|
|
32
|
+
children: availableLanguages.map((language) => /* @__PURE__ */ jsxs(SettingsListItemButton, {
|
|
33
|
+
onClick: () => setLanguageWithCode(language),
|
|
34
|
+
children: [/* @__PURE__ */ jsx(ListItemText$1, { primary: languageNames[language] || t("language.name", { lng: language }) || language }), selectedLanguageCode === language && /* @__PURE__ */ jsx(Check, { color: "primary" })]
|
|
35
|
+
}, language))
|
|
36
|
+
})
|
|
25
37
|
})
|
|
26
38
|
});
|
|
27
39
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LanguagesPage.js","names":["ListItemText"],"sources":["../../../src/pages/LanguagesPage.tsx"],"sourcesContent":["import Check from '@mui/icons-material/Check'\nimport { List } from '@mui/material'\nimport { useTranslation } from 'react-i18next'\nimport { ListItemText } from '../components/ListItemText.js'\nimport { PageContainer } from '../components/PageContainer.js'\nimport { SettingsListItemButton } from '../components/SettingsListItemButton.js'\nimport { useHeader } from '../hooks/useHeader.js'\nimport { useLanguages } from '../hooks/useLanguages.js'\nimport { languageNames } from '../providers/I18nProvider/constants.js'\n\nexport const LanguagesPage: React.FC = () => {\n const { t } = useTranslation()\n const { selectedLanguageCode, availableLanguages, setLanguageWithCode } =\n useLanguages()\n\n useHeader(t('language.title'))\n\n if (availableLanguages.length < 1) {\n return null\n }\n\n return (\n <PageContainer disableGutters>\n <List\n
|
|
1
|
+
{"version":3,"file":"LanguagesPage.js","names":["ListItemText"],"sources":["../../../src/pages/LanguagesPage.tsx"],"sourcesContent":["import Check from '@mui/icons-material/Check'\nimport { Box, List } from '@mui/material'\nimport { useRef } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { ListItemText } from '../components/ListItemText.js'\nimport { PageContainer } from '../components/PageContainer.js'\nimport { SettingsListItemButton } from '../components/SettingsListItemButton.js'\nimport { useHeader } from '../hooks/useHeader.js'\nimport { useLanguages } from '../hooks/useLanguages.js'\nimport { useListHeight } from '../hooks/useListHeight.js'\nimport { languageNames } from '../providers/I18nProvider/constants.js'\n\nexport const LanguagesPage: React.FC = () => {\n const { t } = useTranslation()\n const listParentRef = useRef<HTMLDivElement>(null)\n const { selectedLanguageCode, availableLanguages, setLanguageWithCode } =\n useLanguages()\n\n useHeader(t('language.title'))\n\n const { listHeight } = useListHeight({\n listParentRef,\n })\n\n if (availableLanguages.length < 1) {\n return null\n }\n\n return (\n <PageContainer disableGutters>\n <Box\n className=\"long-list\"\n ref={listParentRef}\n style={{ height: listHeight, overflow: 'auto' }}\n >\n <List\n sx={{\n padding: 1.5,\n }}\n >\n {availableLanguages.map((language) => (\n <SettingsListItemButton\n key={language}\n onClick={() => setLanguageWithCode(language)}\n >\n <ListItemText\n primary={\n languageNames[language as keyof typeof languageNames] ||\n t('language.name', {\n lng: language,\n }) ||\n language\n }\n />\n {selectedLanguageCode === language && <Check color=\"primary\" />}\n </SettingsListItemButton>\n ))}\n </List>\n </Box>\n </PageContainer>\n )\n}\n"],"mappings":";;;;;;;;;;;;;AAYA,MAAa,sBAAgC;CAC3C,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,gBAAgB,OAAuB,IAAI;CACjD,MAAM,EAAE,sBAAsB,oBAAoB,wBAChD,aAAa;CAEf,UAAU,EAAE,gBAAgB,CAAC;CAE7B,MAAM,EAAE,eAAe,cAAc,EACnC,cACF,CAAC;CAED,IAAI,mBAAmB,SAAS,GAC9B,OAAO;CAGT,OACE,oBAAC,eAAD;EAAe,gBAAA;YACb,oBAAC,KAAD;GACE,WAAU;GACV,KAAK;GACL,OAAO;IAAE,QAAQ;IAAY,UAAU;GAAO;aAE9C,oBAAC,MAAD;IACE,IAAI,EACF,SAAS,IACX;cAEC,mBAAmB,KAAK,aACvB,qBAAC,wBAAD;KAEE,eAAe,oBAAoB,QAAQ;eAF7C,CAIE,oBAACA,gBAAD,EACE,SACE,cAAc,aACd,EAAE,iBAAiB,EACjB,KAAK,SACP,CAAC,KACD,SAEH,CAAA,GACA,yBAAyB,YAAY,oBAAC,OAAD,EAAO,OAAM,UAAW,CAAA,CACxC;OAbjB,QAaiB,CACzB;GACG,CAAA;EACH,CAAA;CACQ,CAAA;AAEnB"}
|
|
@@ -2,6 +2,7 @@ import { useWidgetEvents } from "../../hooks/useWidgetEvents.js";
|
|
|
2
2
|
import "../../types/events.js";
|
|
3
3
|
import { navigationRoutes } from "../../utils/navigationRoutes.js";
|
|
4
4
|
import { useFieldValues } from "../../stores/form/useFieldValues.js";
|
|
5
|
+
import { PageContainer } from "../../components/PageContainer.js";
|
|
5
6
|
import { useRoutes } from "../../hooks/useRoutes.js";
|
|
6
7
|
import { useToAddressRequirements } from "../../hooks/useToAddressRequirements.js";
|
|
7
8
|
import { ProgressToNextUpdate } from "../../components/ProgressToNextUpdate.js";
|
|
@@ -9,9 +10,11 @@ import { RouteCard } from "../../components/RouteCard/RouteCard.js";
|
|
|
9
10
|
import { RouteCardSkeleton } from "../../components/RouteCard/RouteCardSkeleton.js";
|
|
10
11
|
import { RouteNotFoundCard } from "../../components/RouteCard/RouteNotFoundCard.js";
|
|
11
12
|
import { useHeader } from "../../hooks/useHeader.js";
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
13
|
+
import { useListHeight } from "../../hooks/useListHeight.js";
|
|
14
|
+
import { Stack as Stack$1 } from "./RoutesPage.style.js";
|
|
15
|
+
import { useMemo, useRef } from "react";
|
|
14
16
|
import { useNavigate } from "@tanstack/react-router";
|
|
17
|
+
import { Box } from "@mui/material";
|
|
15
18
|
import { jsx } from "react/jsx-runtime";
|
|
16
19
|
import { useTranslation } from "react-i18next";
|
|
17
20
|
import { useAccount } from "@lifi/wallet-management";
|
|
@@ -20,6 +23,7 @@ const RoutesPage = () => {
|
|
|
20
23
|
const { t } = useTranslation();
|
|
21
24
|
const navigate = useNavigate();
|
|
22
25
|
const emitter = useWidgetEvents();
|
|
26
|
+
const listParentRef = useRef(null);
|
|
23
27
|
const { routes, isLoading, isFetching, dataUpdatedAt, refetchTime, fromChain, refetch, setReviewableRoute } = useRoutes();
|
|
24
28
|
const { account } = useAccount({ chainType: fromChain?.chainType });
|
|
25
29
|
const [toAddress] = useFieldValues("toAddress");
|
|
@@ -38,6 +42,7 @@ const RoutesPage = () => {
|
|
|
38
42
|
refetchTime
|
|
39
43
|
]);
|
|
40
44
|
useHeader(t("header.receive"), headerAction);
|
|
45
|
+
const { listHeight } = useListHeight({ listParentRef });
|
|
41
46
|
const handleRouteClick = (route) => {
|
|
42
47
|
setReviewableRoute(route);
|
|
43
48
|
navigate({
|
|
@@ -52,20 +57,27 @@ const RoutesPage = () => {
|
|
|
52
57
|
const routeNotFound = !routes?.length && !isLoading && !isFetching;
|
|
53
58
|
const toAddressUnsatisfied = routes?.[0] && requiredToAddress && !toAddress;
|
|
54
59
|
const allowInteraction = account.isConnected && !toAddressUnsatisfied;
|
|
55
|
-
return /* @__PURE__ */ jsx(
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
60
|
+
return /* @__PURE__ */ jsx(PageContainer, {
|
|
61
|
+
disableGutters: true,
|
|
62
|
+
children: /* @__PURE__ */ jsx(Box, {
|
|
63
|
+
className: "long-list",
|
|
64
|
+
ref: listParentRef,
|
|
65
|
+
style: {
|
|
66
|
+
height: listHeight,
|
|
67
|
+
overflow: "auto"
|
|
68
|
+
},
|
|
69
|
+
children: /* @__PURE__ */ jsx(Stack$1, {
|
|
70
|
+
direction: "column",
|
|
71
|
+
spacing: 2,
|
|
72
|
+
sx: { pt: 1.5 },
|
|
73
|
+
children: routeNotFound ? /* @__PURE__ */ jsx(RouteNotFoundCard, {}) : isLoading && !routes?.length ? Array.from({ length: 3 }).map((_, index) => /* @__PURE__ */ jsx(RouteCardSkeleton, {}, index)) : routes?.map((route, index) => /* @__PURE__ */ jsx(RouteCard, {
|
|
74
|
+
route,
|
|
75
|
+
onClick: allowInteraction ? () => handleRouteClick(route) : void 0,
|
|
76
|
+
active: index === 0,
|
|
77
|
+
expanded: routes?.length === 1
|
|
78
|
+
}, index))
|
|
79
|
+
})
|
|
80
|
+
})
|
|
69
81
|
});
|
|
70
82
|
};
|
|
71
83
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RoutesPage.js","names":[],"sources":["../../../../src/pages/RoutesPage/RoutesPage.tsx"],"sourcesContent":["import type { Route } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport { useNavigate } from '@tanstack/react-router'\nimport { type JSX, useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { ProgressToNextUpdate } from '../../components/ProgressToNextUpdate.js'\nimport { RouteCard } from '../../components/RouteCard/RouteCard.js'\nimport { RouteCardSkeleton } from '../../components/RouteCard/RouteCardSkeleton.js'\nimport { RouteNotFoundCard } from '../../components/RouteCard/RouteNotFoundCard.js'\nimport { useHeader } from '../../hooks/useHeader.js'\nimport { useRoutes } from '../../hooks/useRoutes.js'\nimport { useToAddressRequirements } from '../../hooks/useToAddressRequirements.js'\nimport { useWidgetEvents } from '../../hooks/useWidgetEvents.js'\nimport { useFieldValues } from '../../stores/form/useFieldValues.js'\nimport { WidgetEvent } from '../../types/events.js'\nimport { navigationRoutes } from '../../utils/navigationRoutes.js'\nimport { Stack } from './RoutesPage.style.js'\n\nexport const RoutesPage = (): JSX.Element => {\n const { t } = useTranslation()\n const navigate = useNavigate()\n const emitter = useWidgetEvents()\n const {\n routes,\n isLoading,\n isFetching,\n dataUpdatedAt,\n refetchTime,\n fromChain,\n refetch,\n setReviewableRoute,\n } = useRoutes()\n const { account } = useAccount({ chainType: fromChain?.chainType })\n const [toAddress] = useFieldValues('toAddress')\n const { requiredToAddress } = useToAddressRequirements()\n\n const headerAction = useMemo(\n () => (\n <ProgressToNextUpdate\n updatedAt={dataUpdatedAt || Date.now()}\n timeToUpdate={refetchTime}\n isLoading={isFetching}\n onClick={() => refetch()}\n sx={{ marginRight: -1 }}\n size=\"medium\"\n />\n ),\n [dataUpdatedAt, isFetching, refetch, refetchTime]\n )\n\n useHeader(t('header.receive'), headerAction)\n\n const handleRouteClick = (route: Route) => {\n setReviewableRoute(route)\n navigate({\n to: navigationRoutes.transactionExecution,\n search: { routeId: route.id },\n })\n emitter.emit(WidgetEvent.RouteSelected, {\n route,\n routes: routes!,\n })\n }\n\n const routeNotFound = !routes?.length && !isLoading && !isFetching\n\n const toAddressUnsatisfied = routes?.[0] && requiredToAddress && !toAddress\n\n const allowInteraction = account.isConnected && !toAddressUnsatisfied\n\n return (\n <
|
|
1
|
+
{"version":3,"file":"RoutesPage.js","names":["Stack"],"sources":["../../../../src/pages/RoutesPage/RoutesPage.tsx"],"sourcesContent":["import type { Route } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport { Box } from '@mui/material'\nimport { useNavigate } from '@tanstack/react-router'\nimport { type JSX, useMemo, useRef } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { PageContainer } from '../../components/PageContainer.js'\nimport { ProgressToNextUpdate } from '../../components/ProgressToNextUpdate.js'\nimport { RouteCard } from '../../components/RouteCard/RouteCard.js'\nimport { RouteCardSkeleton } from '../../components/RouteCard/RouteCardSkeleton.js'\nimport { RouteNotFoundCard } from '../../components/RouteCard/RouteNotFoundCard.js'\nimport { useHeader } from '../../hooks/useHeader.js'\nimport { useListHeight } from '../../hooks/useListHeight.js'\nimport { useRoutes } from '../../hooks/useRoutes.js'\nimport { useToAddressRequirements } from '../../hooks/useToAddressRequirements.js'\nimport { useWidgetEvents } from '../../hooks/useWidgetEvents.js'\nimport { useFieldValues } from '../../stores/form/useFieldValues.js'\nimport { WidgetEvent } from '../../types/events.js'\nimport { navigationRoutes } from '../../utils/navigationRoutes.js'\nimport { Stack } from './RoutesPage.style.js'\n\nexport const RoutesPage = (): JSX.Element => {\n const { t } = useTranslation()\n const navigate = useNavigate()\n const emitter = useWidgetEvents()\n const listParentRef = useRef<HTMLDivElement>(null)\n const {\n routes,\n isLoading,\n isFetching,\n dataUpdatedAt,\n refetchTime,\n fromChain,\n refetch,\n setReviewableRoute,\n } = useRoutes()\n const { account } = useAccount({ chainType: fromChain?.chainType })\n const [toAddress] = useFieldValues('toAddress')\n const { requiredToAddress } = useToAddressRequirements()\n\n const headerAction = useMemo(\n () => (\n <ProgressToNextUpdate\n updatedAt={dataUpdatedAt || Date.now()}\n timeToUpdate={refetchTime}\n isLoading={isFetching}\n onClick={() => refetch()}\n sx={{ marginRight: -1 }}\n size=\"medium\"\n />\n ),\n [dataUpdatedAt, isFetching, refetch, refetchTime]\n )\n\n useHeader(t('header.receive'), headerAction)\n\n const { listHeight } = useListHeight({\n listParentRef,\n })\n\n const handleRouteClick = (route: Route) => {\n setReviewableRoute(route)\n navigate({\n to: navigationRoutes.transactionExecution,\n search: { routeId: route.id },\n })\n emitter.emit(WidgetEvent.RouteSelected, {\n route,\n routes: routes!,\n })\n }\n\n const routeNotFound = !routes?.length && !isLoading && !isFetching\n\n const toAddressUnsatisfied = routes?.[0] && requiredToAddress && !toAddress\n\n const allowInteraction = account.isConnected && !toAddressUnsatisfied\n\n return (\n <PageContainer disableGutters>\n <Box\n className=\"long-list\"\n ref={listParentRef}\n style={{ height: listHeight, overflow: 'auto' }}\n >\n <Stack direction=\"column\" spacing={2} sx={{ pt: 1.5 }}>\n {routeNotFound ? (\n <RouteNotFoundCard />\n ) : isLoading && !routes?.length ? (\n Array.from({ length: 3 }).map((_, index) => (\n <RouteCardSkeleton key={index} />\n ))\n ) : (\n routes?.map((route: Route, index: number) => (\n <RouteCard\n key={index}\n route={route}\n onClick={\n allowInteraction ? () => handleRouteClick(route) : undefined\n }\n active={index === 0}\n expanded={routes?.length === 1}\n />\n ))\n )}\n </Stack>\n </Box>\n </PageContainer>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAqBA,MAAa,mBAAgC;CAC3C,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,WAAW,YAAY;CAC7B,MAAM,UAAU,gBAAgB;CAChC,MAAM,gBAAgB,OAAuB,IAAI;CACjD,MAAM,EACJ,QACA,WACA,YACA,eACA,aACA,WACA,SACA,uBACE,UAAU;CACd,MAAM,EAAE,YAAY,WAAW,EAAE,WAAW,WAAW,UAAU,CAAC;CAClE,MAAM,CAAC,aAAa,eAAe,WAAW;CAC9C,MAAM,EAAE,sBAAsB,yBAAyB;CAEvD,MAAM,eAAe,cAEjB,oBAAC,sBAAD;EACE,WAAW,iBAAiB,KAAK,IAAI;EACrC,cAAc;EACd,WAAW;EACX,eAAe,QAAQ;EACvB,IAAI,EAAE,aAAa,GAAG;EACtB,MAAK;CACN,CAAA,GAEH;EAAC;EAAe;EAAY;EAAS;CAAW,CAClD;CAEA,UAAU,EAAE,gBAAgB,GAAG,YAAY;CAE3C,MAAM,EAAE,eAAe,cAAc,EACnC,cACF,CAAC;CAED,MAAM,oBAAoB,UAAiB;EACzC,mBAAmB,KAAK;EACxB,SAAS;GACP,IAAI,iBAAiB;GACrB,QAAQ,EAAE,SAAS,MAAM,GAAG;EAC9B,CAAC;EACD,QAAQ,KAAA,iBAAgC;GACtC;GACQ;EACV,CAAC;CACH;CAEA,MAAM,gBAAgB,CAAC,QAAQ,UAAU,CAAC,aAAa,CAAC;CAExD,MAAM,uBAAuB,SAAS,MAAM,qBAAqB,CAAC;CAElE,MAAM,mBAAmB,QAAQ,eAAe,CAAC;CAEjD,OACE,oBAAC,eAAD;EAAe,gBAAA;YACb,oBAAC,KAAD;GACE,WAAU;GACV,KAAK;GACL,OAAO;IAAE,QAAQ;IAAY,UAAU;GAAO;aAE9C,oBAACA,SAAD;IAAO,WAAU;IAAS,SAAS;IAAG,IAAI,EAAE,IAAI,IAAI;cACjD,gBACC,oBAAC,mBAAD,CAAoB,CAAA,IAClB,aAAa,CAAC,QAAQ,SACxB,MAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,UAChC,oBAAC,mBAAD,CAAgC,GAAR,KAAQ,CACjC,IAED,QAAQ,KAAK,OAAc,UACzB,oBAAC,WAAD;KAES;KACP,SACE,yBAAyB,iBAAiB,KAAK,IAAI,KAAA;KAErD,QAAQ,UAAU;KAClB,UAAU,QAAQ,WAAW;IAC9B,GAPM,KAON,CACF;GAEE,CAAA;EACJ,CAAA;CACQ,CAAA;AAEnB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lifi/widget",
|
|
3
|
-
"version": "4.3.
|
|
3
|
+
"version": "4.3.1",
|
|
4
4
|
"description": "LI.FI Widget for cross-chain bridging and swapping. It will drive your multi-chain strategy and attract new users from everywhere.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/esm/index.js",
|
package/src/config/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export const name = '@lifi/widget'
|
|
2
|
-
export const version = '4.3.
|
|
2
|
+
export const version = '4.3.1'
|
|
@@ -1,49 +1,62 @@
|
|
|
1
1
|
import Check from '@mui/icons-material/Check'
|
|
2
|
-
import { List } from '@mui/material'
|
|
2
|
+
import { Box, List } from '@mui/material'
|
|
3
|
+
import { useRef } from 'react'
|
|
3
4
|
import { useTranslation } from 'react-i18next'
|
|
4
5
|
import { ListItemText } from '../components/ListItemText.js'
|
|
5
6
|
import { PageContainer } from '../components/PageContainer.js'
|
|
6
7
|
import { SettingsListItemButton } from '../components/SettingsListItemButton.js'
|
|
7
8
|
import { useHeader } from '../hooks/useHeader.js'
|
|
8
9
|
import { useLanguages } from '../hooks/useLanguages.js'
|
|
10
|
+
import { useListHeight } from '../hooks/useListHeight.js'
|
|
9
11
|
import { languageNames } from '../providers/I18nProvider/constants.js'
|
|
10
12
|
|
|
11
13
|
export const LanguagesPage: React.FC = () => {
|
|
12
14
|
const { t } = useTranslation()
|
|
15
|
+
const listParentRef = useRef<HTMLDivElement>(null)
|
|
13
16
|
const { selectedLanguageCode, availableLanguages, setLanguageWithCode } =
|
|
14
17
|
useLanguages()
|
|
15
18
|
|
|
16
19
|
useHeader(t('language.title'))
|
|
17
20
|
|
|
21
|
+
const { listHeight } = useListHeight({
|
|
22
|
+
listParentRef,
|
|
23
|
+
})
|
|
24
|
+
|
|
18
25
|
if (availableLanguages.length < 1) {
|
|
19
26
|
return null
|
|
20
27
|
}
|
|
21
28
|
|
|
22
29
|
return (
|
|
23
30
|
<PageContainer disableGutters>
|
|
24
|
-
<
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}}
|
|
31
|
+
<Box
|
|
32
|
+
className="long-list"
|
|
33
|
+
ref={listParentRef}
|
|
34
|
+
style={{ height: listHeight, overflow: 'auto' }}
|
|
28
35
|
>
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
36
|
+
<List
|
|
37
|
+
sx={{
|
|
38
|
+
padding: 1.5,
|
|
39
|
+
}}
|
|
40
|
+
>
|
|
41
|
+
{availableLanguages.map((language) => (
|
|
42
|
+
<SettingsListItemButton
|
|
43
|
+
key={language}
|
|
44
|
+
onClick={() => setLanguageWithCode(language)}
|
|
45
|
+
>
|
|
46
|
+
<ListItemText
|
|
47
|
+
primary={
|
|
48
|
+
languageNames[language as keyof typeof languageNames] ||
|
|
49
|
+
t('language.name', {
|
|
50
|
+
lng: language,
|
|
51
|
+
}) ||
|
|
52
|
+
language
|
|
53
|
+
}
|
|
54
|
+
/>
|
|
55
|
+
{selectedLanguageCode === language && <Check color="primary" />}
|
|
56
|
+
</SettingsListItemButton>
|
|
57
|
+
))}
|
|
58
|
+
</List>
|
|
59
|
+
</Box>
|
|
47
60
|
</PageContainer>
|
|
48
61
|
)
|
|
49
62
|
}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import type { Route } from '@lifi/sdk'
|
|
2
2
|
import { useAccount } from '@lifi/wallet-management'
|
|
3
|
+
import { Box } from '@mui/material'
|
|
3
4
|
import { useNavigate } from '@tanstack/react-router'
|
|
4
|
-
import { type JSX, useMemo } from 'react'
|
|
5
|
+
import { type JSX, useMemo, useRef } from 'react'
|
|
5
6
|
import { useTranslation } from 'react-i18next'
|
|
7
|
+
import { PageContainer } from '../../components/PageContainer.js'
|
|
6
8
|
import { ProgressToNextUpdate } from '../../components/ProgressToNextUpdate.js'
|
|
7
9
|
import { RouteCard } from '../../components/RouteCard/RouteCard.js'
|
|
8
10
|
import { RouteCardSkeleton } from '../../components/RouteCard/RouteCardSkeleton.js'
|
|
9
11
|
import { RouteNotFoundCard } from '../../components/RouteCard/RouteNotFoundCard.js'
|
|
10
12
|
import { useHeader } from '../../hooks/useHeader.js'
|
|
13
|
+
import { useListHeight } from '../../hooks/useListHeight.js'
|
|
11
14
|
import { useRoutes } from '../../hooks/useRoutes.js'
|
|
12
15
|
import { useToAddressRequirements } from '../../hooks/useToAddressRequirements.js'
|
|
13
16
|
import { useWidgetEvents } from '../../hooks/useWidgetEvents.js'
|
|
@@ -20,6 +23,7 @@ export const RoutesPage = (): JSX.Element => {
|
|
|
20
23
|
const { t } = useTranslation()
|
|
21
24
|
const navigate = useNavigate()
|
|
22
25
|
const emitter = useWidgetEvents()
|
|
26
|
+
const listParentRef = useRef<HTMLDivElement>(null)
|
|
23
27
|
const {
|
|
24
28
|
routes,
|
|
25
29
|
isLoading,
|
|
@@ -50,6 +54,10 @@ export const RoutesPage = (): JSX.Element => {
|
|
|
50
54
|
|
|
51
55
|
useHeader(t('header.receive'), headerAction)
|
|
52
56
|
|
|
57
|
+
const { listHeight } = useListHeight({
|
|
58
|
+
listParentRef,
|
|
59
|
+
})
|
|
60
|
+
|
|
53
61
|
const handleRouteClick = (route: Route) => {
|
|
54
62
|
setReviewableRoute(route)
|
|
55
63
|
navigate({
|
|
@@ -69,31 +77,34 @@ export const RoutesPage = (): JSX.Element => {
|
|
|
69
77
|
const allowInteraction = account.isConnected && !toAddressUnsatisfied
|
|
70
78
|
|
|
71
79
|
return (
|
|
72
|
-
<
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
80
|
+
<PageContainer disableGutters>
|
|
81
|
+
<Box
|
|
82
|
+
className="long-list"
|
|
83
|
+
ref={listParentRef}
|
|
84
|
+
style={{ height: listHeight, overflow: 'auto' }}
|
|
85
|
+
>
|
|
86
|
+
<Stack direction="column" spacing={2} sx={{ pt: 1.5 }}>
|
|
87
|
+
{routeNotFound ? (
|
|
88
|
+
<RouteNotFoundCard />
|
|
89
|
+
) : isLoading && !routes?.length ? (
|
|
90
|
+
Array.from({ length: 3 }).map((_, index) => (
|
|
91
|
+
<RouteCardSkeleton key={index} />
|
|
92
|
+
))
|
|
93
|
+
) : (
|
|
94
|
+
routes?.map((route: Route, index: number) => (
|
|
95
|
+
<RouteCard
|
|
96
|
+
key={index}
|
|
97
|
+
route={route}
|
|
98
|
+
onClick={
|
|
99
|
+
allowInteraction ? () => handleRouteClick(route) : undefined
|
|
100
|
+
}
|
|
101
|
+
active={index === 0}
|
|
102
|
+
expanded={routes?.length === 1}
|
|
103
|
+
/>
|
|
104
|
+
))
|
|
105
|
+
)}
|
|
106
|
+
</Stack>
|
|
107
|
+
</Box>
|
|
108
|
+
</PageContainer>
|
|
98
109
|
)
|
|
99
110
|
}
|