@lifi/widget 3.32.1 → 3.33.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 (151) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/esm/AppProvider.js +2 -1
  3. package/dist/esm/AppProvider.js.map +1 -1
  4. package/dist/esm/components/Header/NavigationHeader.js +4 -1
  5. package/dist/esm/components/Header/NavigationHeader.js.map +1 -1
  6. package/dist/esm/components/Tools/Tools.js +1 -1
  7. package/dist/esm/components/Tools/Tools.js.map +1 -1
  8. package/dist/esm/config/constants.d.ts +1 -1
  9. package/dist/esm/config/constants.js +1 -1
  10. package/dist/esm/config/constants.js.map +1 -1
  11. package/dist/esm/config/version.d.ts +1 -1
  12. package/dist/esm/config/version.js +1 -1
  13. package/dist/esm/hooks/useExplorer.js +2 -2
  14. package/dist/esm/hooks/useExplorer.js.map +1 -1
  15. package/dist/esm/hooks/useHeader.js +4 -1
  16. package/dist/esm/hooks/useHeader.js.map +1 -1
  17. package/dist/esm/hooks/useLanguages.d.ts +2 -3
  18. package/dist/esm/hooks/useLanguages.js +50 -14
  19. package/dist/esm/hooks/useLanguages.js.map +1 -1
  20. package/dist/esm/hooks/useRoutes.js +1 -1
  21. package/dist/esm/hooks/useRoutes.js.map +1 -1
  22. package/dist/esm/hooks/useSettingMonitor.js +2 -1
  23. package/dist/esm/hooks/useSettingMonitor.js.map +1 -1
  24. package/dist/esm/hooks/useTokenBalances.js +2 -1
  25. package/dist/esm/hooks/useTokenBalances.js.map +1 -1
  26. package/dist/esm/hooks/useTools.js +2 -1
  27. package/dist/esm/hooks/useTools.js.map +1 -1
  28. package/dist/esm/pages/LanguagesPage.js +6 -1
  29. package/dist/esm/pages/LanguagesPage.js.map +1 -1
  30. package/dist/esm/pages/SelectEnabledToolsPage.js +1 -1
  31. package/dist/esm/pages/SelectEnabledToolsPage.js.map +1 -1
  32. package/dist/esm/pages/SettingsPage/BridgeAndExchangeSettings.js +1 -1
  33. package/dist/esm/pages/SettingsPage/BridgeAndExchangeSettings.js.map +1 -1
  34. package/dist/esm/pages/SettingsPage/LanguageSetting.js +7 -2
  35. package/dist/esm/pages/SettingsPage/LanguageSetting.js.map +1 -1
  36. package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.js +1 -1
  37. package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.js.map +1 -1
  38. package/dist/esm/pages/TransactionDetailsPage/TransactionDetailsPage.js +14 -2
  39. package/dist/esm/pages/TransactionDetailsPage/TransactionDetailsPage.js.map +1 -1
  40. package/dist/esm/pages/TransactionDetailsPage/TransferIdCard.d.ts +2 -1
  41. package/dist/esm/pages/TransactionDetailsPage/TransferIdCard.js +3 -9
  42. package/dist/esm/pages/TransactionDetailsPage/TransferIdCard.js.map +1 -1
  43. package/dist/esm/providers/I18nProvider/I18nProvider.js +47 -41
  44. package/dist/esm/providers/I18nProvider/I18nProvider.js.map +1 -1
  45. package/dist/esm/providers/I18nProvider/constants.d.ts +3 -0
  46. package/dist/esm/providers/I18nProvider/constants.js +39 -0
  47. package/dist/esm/providers/I18nProvider/constants.js.map +1 -0
  48. package/dist/esm/providers/I18nProvider/enResource.d.ts +2 -0
  49. package/dist/esm/providers/I18nProvider/enResource.js +4 -0
  50. package/dist/esm/providers/I18nProvider/enResource.js.map +1 -0
  51. package/dist/esm/providers/I18nProvider/i18n.d.ts +3 -0
  52. package/dist/esm/providers/I18nProvider/i18n.js +19 -0
  53. package/dist/esm/providers/I18nProvider/i18n.js.map +1 -0
  54. package/dist/esm/providers/I18nProvider/types.d.ts +4 -11
  55. package/dist/esm/providers/WalletProvider/SDKProviders.js +1 -1
  56. package/dist/esm/providers/WalletProvider/SDKProviders.js.map +1 -1
  57. package/dist/esm/stores/bookmarks/createBookmarkStore.d.ts +19 -1
  58. package/dist/esm/stores/bookmarks/createBookmarkStore.js +3 -3
  59. package/dist/esm/stores/bookmarks/createBookmarkStore.js.map +1 -1
  60. package/dist/esm/stores/chains/ChainOrderStore.js +3 -1
  61. package/dist/esm/stores/chains/ChainOrderStore.js.map +1 -1
  62. package/dist/esm/stores/chains/createChainOrderStore.d.ts +33 -1
  63. package/dist/esm/stores/chains/createChainOrderStore.js +3 -3
  64. package/dist/esm/stores/chains/createChainOrderStore.js.map +1 -1
  65. package/dist/esm/stores/chains/useChainOrder.js +5 -2
  66. package/dist/esm/stores/chains/useChainOrder.js.map +1 -1
  67. package/dist/esm/stores/form/createFormStore.d.ts +1 -1
  68. package/dist/esm/stores/form/createFormStore.js +3 -3
  69. package/dist/esm/stores/form/createFormStore.js.map +1 -1
  70. package/dist/esm/stores/header/useHeaderStore.js +3 -3
  71. package/dist/esm/stores/header/useHeaderStore.js.map +1 -1
  72. package/dist/esm/stores/routes/createRouteExecutionStore.d.ts +17 -1
  73. package/dist/esm/stores/routes/createRouteExecutionStore.js +3 -3
  74. package/dist/esm/stores/routes/createRouteExecutionStore.js.map +1 -1
  75. package/dist/esm/stores/settings/SettingsStore.d.ts +9 -0
  76. package/dist/esm/stores/settings/SettingsStore.js +24 -0
  77. package/dist/esm/stores/settings/SettingsStore.js.map +1 -0
  78. package/dist/esm/stores/settings/createSettingsStore.d.ts +51 -0
  79. package/dist/esm/stores/settings/{useSettingsStore.js → createSettingsStore.js} +38 -11
  80. package/dist/esm/stores/settings/createSettingsStore.js.map +1 -0
  81. package/dist/esm/stores/settings/types.d.ts +7 -1
  82. package/dist/esm/stores/settings/types.js.map +1 -1
  83. package/dist/esm/stores/settings/useSendToWalletStore.d.ts +1 -1
  84. package/dist/esm/stores/settings/useSendToWalletStore.js +3 -3
  85. package/dist/esm/stores/settings/useSendToWalletStore.js.map +1 -1
  86. package/dist/esm/stores/settings/useSettings.js +1 -1
  87. package/dist/esm/stores/settings/useSettings.js.map +1 -1
  88. package/dist/esm/stores/settings/useSettingsActions.d.ts +1 -0
  89. package/dist/esm/stores/settings/useSettingsActions.js +9 -1
  90. package/dist/esm/stores/settings/useSettingsActions.js.map +1 -1
  91. package/dist/esm/stores/settings/useSplitSubvariantStore.js +3 -3
  92. package/dist/esm/stores/settings/useSplitSubvariantStore.js.map +1 -1
  93. package/dist/esm/stores/settings/utils/getStateValues.js +1 -0
  94. package/dist/esm/stores/settings/utils/getStateValues.js.map +1 -1
  95. package/dist/esm/utils/converters.js +5 -0
  96. package/dist/esm/utils/converters.js.map +1 -1
  97. package/dist/esm/utils/tokenList.d.ts +1 -1
  98. package/dist/esm/utils/tokenList.js +3 -3
  99. package/dist/esm/utils/tokenList.js.map +1 -1
  100. package/package.json +13 -13
  101. package/package.json.tmp +15 -15
  102. package/src/AppProvider.tsx +14 -11
  103. package/src/components/Header/NavigationHeader.tsx +4 -1
  104. package/src/components/Tools/Tools.tsx +1 -1
  105. package/src/config/constants.ts +1 -1
  106. package/src/config/version.ts +1 -1
  107. package/src/hooks/useExplorer.ts +2 -2
  108. package/src/hooks/useHeader.ts +4 -1
  109. package/src/hooks/useLanguages.ts +73 -15
  110. package/src/hooks/useRoutes.ts +1 -1
  111. package/src/hooks/useSettingMonitor.ts +2 -4
  112. package/src/hooks/useTokenBalances.ts +2 -1
  113. package/src/hooks/useTools.ts +3 -1
  114. package/src/pages/LanguagesPage.tsx +10 -1
  115. package/src/pages/SelectEnabledToolsPage.tsx +1 -1
  116. package/src/pages/SettingsPage/BridgeAndExchangeSettings.tsx +1 -1
  117. package/src/pages/SettingsPage/LanguageSetting.tsx +9 -2
  118. package/src/pages/SettingsPage/SlippageSettings/SlippageSettings.tsx +1 -1
  119. package/src/pages/TransactionDetailsPage/TransactionDetailsPage.tsx +25 -5
  120. package/src/pages/TransactionDetailsPage/TransferIdCard.tsx +8 -13
  121. package/src/providers/I18nProvider/I18nProvider.tsx +66 -51
  122. package/src/providers/I18nProvider/constants.ts +41 -0
  123. package/src/providers/I18nProvider/enResource.ts +4 -0
  124. package/src/providers/I18nProvider/i18n.ts +26 -0
  125. package/src/providers/I18nProvider/types.ts +21 -12
  126. package/src/providers/WalletProvider/SDKProviders.tsx +2 -1
  127. package/src/stores/bookmarks/createBookmarkStore.ts +3 -5
  128. package/src/stores/chains/ChainOrderStore.tsx +3 -1
  129. package/src/stores/chains/createChainOrderStore.ts +3 -5
  130. package/src/stores/chains/useChainOrder.ts +10 -2
  131. package/src/stores/form/createFormStore.ts +3 -3
  132. package/src/stores/header/useHeaderStore.tsx +31 -34
  133. package/src/stores/routes/createRouteExecutionStore.ts +3 -5
  134. package/src/stores/settings/SettingsStore.tsx +45 -0
  135. package/src/stores/settings/createSettingsStore.ts +223 -0
  136. package/src/stores/settings/types.ts +8 -1
  137. package/src/stores/settings/useSendToWalletStore.ts +8 -11
  138. package/src/stores/settings/useSettings.ts +1 -1
  139. package/src/stores/settings/useSettingsActions.ts +13 -4
  140. package/src/stores/settings/useSplitSubvariantStore.tsx +9 -12
  141. package/src/stores/settings/utils/getStateValues.ts +1 -0
  142. package/src/themes/types.ts +0 -3
  143. package/src/utils/converters.ts +5 -0
  144. package/src/utils/tokenList.ts +3 -3
  145. package/dist/esm/i18n/index.d.ts +0 -16
  146. package/dist/esm/i18n/index.js +0 -17
  147. package/dist/esm/i18n/index.js.map +0 -1
  148. package/dist/esm/stores/settings/useSettingsStore.d.ts +0 -5
  149. package/dist/esm/stores/settings/useSettingsStore.js.map +0 -1
  150. package/src/i18n/index.ts +0 -17
  151. package/src/stores/settings/useSettingsStore.ts +0 -185
@@ -5,28 +5,21 @@ import { useTranslation } from 'react-i18next'
5
5
  import { Card } from '../../components/Card/Card.js'
6
6
  import { CardIconButton } from '../../components/Card/CardIconButton.js'
7
7
  import { CardTitle } from '../../components/Card/CardTitle.js'
8
- import { useExplorer } from '../../hooks/useExplorer.js'
9
8
 
10
9
  interface TransferIdCardProps {
11
10
  transferId: string
11
+ txLink?: string
12
12
  }
13
13
 
14
- const getTxHash = (transferId: string) =>
15
- transferId.indexOf('_') !== -1
16
- ? transferId.substring(0, transferId.indexOf('_'))
17
- : transferId
18
-
19
- export const TransferIdCard = ({ transferId }: TransferIdCardProps) => {
14
+ export const TransferIdCard = ({ transferId, txLink }: TransferIdCardProps) => {
20
15
  const { t } = useTranslation()
21
- const { getTransactionLink } = useExplorer()
22
16
 
23
17
  const copyTransferId = async () => {
24
18
  await navigator.clipboard.writeText(transferId)
25
19
  }
26
20
 
27
21
  const openTransferIdInExplorer = () => {
28
- const txHash = getTxHash(transferId)
29
- window.open(getTransactionLink({ txHash }), '_blank')
22
+ window.open(txLink, '_blank')
30
23
  }
31
24
 
32
25
  return (
@@ -49,9 +42,11 @@ export const TransferIdCard = ({ transferId }: TransferIdCardProps) => {
49
42
  <CardIconButton size="small" onClick={copyTransferId}>
50
43
  <ContentCopyRounded fontSize="inherit" />
51
44
  </CardIconButton>
52
- <CardIconButton size="small" onClick={openTransferIdInExplorer}>
53
- <OpenInNew fontSize="inherit" />
54
- </CardIconButton>
45
+ {txLink ? (
46
+ <CardIconButton size="small" onClick={openTransferIdInExplorer}>
47
+ <OpenInNew fontSize="inherit" />
48
+ </CardIconButton>
49
+ ) : null}
55
50
  </Box>
56
51
  </Box>
57
52
  <Typography
@@ -1,67 +1,82 @@
1
- import type { i18n } from 'i18next'
2
- import { createInstance } from 'i18next'
3
- import { useMemo } from 'react'
1
+ import { createInstance, type i18n } from 'i18next'
2
+ import { useMemo, useRef } from 'react'
4
3
  import { I18nextProvider } from 'react-i18next'
5
- import * as supportedLanguages from '../../i18n/index.js'
6
4
  import { useSettings } from '../../stores/settings/useSettings.js'
7
5
  import { compactNumberFormatter } from '../../utils/compactNumberFormatter.js'
8
6
  import { currencyExtendedFormatter } from '../../utils/currencyExtendedFormatter.js'
9
- import { deepMerge } from '../../utils/deepMerge.js'
10
- import { getConfigItemSets, isItemAllowedForSets } from '../../utils/item.js'
11
7
  import { percentFormatter } from '../../utils/percentFormatter.js'
12
8
  import { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js'
13
- import type { LanguageKey, LanguageTranslationResources } from './types.js'
9
+ import { allLanguages } from './constants.js'
10
+ import { enResource } from './enResource.js'
11
+ import { mergeWithLanguageResources } from './i18n.js'
12
+ import type { LanguageKey, LanguageResource, PartialResource } from './types.js'
14
13
 
15
14
  export const I18nProvider: React.FC<React.PropsWithChildren> = ({
16
15
  children,
17
16
  }) => {
18
- const { languageResources, languages } = useWidgetConfig()
19
- const { language } = useSettings(['language'])
17
+ const { languages, languageResources } = useWidgetConfig()
18
+ const { language, languageCache } = useSettings(['language', 'languageCache'])
19
+ const i18nInstanceRef = useRef<i18n | null>(null)
20
20
 
21
- const i18n = useMemo(() => {
22
- const languagesConfigSets = getConfigItemSets(
23
- languages,
24
- (languages) => new Set(languages)
25
- )
26
- let resources = (Object.keys(supportedLanguages) as LanguageKey[])
27
- .filter((lng) => isItemAllowedForSets(lng, languagesConfigSets))
28
- .reduce((resources, lng) => {
29
- resources[lng] = {
30
- translation: languageResources?.[lng]
31
- ? (deepMerge(
32
- // biome-ignore lint/performance/noDynamicNamespaceImportAccess: TODO: make it dynamic
33
- supportedLanguages[lng],
34
- languageResources[lng]
35
- ) as LanguageTranslationResources)
36
- : // biome-ignore lint/performance/noDynamicNamespaceImportAccess: TODO: make it dynamic
37
- supportedLanguages[lng],
38
- }
39
- return resources
40
- }, {} as LanguageTranslationResources)
41
-
42
- if (languageResources) {
43
- resources = Object.keys(languageResources).reduce((resources, lng) => {
44
- if (!resources[lng]) {
45
- resources[lng] = {
46
- translation: languageResources[lng as LanguageKey]!,
47
- }
48
- }
49
- return resources
50
- }, resources)
21
+ const i18nInstance = useMemo(() => {
22
+ if (i18nInstanceRef.current) {
23
+ // Update i18n instance with language and language cache updates
24
+ if (language && languageCache && language !== 'en') {
25
+ i18nInstanceRef.current.addResourceBundle(
26
+ language,
27
+ 'translation',
28
+ languageCache,
29
+ true,
30
+ true
31
+ )
32
+ }
33
+ return i18nInstanceRef.current
51
34
  }
52
35
 
36
+ // Custom language resources (of non-default languages) are added statically.
37
+ // If custom language resources extend existing languages, they are merged with dynamically loaded resources.
38
+ const customLanguageKeys = languageResources
39
+ ? Object.keys(languageResources).filter(
40
+ (key: string) => !allLanguages.includes(key as LanguageKey)
41
+ )
42
+ : []
43
+ const initialLanguage = language || languages?.default
53
44
  const i18n = createInstance({
54
- lng: languages?.default || language,
55
- fallbackLng: resources.en
56
- ? 'en'
57
- : languages?.default ||
58
- languages?.allow?.[0] ||
59
- Object.keys(resources)?.[0],
45
+ lng: initialLanguage,
46
+ fallbackLng: 'en',
60
47
  lowerCaseLng: true,
61
- interpolation: {
62
- escapeValue: false,
48
+ interpolation: { escapeValue: false },
49
+ resources: {
50
+ en: {
51
+ translation: mergeWithLanguageResources(
52
+ enResource,
53
+ languageResources?.en
54
+ ),
55
+ },
56
+ ...(initialLanguage &&
57
+ initialLanguage !== 'en' &&
58
+ languageCache && {
59
+ [initialLanguage]: {
60
+ translation: languageCache,
61
+ },
62
+ }),
63
+ // Add non-existing custom language resources
64
+ ...customLanguageKeys.reduce(
65
+ (acc, key) => {
66
+ const customResource = languageResources?.[key as LanguageKey]
67
+ if (customResource) {
68
+ acc[key] = {
69
+ translation: customResource,
70
+ }
71
+ }
72
+ return acc
73
+ },
74
+ {} as Record<
75
+ string,
76
+ { translation: PartialResource<LanguageResource> }
77
+ >
78
+ ),
63
79
  },
64
- resources,
65
80
  detection: {
66
81
  caches: [],
67
82
  },
@@ -73,9 +88,9 @@ export const I18nProvider: React.FC<React.PropsWithChildren> = ({
73
88
  i18n.services.formatter?.addCached('numberExt', compactNumberFormatter)
74
89
  i18n.services.formatter?.addCached('currencyExt', currencyExtendedFormatter)
75
90
  i18n.services.formatter?.addCached('percent', percentFormatter)
76
-
91
+ i18nInstanceRef.current = i18n
77
92
  return i18n
78
- }, [language, languageResources, languages])
93
+ }, [language, languageResources, languages?.default, languageCache])
79
94
 
80
- return <I18nextProvider i18n={i18n as i18n}>{children}</I18nextProvider>
95
+ return <I18nextProvider i18n={i18nInstance}>{children}</I18nextProvider>
81
96
  }
@@ -0,0 +1,41 @@
1
+ import type { LanguageKey } from './types.js'
2
+
3
+ export const allLanguages: LanguageKey[] = [
4
+ 'en',
5
+ 'es',
6
+ 'fr',
7
+ 'de',
8
+ 'it',
9
+ 'pt',
10
+ 'ja',
11
+ 'ko',
12
+ 'zh',
13
+ 'hi',
14
+ 'bn',
15
+ 'th',
16
+ 'vi',
17
+ 'tr',
18
+ 'uk',
19
+ 'id',
20
+ 'pl',
21
+ ]
22
+
23
+ export const languageNames: Record<LanguageKey, string> = {
24
+ en: 'English',
25
+ es: 'Español',
26
+ fr: 'Français',
27
+ de: 'Deutsch',
28
+ it: 'Italiano',
29
+ pt: 'Português',
30
+ ja: '日本語',
31
+ ko: '한국어',
32
+ zh: '中文',
33
+ hi: 'हिन्दी',
34
+ bn: 'বাংলা',
35
+ th: 'ไทย',
36
+ vi: 'Tiếng Việt',
37
+ tr: 'Türkçe',
38
+ uk: 'Українська',
39
+ id: 'Bahasa Indonesia',
40
+ pl: 'Polski',
41
+ }
@@ -0,0 +1,4 @@
1
+ import en from '../../i18n/en.json' with { type: 'json' }
2
+
3
+ // Used as a fallback language resource
4
+ export { en as enResource }
@@ -0,0 +1,26 @@
1
+ import { deepMerge } from '../../utils/deepMerge.js'
2
+ import type { LanguageKey, LanguageResource, PartialResource } from './types.js'
3
+
4
+ // Dynamically import the JSON file for the specified language
5
+ export async function loadLocale(
6
+ lng: LanguageKey,
7
+ customLanguageResource?: PartialResource<LanguageResource>
8
+ ) {
9
+ let languageResource: LanguageResource
10
+ try {
11
+ const languageResourceModule = await import(`../../i18n/${lng}.json`)
12
+ languageResource = languageResourceModule.default as LanguageResource
13
+ } catch {
14
+ languageResource = {} as LanguageResource
15
+ }
16
+ return mergeWithLanguageResources(languageResource, customLanguageResource)
17
+ }
18
+
19
+ export function mergeWithLanguageResources(
20
+ languageResource: LanguageResource,
21
+ customLanguageResource?: PartialResource<LanguageResource>
22
+ ) {
23
+ return customLanguageResource
24
+ ? deepMerge(languageResource, customLanguageResource)
25
+ : languageResource
26
+ }
@@ -1,14 +1,31 @@
1
- import type * as languages from '../../i18n/index.js'
1
+ import type { enResource } from './enResource.js'
2
2
 
3
- type PartialResource<T> = T extends object
3
+ export type PartialResource<T> = T extends object
4
4
  ? {
5
5
  [P in keyof T]?: PartialResource<T[P]>
6
6
  }
7
7
  : T
8
8
 
9
- export type LanguageKey = keyof typeof languages
9
+ export type LanguageKey =
10
+ | 'en'
11
+ | 'es'
12
+ | 'fr'
13
+ | 'de'
14
+ | 'it'
15
+ | 'pt'
16
+ | 'ja'
17
+ | 'ko'
18
+ | 'zh'
19
+ | 'hi'
20
+ | 'bn'
21
+ | 'th'
22
+ | 'vi'
23
+ | 'tr'
24
+ | 'uk'
25
+ | 'id'
26
+ | 'pl'
10
27
 
11
- type LanguageResource = typeof languages.en
28
+ export type LanguageResource = typeof enResource
12
29
 
13
30
  export type LanguageResources =
14
31
  | {
@@ -17,11 +34,3 @@ export type LanguageResources =
17
34
  | {
18
35
  [language: string]: PartialResource<LanguageResource>
19
36
  }
20
-
21
- type LanguageTranslationResource = {
22
- [N in 'translation']: PartialResource<LanguageResource>
23
- }
24
-
25
- export type LanguageTranslationResources = {
26
- [language: string]: LanguageTranslationResource
27
- }
@@ -38,7 +38,8 @@ export const SDKProviders = () => {
38
38
  if (!hasConfiguredEVMProvider) {
39
39
  providers.push(
40
40
  EVM({
41
- getWalletClient: () => getWagmiConnectorClient(wagmiConfig),
41
+ getWalletClient: () =>
42
+ getWagmiConnectorClient(wagmiConfig, { assertChainId: false }),
42
43
  switchChain: async (chainId: number) => {
43
44
  const chain = await switchChain(wagmiConfig, { chainId })
44
45
  return getWagmiConnectorClient(wagmiConfig, { chainId: chain.id })
@@ -1,6 +1,5 @@
1
- import type { StateCreator } from 'zustand'
1
+ import { create } from 'zustand'
2
2
  import { persist } from 'zustand/middleware'
3
- import { createWithEqualityFn } from 'zustand/traditional'
4
3
  import type { ToAddress } from '../../types/widget.js'
5
4
  import type { PersistStoreProps } from '../types.js'
6
5
  import type { BookmarkState } from './types.js'
@@ -14,7 +13,7 @@ export const createBookmarksStore = ({
14
13
  namePrefix,
15
14
  toAddress,
16
15
  }: PersistBookmarkProps) =>
17
- createWithEqualityFn<BookmarkState>(
16
+ create<BookmarkState>()(
18
17
  persist(
19
18
  (set, get) => ({
20
19
  selectedBookmark: toAddress,
@@ -76,6 +75,5 @@ export const createBookmarksStore = ({
76
75
  }
77
76
  },
78
77
  }
79
- ) as StateCreator<BookmarkState, [], [], BookmarkState>,
80
- Object.is
78
+ )
81
79
  )
@@ -64,7 +64,9 @@ export function ChainOrderStoreProvider({
64
64
 
65
65
  // Show "All networks" button if there are multiple networks
66
66
  const showAllNetworks = filteredChains.length > 1
67
- storeRef.current?.getState().setIsAllNetworks(showAllNetworks, key)
67
+ if (!showAllNetworks) {
68
+ storeRef.current?.getState().setIsAllNetworks(false, key)
69
+ }
68
70
  storeRef.current?.getState().setShowAllNetworks(showAllNetworks, key)
69
71
 
70
72
  const [chainValue] = getFieldValues(`${key}Chain`)
@@ -1,6 +1,5 @@
1
- import type { StateCreator } from 'zustand'
1
+ import { create } from 'zustand'
2
2
  import { persist } from 'zustand/middleware'
3
- import { createWithEqualityFn } from 'zustand/traditional'
4
3
  import { widgetEvents } from '../../hooks/useWidgetEvents.js'
5
4
  import { WidgetEvent } from '../../types/events.js'
6
5
  import type { PersistStoreProps } from '../types.js'
@@ -19,7 +18,7 @@ const defaultChainState = {
19
18
  }
20
19
 
21
20
  export const createChainOrderStore = ({ namePrefix }: PersistStoreProps) =>
22
- createWithEqualityFn<ChainOrderState>(
21
+ create<ChainOrderState>()(
23
22
  persist(
24
23
  (set, get) => ({
25
24
  chainOrder: defaultChainState,
@@ -126,6 +125,5 @@ export const createChainOrderStore = ({ namePrefix }: PersistStoreProps) =>
126
125
  pinnedChains: state.pinnedChains,
127
126
  }),
128
127
  }
129
- ) as StateCreator<ChainOrderState, [], [], ChainOrderState>,
130
- Object.is
128
+ )
131
129
  )
@@ -1,3 +1,4 @@
1
+ import { useMemo } from 'react'
1
2
  import type { FormType } from '../form/types.js'
2
3
  import { useChainOrderStore } from './ChainOrderStore.js'
3
4
  import { maxChainsToOrder } from './createChainOrderStore.js'
@@ -5,8 +6,15 @@ import { maxChainsToOrder } from './createChainOrderStore.js'
5
6
  export const useChainOrder = (
6
7
  type: FormType
7
8
  ): [number[], (chainId: number, type: FormType) => void] => {
8
- return useChainOrderStore((state) => [
9
- state.chainOrder[type].slice(0, maxChainsToOrder),
9
+ const [chainOrder, setChain] = useChainOrderStore((state) => [
10
+ state.chainOrder[type],
10
11
  state.setChain,
11
12
  ])
13
+
14
+ const limitedChainOrder = useMemo(
15
+ () => chainOrder.slice(0, maxChainsToOrder),
16
+ [chainOrder]
17
+ )
18
+
19
+ return [limitedChainOrder, setChain]
12
20
  }
@@ -1,4 +1,4 @@
1
- import { createWithEqualityFn } from 'zustand/traditional'
1
+ import { create } from 'zustand'
2
2
 
3
3
  import type {
4
4
  DefaultValues,
@@ -68,7 +68,7 @@ const mergeDefaultFormValues = (
68
68
  )
69
69
 
70
70
  export const createFormStore = (defaultValues?: DefaultValues) =>
71
- createWithEqualityFn<FormValuesState>((set, get) => {
71
+ create<FormValuesState>((set, get) => {
72
72
  const _defaultValues = valuesToFormValues({
73
73
  ...formDefaultValues,
74
74
  ...defaultValues,
@@ -231,4 +231,4 @@ export const createFormStore = (defaultValues?: DefaultValues) =>
231
231
  }))
232
232
  },
233
233
  }
234
- }, Object.is)
234
+ })
@@ -1,6 +1,6 @@
1
1
  import { createContext, useContext, useRef } from 'react'
2
+ import { create } from 'zustand'
2
3
  import { useShallow } from 'zustand/shallow'
3
- import { createWithEqualityFn } from 'zustand/traditional'
4
4
  import type { PersistStoreProviderProps } from '../types.js'
5
5
  import type { HeaderState, HeaderStore } from './types.js'
6
6
 
@@ -55,36 +55,33 @@ export function useSetHeaderHeight() {
55
55
  }
56
56
 
57
57
  const createHeaderStore = () =>
58
- createWithEqualityFn<HeaderState>(
59
- (set, get) => ({
60
- headerHeight: 108, // a basic default height
61
- setAction: (element) => {
62
- set(() => ({
63
- element,
64
- }))
65
- return get().removeAction
66
- },
67
- setTitle: (title) => {
68
- set(() => ({
69
- title,
70
- }))
71
- return get().removeTitle
72
- },
73
- removeAction: () => {
74
- set(() => ({
75
- element: null,
76
- }))
77
- },
78
- removeTitle: () => {
79
- set(() => ({
80
- title: undefined,
81
- }))
82
- },
83
- setHeaderHeight: (headerHeight) => {
84
- set(() => ({
85
- headerHeight,
86
- }))
87
- },
88
- }),
89
- Object.is
90
- )
58
+ create<HeaderState>((set, get) => ({
59
+ headerHeight: 108, // a basic default height
60
+ setAction: (element) => {
61
+ set(() => ({
62
+ element,
63
+ }))
64
+ return get().removeAction
65
+ },
66
+ setTitle: (title) => {
67
+ set(() => ({
68
+ title,
69
+ }))
70
+ return get().removeTitle
71
+ },
72
+ removeAction: () => {
73
+ set(() => ({
74
+ element: null,
75
+ }))
76
+ },
77
+ removeTitle: () => {
78
+ set(() => ({
79
+ title: undefined,
80
+ }))
81
+ },
82
+ setHeaderHeight: (headerHeight) => {
83
+ set(() => ({
84
+ headerHeight,
85
+ }))
86
+ },
87
+ }))
@@ -1,7 +1,6 @@
1
1
  import type { Route, RouteExtended } from '@lifi/sdk'
2
- import type { StateCreator } from 'zustand'
2
+ import { create } from 'zustand'
3
3
  import { persist } from 'zustand/middleware'
4
- import { createWithEqualityFn } from 'zustand/traditional'
5
4
  import { hasEnumFlag } from '../../utils/enum.js'
6
5
  import type { PersistStoreProps } from '../types.js'
7
6
  import type { RouteExecutionState } from './types.js'
@@ -14,7 +13,7 @@ import {
14
13
  } from './utils.js'
15
14
 
16
15
  export const createRouteExecutionStore = ({ namePrefix }: PersistStoreProps) =>
17
- createWithEqualityFn<RouteExecutionState>(
16
+ create<RouteExecutionState>()(
18
17
  persist(
19
18
  (set, get) => ({
20
19
  routes: {},
@@ -150,6 +149,5 @@ export const createRouteExecutionStore = ({ namePrefix }: PersistStoreProps) =>
150
149
  return state
151
150
  },
152
151
  }
153
- ) as StateCreator<RouteExecutionState, [], [], RouteExecutionState>,
154
- Object.is
152
+ )
155
153
  )
@@ -0,0 +1,45 @@
1
+ import {
2
+ createContext,
3
+ type PropsWithChildren,
4
+ useContext,
5
+ useRef,
6
+ } from 'react'
7
+ import type { StoreApi } from 'zustand'
8
+ import { useShallow } from 'zustand/shallow'
9
+ import type { UseBoundStoreWithEqualityFn } from 'zustand/traditional'
10
+ import { createSettingsStore } from './createSettingsStore.js'
11
+ import type { SettingsState, SettingsStoreProviderProps } from './types.js'
12
+
13
+ type SettingsStore = UseBoundStoreWithEqualityFn<StoreApi<SettingsState>>
14
+
15
+ const SettingsStoreContext = createContext<SettingsStore | null>(null)
16
+
17
+ export const SettingsStoreProvider = ({
18
+ children,
19
+ config,
20
+ }: PropsWithChildren<SettingsStoreProviderProps>) => {
21
+ const storeRef = useRef<SettingsStore>(null)
22
+ if (!storeRef.current) {
23
+ storeRef.current = createSettingsStore(config)
24
+ }
25
+ return (
26
+ <SettingsStoreContext.Provider value={storeRef.current}>
27
+ {children}
28
+ </SettingsStoreContext.Provider>
29
+ )
30
+ }
31
+
32
+ export function useSettingsStoreContext() {
33
+ const useStore = useContext(SettingsStoreContext)
34
+ if (!useStore) {
35
+ throw new Error(
36
+ 'You forgot to wrap your component in SettingsStoreContext.'
37
+ )
38
+ }
39
+ return useStore
40
+ }
41
+
42
+ export function useSettingsStore<T>(selector: (state: SettingsState) => T): T {
43
+ const useStore = useSettingsStoreContext()
44
+ return useStore(useShallow(selector))
45
+ }