@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.
@@ -1,6 +1,6 @@
1
1
  //#region src/config/version.d.ts
2
2
  declare const name = "@lifi/widget";
3
- declare const version = "4.3.0";
3
+ declare const version = "4.3.1";
4
4
  //#endregion
5
5
  export { name, version };
6
6
  //# sourceMappingURL=version.d.ts.map
@@ -1,6 +1,6 @@
1
1
  //#region src/config/version.ts
2
2
  const name = "@lifi/widget";
3
- const version = "4.3.0";
3
+ const version = "4.3.1";
4
4
  //#endregion
5
5
  export { name, version };
6
6
 
@@ -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.0'\n"],"mappings":";AAAA,MAAa,OAAO;AACpB,MAAa,UAAU"}
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 { List } from "@mui/material";
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(List, {
20
- sx: { padding: 1.5 },
21
- children: availableLanguages.map((language) => /* @__PURE__ */ jsxs(SettingsListItemButton, {
22
- onClick: () => setLanguageWithCode(language),
23
- children: [/* @__PURE__ */ jsx(ListItemText$1, { primary: languageNames[language] || t("language.name", { lng: language }) || language }), selectedLanguageCode === language && /* @__PURE__ */ jsx(Check, { color: "primary" })]
24
- }, language))
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 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 </PageContainer>\n )\n}\n"],"mappings":";;;;;;;;;;;AAUA,MAAa,sBAAgC;CAC3C,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,EAAE,sBAAsB,oBAAoB,wBAChD,aAAa;CAEf,UAAU,EAAE,gBAAgB,CAAC;CAE7B,IAAI,mBAAmB,SAAS,GAC9B,OAAO;CAGT,OACE,oBAAC,eAAD;EAAe,gBAAA;YACb,oBAAC,MAAD;GACE,IAAI,EACF,SAAS,IACX;aAEC,mBAAmB,KAAK,aACvB,qBAAC,wBAAD;IAEE,eAAe,oBAAoB,QAAQ;cAF7C,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;MAbjB,QAaiB,CACzB;EACG,CAAA;CACO,CAAA;AAEnB"}
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 { Stack } from "./RoutesPage.style.js";
13
- import { useMemo } from "react";
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(Stack, {
56
- className: "long-list",
57
- direction: "column",
58
- spacing: 2,
59
- sx: {
60
- flex: 1,
61
- pt: 1.5
62
- },
63
- 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, {
64
- route,
65
- onClick: allowInteraction ? () => handleRouteClick(route) : void 0,
66
- active: index === 0,
67
- expanded: routes?.length === 1
68
- }, index))
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 <Stack\n className=\"long-list\"\n direction=\"column\"\n spacing={2}\n sx={{ flex: 1, pt: 1.5 }}\n >\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 )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAkBA,MAAa,mBAAgC;CAC3C,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,WAAW,YAAY;CAC7B,MAAM,UAAU,gBAAgB;CAChC,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,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,OAAD;EACE,WAAU;EACV,WAAU;EACV,SAAS;EACT,IAAI;GAAE,MAAM;GAAG,IAAI;EAAI;YAEtB,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;GAES;GACP,SACE,yBAAyB,iBAAiB,KAAK,IAAI,KAAA;GAErD,QAAQ,UAAU;GAClB,UAAU,QAAQ,WAAW;EAC9B,GAPM,KAON,CACF;CAEE,CAAA;AAEX"}
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.0",
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",
@@ -1,2 +1,2 @@
1
1
  export const name = '@lifi/widget'
2
- export const version = '4.3.0'
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
- <List
25
- sx={{
26
- padding: 1.5,
27
- }}
31
+ <Box
32
+ className="long-list"
33
+ ref={listParentRef}
34
+ style={{ height: listHeight, overflow: 'auto' }}
28
35
  >
29
- {availableLanguages.map((language) => (
30
- <SettingsListItemButton
31
- key={language}
32
- onClick={() => setLanguageWithCode(language)}
33
- >
34
- <ListItemText
35
- primary={
36
- languageNames[language as keyof typeof languageNames] ||
37
- t('language.name', {
38
- lng: language,
39
- }) ||
40
- language
41
- }
42
- />
43
- {selectedLanguageCode === language && <Check color="primary" />}
44
- </SettingsListItemButton>
45
- ))}
46
- </List>
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
- <Stack
73
- className="long-list"
74
- direction="column"
75
- spacing={2}
76
- sx={{ flex: 1, pt: 1.5 }}
77
- >
78
- {routeNotFound ? (
79
- <RouteNotFoundCard />
80
- ) : isLoading && !routes?.length ? (
81
- Array.from({ length: 3 }).map((_, index) => (
82
- <RouteCardSkeleton key={index} />
83
- ))
84
- ) : (
85
- routes?.map((route: Route, index: number) => (
86
- <RouteCard
87
- key={index}
88
- route={route}
89
- onClick={
90
- allowInteraction ? () => handleRouteClick(route) : undefined
91
- }
92
- active={index === 0}
93
- expanded={routes?.length === 1}
94
- />
95
- ))
96
- )}
97
- </Stack>
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
  }