@lifi/widget 3.9.0 → 3.10.0

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.
Files changed (70) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/esm/components/ChainSelect/useChainSelect.js +9 -3
  3. package/dist/esm/components/ChainSelect/useChainSelect.js.map +1 -1
  4. package/dist/esm/components/Header/CloseDrawerButton.js +4 -3
  5. package/dist/esm/components/Header/CloseDrawerButton.js.map +1 -1
  6. package/dist/esm/components/Header/WalletHeader.js +14 -10
  7. package/dist/esm/components/Header/WalletHeader.js.map +1 -1
  8. package/dist/esm/components/Step/StepTimer.js +13 -6
  9. package/dist/esm/components/Step/StepTimer.js.map +1 -1
  10. package/dist/esm/config/version.d.ts +1 -1
  11. package/dist/esm/config/version.js +1 -1
  12. package/dist/esm/config/version.js.map +1 -1
  13. package/dist/esm/i18n/bn.json +3 -4
  14. package/dist/esm/i18n/de.json +3 -4
  15. package/dist/esm/i18n/es.json +3 -4
  16. package/dist/esm/i18n/fr.json +3 -4
  17. package/dist/esm/i18n/hi.json +3 -4
  18. package/dist/esm/i18n/id.json +3 -4
  19. package/dist/esm/i18n/it.json +3 -4
  20. package/dist/esm/i18n/ja.json +3 -4
  21. package/dist/esm/i18n/ko.json +3 -4
  22. package/dist/esm/i18n/pt.json +3 -4
  23. package/dist/esm/i18n/th.json +3 -4
  24. package/dist/esm/i18n/tr.json +3 -4
  25. package/dist/esm/i18n/uk.json +3 -4
  26. package/dist/esm/i18n/vi.json +3 -4
  27. package/dist/esm/i18n/zh.json +3 -4
  28. package/dist/esm/pages/SendToWallet/ConnectedWalletsPage.js +2 -2
  29. package/dist/esm/pages/SendToWallet/ConnectedWalletsPage.js.map +1 -1
  30. package/dist/esm/pages/SendToWallet/RecentWalletsPage.js +2 -2
  31. package/dist/esm/pages/SendToWallet/RecentWalletsPage.js.map +1 -1
  32. package/dist/esm/providers/WalletProvider/WalletProvider.js +8 -2
  33. package/dist/esm/providers/WalletProvider/WalletProvider.js.map +1 -1
  34. package/dist/esm/providers/WalletProvider/useExternalWalletProvider.d.ts +8 -0
  35. package/dist/esm/providers/WalletProvider/useExternalWalletProvider.js +39 -0
  36. package/dist/esm/providers/WalletProvider/useExternalWalletProvider.js.map +1 -0
  37. package/dist/esm/stores/chains/ChainOrderStore.js +26 -5
  38. package/dist/esm/stores/chains/ChainOrderStore.js.map +1 -1
  39. package/dist/esm/types/widget.d.ts +9 -0
  40. package/package.json +2 -2
  41. package/src/components/ChainSelect/useChainSelect.ts +9 -4
  42. package/src/components/Header/CloseDrawerButton.tsx +4 -3
  43. package/src/components/Header/WalletHeader.tsx +20 -12
  44. package/src/components/Step/StepTimer.tsx +29 -19
  45. package/src/config/version.ts +1 -1
  46. package/src/i18n/bn.json +3 -4
  47. package/src/i18n/de.json +3 -4
  48. package/src/i18n/es.json +3 -4
  49. package/src/i18n/fr.json +3 -4
  50. package/src/i18n/hi.json +3 -4
  51. package/src/i18n/id.json +3 -4
  52. package/src/i18n/it.json +3 -4
  53. package/src/i18n/ja.json +3 -4
  54. package/src/i18n/ko.json +3 -4
  55. package/src/i18n/pt.json +3 -4
  56. package/src/i18n/th.json +3 -4
  57. package/src/i18n/tr.json +3 -4
  58. package/src/i18n/uk.json +3 -4
  59. package/src/i18n/vi.json +3 -4
  60. package/src/i18n/zh.json +3 -4
  61. package/src/pages/SendToWallet/ConnectedWalletsPage.tsx +2 -2
  62. package/src/pages/SendToWallet/RecentWalletsPage.tsx +2 -2
  63. package/src/providers/WalletProvider/WalletProvider.tsx +9 -2
  64. package/src/providers/WalletProvider/useExternalWalletProvider.ts +53 -0
  65. package/src/stores/chains/ChainOrderStore.tsx +28 -5
  66. package/src/types/widget.ts +9 -0
  67. package/dist/esm/providers/WalletProvider/useHasExternalWalletProvider.d.ts +0 -7
  68. package/dist/esm/providers/WalletProvider/useHasExternalWalletProvider.js +0 -28
  69. package/dist/esm/providers/WalletProvider/useHasExternalWalletProvider.js.map +0 -1
  70. package/src/providers/WalletProvider/useHasExternalWalletProvider.ts +0 -36
@@ -4,7 +4,7 @@ import {
4
4
  ContentCopyRounded,
5
5
  MoreHoriz,
6
6
  OpenInNewRounded,
7
- TurnedIn,
7
+ Wallet,
8
8
  } from '@mui/icons-material'
9
9
  import { ListItemAvatar, ListItemText, MenuItem } from '@mui/material'
10
10
  import { useId, useState } from 'react'
@@ -139,7 +139,7 @@ export const ConnectedWalletsPage = () => {
139
139
  )
140
140
  })}
141
141
  {!accounts.length && (
142
- <EmptyListIndicator icon={<TurnedIn sx={{ fontSize: 48 }} />}>
142
+ <EmptyListIndicator icon={<Wallet sx={{ fontSize: 48 }} />}>
143
143
  {t('sendToWallet.noConnectedWallets')}
144
144
  </EmptyListIndicator>
145
145
  )}
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  ContentCopyRounded,
3
3
  DeleteOutline,
4
+ History,
4
5
  MoreHoriz,
5
6
  OpenInNewRounded,
6
7
  TurnedInNot,
7
- Wallet,
8
8
  } from '@mui/icons-material'
9
9
  import { ListItemAvatar, ListItemText, MenuItem } from '@mui/material'
10
10
  import { useId, useRef, useState } from 'react'
@@ -175,7 +175,7 @@ export const RecentWalletsPage = () => {
175
175
  </ListItem>
176
176
  ))}
177
177
  {!recentWallets.length && (
178
- <EmptyListIndicator icon={<Wallet sx={{ fontSize: 48 }} />}>
178
+ <EmptyListIndicator icon={<History sx={{ fontSize: 48 }} />}>
179
179
  {t('sendToWallet.noRecentWallets')}
180
180
  </EmptyListIndicator>
181
181
  )}
@@ -7,6 +7,7 @@ import { EVMProvider } from './EVMProvider.js'
7
7
  import { SDKProviders } from './SDKProviders.js'
8
8
  import { SVMProvider } from './SVMProvider.js'
9
9
  import { UTXOProvider } from './UTXOProvider.js'
10
+ import { useExternalWalletProvider } from './useExternalWalletProvider.js'
10
11
 
11
12
  export const WalletProvider: FC<PropsWithChildren> = ({ children }) => {
12
13
  return (
@@ -24,10 +25,16 @@ export const WalletProvider: FC<PropsWithChildren> = ({ children }) => {
24
25
  export const WalletMenuProvider: FC<PropsWithChildren> = ({ children }) => {
25
26
  const { walletConfig } = useWidgetConfig()
26
27
  const { i18n } = useTranslation()
28
+ const { internalChainTypes } = useExternalWalletProvider()
27
29
 
28
30
  const config: WalletManagementConfig = useMemo(() => {
29
- return { locale: i18n.resolvedLanguage as never, ...walletConfig }
30
- }, [i18n.resolvedLanguage, walletConfig])
31
+ return {
32
+ locale: i18n.resolvedLanguage as never,
33
+ enabledChainTypes: internalChainTypes,
34
+ ...walletConfig,
35
+ }
36
+ }, [i18n.resolvedLanguage, internalChainTypes, walletConfig])
37
+
31
38
  return (
32
39
  <WalletManagementProvider config={config}>
33
40
  {children}
@@ -0,0 +1,53 @@
1
+ import { ChainType } from '@lifi/sdk'
2
+ import { useContext, useMemo } from 'react'
3
+ import { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js'
4
+ import { EVMExternalContext } from './EVMExternalContext.js'
5
+ import { SVMExternalContext } from './SVMExternalContext.js'
6
+ import { UTXOExternalContext } from './UTXOExternalContext.js'
7
+
8
+ interface ExternalWalletProvider {
9
+ useExternalWalletProvidersOnly: boolean
10
+ externalChainTypes: ChainType[]
11
+ internalChainTypes: ChainType[]
12
+ }
13
+
14
+ const internalChainTypes = [ChainType.EVM, ChainType.SVM, ChainType.UTXO]
15
+
16
+ export function useExternalWalletProvider(): ExternalWalletProvider {
17
+ const { walletConfig } = useWidgetConfig()
18
+ const hasExternalEVMContext = useContext(EVMExternalContext)
19
+ const hasExternalSVMContext = useContext(SVMExternalContext)
20
+ const hasExternalUTXOContext = useContext(UTXOExternalContext)
21
+
22
+ const data = useMemo(() => {
23
+ const providers: ChainType[] = []
24
+ if (hasExternalEVMContext) {
25
+ providers.push(ChainType.EVM)
26
+ }
27
+ if (hasExternalSVMContext) {
28
+ providers.push(ChainType.SVM)
29
+ }
30
+ if (hasExternalUTXOContext) {
31
+ providers.push(ChainType.UTXO)
32
+ }
33
+ const hasExternalProvider =
34
+ hasExternalEVMContext || hasExternalSVMContext || hasExternalUTXOContext
35
+
36
+ const useExternalWalletProvidersOnly =
37
+ hasExternalProvider && !walletConfig?.usePartialWalletManagement
38
+ return {
39
+ useExternalWalletProvidersOnly,
40
+ externalChainTypes: providers,
41
+ internalChainTypes: internalChainTypes.filter(
42
+ (chainType) => !providers.includes(chainType)
43
+ ),
44
+ }
45
+ }, [
46
+ hasExternalEVMContext,
47
+ hasExternalSVMContext,
48
+ hasExternalUTXOContext,
49
+ walletConfig?.usePartialWalletManagement,
50
+ ])
51
+
52
+ return data
53
+ }
@@ -2,6 +2,7 @@ import { createContext, useContext, useEffect, useRef } from 'react'
2
2
  import type { StoreApi } from 'zustand'
3
3
  import type { UseBoundStoreWithEqualityFn } from 'zustand/traditional'
4
4
  import { useChains } from '../../hooks/useChains.js'
5
+ import { useExternalWalletProvider } from '../../providers/WalletProvider/useExternalWalletProvider.js'
5
6
  import { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'
6
7
  import { isItemAllowed } from '../../utils/item.js'
7
8
  import type { FormType } from '../form/types.js'
@@ -22,10 +23,12 @@ export function ChainOrderStoreProvider({
22
23
  children,
23
24
  ...props
24
25
  }: PersistStoreProviderProps) {
25
- const { chains: configChains } = useWidgetConfig()
26
+ const { chains: chainsConfig } = useWidgetConfig()
26
27
  const storeRef = useRef<ChainOrderStore>()
27
28
  const { chains } = useChains()
28
29
  const { setFieldValue, getFieldValues } = useFieldActions()
30
+ const { externalChainTypes, useExternalWalletProvidersOnly } =
31
+ useExternalWalletProvider()
29
32
 
30
33
  if (!storeRef.current) {
31
34
  storeRef.current = createChainOrderStore(props)
@@ -34,9 +37,22 @@ export function ChainOrderStoreProvider({
34
37
  useEffect(() => {
35
38
  if (chains) {
36
39
  ;(['from', 'to'] as FormType[]).forEach((key) => {
37
- const filteredChains = configChains?.[key]
38
- ? chains.filter((chain) => isItemAllowed(chain.id, configChains[key]))
39
- : chains
40
+ const configChainIds = chainsConfig?.[key]
41
+ const isFromKey = key === 'from'
42
+
43
+ const filteredChains = chains.filter((chain) => {
44
+ const passesChainsConfigFilter = configChainIds
45
+ ? isItemAllowed(chain.id, configChainIds)
46
+ : true
47
+ // If the integrator uses external wallet management and has not opted in for partial wallet management,
48
+ // restrict the displayed chains to those compatible with external wallet management.
49
+ // This ensures users only see chains for which they can sign transactions.
50
+ const passesWalletConfigFilter = isFromKey
51
+ ? !useExternalWalletProvidersOnly ||
52
+ externalChainTypes.includes(chain.chainType)
53
+ : true
54
+ return passesChainsConfigFilter && passesWalletConfigFilter
55
+ })
40
56
  const chainOrder = storeRef.current?.getState().initializeChains(
41
57
  filteredChains.map((chain) => chain.id),
42
58
  key
@@ -49,7 +65,14 @@ export function ChainOrderStoreProvider({
49
65
  }
50
66
  })
51
67
  }
52
- }, [chains, configChains, getFieldValues, setFieldValue])
68
+ }, [
69
+ chains,
70
+ chainsConfig,
71
+ externalChainTypes,
72
+ getFieldValues,
73
+ setFieldValue,
74
+ useExternalWalletProvidersOnly,
75
+ ])
53
76
 
54
77
  return (
55
78
  <ChainOrderStoreContext.Provider value={storeRef.current}>
@@ -108,6 +108,15 @@ export interface WidgetWalletConfig {
108
108
  walletConnect?: WalletConnectParameters
109
109
  coinbase?: CoinbaseWalletParameters
110
110
  metaMask?: MetaMaskParameters
111
+ /**
112
+ * Determines whether the widget should provide partial wallet management functionality.
113
+ *
114
+ * In partial mode, external wallet management will be used for "opt-out" providers,
115
+ * while the internal management is applied for any remaining providers that do not opt out.
116
+ * This allows a flexible balance between the integrator’s custom wallet menu and the widget’s native wallet menu.
117
+ * @default false
118
+ */
119
+ usePartialWalletManagement?: boolean
111
120
  }
112
121
 
113
122
  export interface WidgetSDKConfig
@@ -1,7 +0,0 @@
1
- import { ChainType } from '@lifi/sdk';
2
- interface ExternalWalletProvider {
3
- hasExternalProvider: boolean;
4
- availableChainTypes: ChainType[];
5
- }
6
- export declare function useHasExternalWalletProvider(): ExternalWalletProvider;
7
- export {};
@@ -1,28 +0,0 @@
1
- import { ChainType } from '@lifi/sdk';
2
- import { useContext, useMemo } from 'react';
3
- import { EVMExternalContext } from './EVMExternalContext.js';
4
- import { SVMExternalContext } from './SVMExternalContext.js';
5
- import { UTXOExternalContext } from './UTXOExternalContext.js';
6
- export function useHasExternalWalletProvider() {
7
- const hasExternalEVMContext = useContext(EVMExternalContext);
8
- const hasExternalSVMContext = useContext(SVMExternalContext);
9
- const hasExternalUTXOContext = useContext(UTXOExternalContext);
10
- const providers = useMemo(() => {
11
- const providers = [];
12
- if (hasExternalEVMContext) {
13
- providers.push(ChainType.EVM);
14
- }
15
- if (hasExternalSVMContext) {
16
- providers.push(ChainType.SVM);
17
- }
18
- if (hasExternalUTXOContext) {
19
- providers.push(ChainType.UTXO);
20
- }
21
- return providers;
22
- }, [hasExternalEVMContext, hasExternalSVMContext, hasExternalUTXOContext]);
23
- return {
24
- hasExternalProvider: hasExternalEVMContext || hasExternalSVMContext || hasExternalUTXOContext,
25
- availableChainTypes: providers,
26
- };
27
- }
28
- //# sourceMappingURL=useHasExternalWalletProvider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useHasExternalWalletProvider.js","sourceRoot":"","sources":["../../../../src/providers/WalletProvider/useHasExternalWalletProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAO9D,MAAM,UAAU,4BAA4B;IAC1C,MAAM,qBAAqB,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAA;IAC5D,MAAM,qBAAqB,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAA;IAC5D,MAAM,sBAAsB,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAA;IAE9D,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE;QAC7B,MAAM,SAAS,GAAgB,EAAE,CAAA;QACjC,IAAI,qBAAqB,EAAE,CAAC;YAC1B,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;QAC/B,CAAC;QACD,IAAI,qBAAqB,EAAE,CAAC;YAC1B,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;QAC/B,CAAC;QACD,IAAI,sBAAsB,EAAE,CAAC;YAC3B,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QAChC,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC,EAAE,CAAC,qBAAqB,EAAE,qBAAqB,EAAE,sBAAsB,CAAC,CAAC,CAAA;IAE1E,OAAO;QACL,mBAAmB,EACjB,qBAAqB,IAAI,qBAAqB,IAAI,sBAAsB;QAC1E,mBAAmB,EAAE,SAAS;KAC/B,CAAA;AACH,CAAC"}
@@ -1,36 +0,0 @@
1
- import { ChainType } from '@lifi/sdk'
2
- import { useContext, useMemo } from 'react'
3
- import { EVMExternalContext } from './EVMExternalContext.js'
4
- import { SVMExternalContext } from './SVMExternalContext.js'
5
- import { UTXOExternalContext } from './UTXOExternalContext.js'
6
-
7
- interface ExternalWalletProvider {
8
- hasExternalProvider: boolean
9
- availableChainTypes: ChainType[]
10
- }
11
-
12
- export function useHasExternalWalletProvider(): ExternalWalletProvider {
13
- const hasExternalEVMContext = useContext(EVMExternalContext)
14
- const hasExternalSVMContext = useContext(SVMExternalContext)
15
- const hasExternalUTXOContext = useContext(UTXOExternalContext)
16
-
17
- const providers = useMemo(() => {
18
- const providers: ChainType[] = []
19
- if (hasExternalEVMContext) {
20
- providers.push(ChainType.EVM)
21
- }
22
- if (hasExternalSVMContext) {
23
- providers.push(ChainType.SVM)
24
- }
25
- if (hasExternalUTXOContext) {
26
- providers.push(ChainType.UTXO)
27
- }
28
- return providers
29
- }, [hasExternalEVMContext, hasExternalSVMContext, hasExternalUTXOContext])
30
-
31
- return {
32
- hasExternalProvider:
33
- hasExternalEVMContext || hasExternalSVMContext || hasExternalUTXOContext,
34
- availableChainTypes: providers,
35
- }
36
- }