@lifi/widget 3.8.2 → 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.
- package/CHANGELOG.md +27 -0
- package/dist/esm/components/ChainSelect/useChainSelect.js +9 -3
- package/dist/esm/components/ChainSelect/useChainSelect.js.map +1 -1
- package/dist/esm/components/Header/CloseDrawerButton.js +4 -3
- package/dist/esm/components/Header/CloseDrawerButton.js.map +1 -1
- package/dist/esm/components/Header/WalletHeader.js +23 -13
- package/dist/esm/components/Header/WalletHeader.js.map +1 -1
- package/dist/esm/components/ReverseTokensButton/ReverseTokensButton.js +16 -1
- package/dist/esm/components/ReverseTokensButton/ReverseTokensButton.js.map +1 -1
- package/dist/esm/components/Step/StepTimer.js +13 -6
- package/dist/esm/components/Step/StepTimer.js.map +1 -1
- package/dist/esm/components/TokenList/TokenList.js +6 -4
- package/dist/esm/components/TokenList/TokenList.js.map +1 -1
- package/dist/esm/components/TokenList/TokenListItem.js +1 -1
- package/dist/esm/components/TokenList/TokenListItem.js.map +1 -1
- package/dist/esm/components/TokenList/types.d.ts +2 -2
- package/dist/esm/components/TokenList/useTokenSelect.d.ts +4 -0
- package/dist/esm/components/TokenList/useTokenSelect.js +19 -10
- package/dist/esm/components/TokenList/useTokenSelect.js.map +1 -1
- 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/hooks/useAvailableChains.d.ts +2 -1
- package/dist/esm/hooks/useAvailableChains.js.map +1 -1
- package/dist/esm/hooks/useChain.d.ts +1 -0
- package/dist/esm/hooks/useChain.js +1 -0
- package/dist/esm/hooks/useChain.js.map +1 -1
- package/dist/esm/hooks/useChains.d.ts +1 -1
- package/dist/esm/hooks/useGasSufficiency.d.ts +1 -1
- package/dist/esm/hooks/useGasSufficiency.js +2 -12
- package/dist/esm/hooks/useGasSufficiency.js.map +1 -1
- package/dist/esm/hooks/useIsContractAddress.d.ts +2 -0
- package/dist/esm/hooks/useIsContractAddress.js +16 -0
- package/dist/esm/hooks/useIsContractAddress.js.map +1 -0
- package/dist/esm/hooks/useToAddressAutoPopulate.d.ts +12 -0
- package/dist/esm/hooks/useToAddressAutoPopulate.js +68 -0
- package/dist/esm/hooks/useToAddressAutoPopulate.js.map +1 -0
- package/dist/esm/hooks/useToAddressRequirements.d.ts +1 -1
- package/dist/esm/hooks/useToAddressRequirements.js +9 -1
- package/dist/esm/hooks/useToAddressRequirements.js.map +1 -1
- package/dist/esm/hooks/useToAddressReset.js +15 -8
- package/dist/esm/hooks/useToAddressReset.js.map +1 -1
- package/dist/esm/i18n/bn.json +3 -4
- package/dist/esm/i18n/de.json +3 -4
- package/dist/esm/i18n/es.json +3 -4
- package/dist/esm/i18n/fr.json +3 -4
- package/dist/esm/i18n/hi.json +3 -4
- package/dist/esm/i18n/id.json +3 -4
- package/dist/esm/i18n/it.json +3 -4
- package/dist/esm/i18n/ja.json +3 -4
- package/dist/esm/i18n/ko.json +3 -4
- package/dist/esm/i18n/pt.json +3 -4
- package/dist/esm/i18n/th.json +3 -4
- package/dist/esm/i18n/tr.json +3 -4
- package/dist/esm/i18n/uk.json +3 -4
- package/dist/esm/i18n/vi.json +3 -4
- package/dist/esm/i18n/zh.json +3 -4
- package/dist/esm/pages/SendToWallet/BookmarksPage.js +1 -0
- package/dist/esm/pages/SendToWallet/BookmarksPage.js.map +1 -1
- package/dist/esm/pages/SendToWallet/ConfirmAddressSheet.js +1 -0
- package/dist/esm/pages/SendToWallet/ConfirmAddressSheet.js.map +1 -1
- package/dist/esm/pages/SendToWallet/ConnectedWalletsPage.js +3 -2
- package/dist/esm/pages/SendToWallet/ConnectedWalletsPage.js.map +1 -1
- package/dist/esm/pages/SendToWallet/RecentWalletsPage.js +3 -2
- package/dist/esm/pages/SendToWallet/RecentWalletsPage.js.map +1 -1
- package/dist/esm/pages/SendToWallet/SendToConfiguredWalletPage.js +4 -1
- package/dist/esm/pages/SendToWallet/SendToConfiguredWalletPage.js.map +1 -1
- package/dist/esm/providers/WalletProvider/WalletProvider.js +8 -2
- package/dist/esm/providers/WalletProvider/WalletProvider.js.map +1 -1
- package/dist/esm/providers/WalletProvider/useExternalWalletProvider.d.ts +8 -0
- package/dist/esm/providers/WalletProvider/useExternalWalletProvider.js +39 -0
- package/dist/esm/providers/WalletProvider/useExternalWalletProvider.js.map +1 -0
- package/dist/esm/stores/chains/ChainOrderStore.js +26 -5
- package/dist/esm/stores/chains/ChainOrderStore.js.map +1 -1
- package/dist/esm/stores/form/createFormStore.js +1 -0
- package/dist/esm/stores/form/createFormStore.js.map +1 -1
- package/dist/esm/stores/form/types.d.ts +1 -0
- package/dist/esm/stores/form/types.js.map +1 -1
- package/dist/esm/stores/form/useFieldActions.d.ts +1 -0
- package/dist/esm/stores/form/useFieldActions.js +1 -0
- package/dist/esm/stores/form/useFieldActions.js.map +1 -1
- package/dist/esm/types/widget.d.ts +9 -0
- package/package.json +8 -8
- package/src/components/ChainSelect/useChainSelect.ts +9 -4
- package/src/components/Header/CloseDrawerButton.tsx +4 -3
- package/src/components/Header/WalletHeader.tsx +34 -17
- package/src/components/ReverseTokensButton/ReverseTokensButton.tsx +25 -6
- package/src/components/Step/StepTimer.tsx +29 -19
- package/src/components/TokenList/TokenList.tsx +7 -4
- package/src/components/TokenList/TokenListItem.tsx +1 -1
- package/src/components/TokenList/types.ts +2 -2
- package/src/components/TokenList/useTokenSelect.ts +39 -16
- package/src/config/version.ts +1 -1
- package/src/hooks/useAvailableChains.ts +6 -1
- package/src/hooks/useChain.ts +1 -0
- package/src/hooks/useGasSufficiency.ts +7 -19
- package/src/hooks/useIsContractAddress.ts +21 -0
- package/src/hooks/useToAddressAutoPopulate.ts +95 -0
- package/src/hooks/useToAddressRequirements.ts +13 -2
- package/src/hooks/useToAddressReset.ts +15 -8
- package/src/i18n/bn.json +3 -4
- package/src/i18n/de.json +3 -4
- package/src/i18n/es.json +3 -4
- package/src/i18n/fr.json +3 -4
- package/src/i18n/hi.json +3 -4
- package/src/i18n/id.json +3 -4
- package/src/i18n/it.json +3 -4
- package/src/i18n/ja.json +3 -4
- package/src/i18n/ko.json +3 -4
- package/src/i18n/pt.json +3 -4
- package/src/i18n/th.json +3 -4
- package/src/i18n/tr.json +3 -4
- package/src/i18n/uk.json +3 -4
- package/src/i18n/vi.json +3 -4
- package/src/i18n/zh.json +3 -4
- package/src/pages/SendToWallet/BookmarksPage.tsx +1 -0
- package/src/pages/SendToWallet/ConfirmAddressSheet.tsx +1 -0
- package/src/pages/SendToWallet/ConnectedWalletsPage.tsx +3 -2
- package/src/pages/SendToWallet/RecentWalletsPage.tsx +3 -2
- package/src/pages/SendToWallet/SendToConfiguredWalletPage.tsx +4 -1
- package/src/providers/WalletProvider/WalletProvider.tsx +9 -2
- package/src/providers/WalletProvider/useExternalWalletProvider.ts +53 -0
- package/src/stores/chains/ChainOrderStore.tsx +28 -5
- package/src/stores/form/createFormStore.ts +2 -0
- package/src/stores/form/types.ts +1 -0
- package/src/stores/form/useFieldActions.ts +1 -0
- package/src/stores/header/useHeaderStore.tsx +1 -1
- package/src/types/widget.ts +9 -0
- package/dist/esm/providers/WalletProvider/useHasExternalWalletProvider.d.ts +0 -7
- package/dist/esm/providers/WalletProvider/useHasExternalWalletProvider.js +0 -28
- package/dist/esm/providers/WalletProvider/useHasExternalWalletProvider.js.map +0 -1
- package/src/providers/WalletProvider/useHasExternalWalletProvider.ts +0 -36
package/src/i18n/uk.json
CHANGED
|
@@ -16,10 +16,10 @@
|
|
|
16
16
|
"bridgeReview": "Переглянути бридж",
|
|
17
17
|
"buy": "Придбати",
|
|
18
18
|
"cancel": "Скасувати",
|
|
19
|
-
"changeWallet": "Змінити гаманець",
|
|
20
19
|
"checkoutReview": "Перегляд покупки",
|
|
21
20
|
"close": "Закрити",
|
|
22
21
|
"confirm": "Підтвердити",
|
|
22
|
+
"connectAnotherWallet": "Під'єднати інший гаманець",
|
|
23
23
|
"connectWallet": "Під'єднати гаманець",
|
|
24
24
|
"contactSupport": "Служба підтримки",
|
|
25
25
|
"continue": "Продовжити",
|
|
@@ -142,6 +142,7 @@
|
|
|
142
142
|
"signatureRejected": "Для завершення транзакції потрібен ваш підпис. {{amount, number(maximumFractionDigits: 9)}} {{tokenSymbol}} на {{chainName}} залишаються у вашому гаманці.",
|
|
143
143
|
"slippageThreshold": "Прослизання перевищує визначений поріг. Будь ласка, зробіть запит на новий маршрут, щоб отримати нову пропозицію.",
|
|
144
144
|
"transactionCanceled": "Транзакцію скасовано.",
|
|
145
|
+
"transactionConflict": "Неможливо обробити транзакцію, оскільки вона конфліктує з іншою очікуваною транзакцією за допомогою тих же коштів. Дочекайтеся підтвердження транзакції або перевірте історію транзакцій, перш ніж спробувати ще раз.",
|
|
145
146
|
"transactionExpired": "Висота блоку перевищила максимально дозволену межу або хеш блоку вже не достатньо свіжий.",
|
|
146
147
|
"transactionFailed": "Будь ласка, перевірте провідник блоків для отримання додаткової інформації.",
|
|
147
148
|
"transactionNotSent": "Транзакція не була надіслана.",
|
|
@@ -161,6 +162,7 @@
|
|
|
161
162
|
"signatureRejected": "Підпис обов'язковий",
|
|
162
163
|
"slippageNotMet": "Не виконані умови прослизання",
|
|
163
164
|
"transactionCanceled": "Транзакцію скасовано",
|
|
165
|
+
"transactionConflict": "Конфлікт між транзакціями",
|
|
164
166
|
"transactionExpired": "Транзакція прострочена",
|
|
165
167
|
"transactionFailed": "Транзакція не вдалася.",
|
|
166
168
|
"transactionSimulationFailed": "Збій симуляції транзакції",
|
|
@@ -309,8 +311,5 @@
|
|
|
309
311
|
"noBookmarkedWallets": "Немає гаманців в закладках",
|
|
310
312
|
"noConnectedWallets": "Немає підключених гаманців",
|
|
311
313
|
"noRecentWallets": "Немає недавніх гаманців"
|
|
312
|
-
},
|
|
313
|
-
"wallet": {
|
|
314
|
-
"extensionNotFound": "Перш ніж вибрати цей гаманець, переконайтеся, що в браузері активне лише розширення {{name}}."
|
|
315
314
|
}
|
|
316
315
|
}
|
package/src/i18n/vi.json
CHANGED
|
@@ -16,10 +16,10 @@
|
|
|
16
16
|
"bridgeReview": "",
|
|
17
17
|
"buy": "Mua",
|
|
18
18
|
"cancel": "Huỷ bỏ",
|
|
19
|
-
"changeWallet": "Thay đổi ví",
|
|
20
19
|
"checkoutReview": "",
|
|
21
20
|
"close": "Đóng",
|
|
22
21
|
"confirm": "Xác nhận",
|
|
22
|
+
"connectAnotherWallet": "",
|
|
23
23
|
"connectWallet": "Kết nối ví",
|
|
24
24
|
"contactSupport": "Liên hệ hỗ trợ",
|
|
25
25
|
"continue": "Tiếp tục",
|
|
@@ -142,6 +142,7 @@
|
|
|
142
142
|
"signatureRejected": "Cần có chữ ký để hoàn tất giao dịch. {{amount, number(maximumFractionDigits: 9)}} {{tokenSymbol}} tại {{chainName}} vẫn còn trong ví của bạn.",
|
|
143
143
|
"slippageThreshold": "Độ trượt giá lớn hơn ngưỡng xác định. Vui lòng yêu cầu một tuyến đường mới để nhận báo giá mới.",
|
|
144
144
|
"transactionCanceled": "Giao dịch đã bị huỷ.",
|
|
145
|
+
"transactionConflict": "",
|
|
145
146
|
"transactionExpired": "",
|
|
146
147
|
"transactionFailed": "Vui lòng kiểm tra block explorer để biết thêm thông tin.",
|
|
147
148
|
"transactionNotSent": "Giao dịch không được gửi.",
|
|
@@ -161,6 +162,7 @@
|
|
|
161
162
|
"signatureRejected": "Yêu cầu chữ ký",
|
|
162
163
|
"slippageNotMet": "Điều kiện trượt giá không được đáp ứng",
|
|
163
164
|
"transactionCanceled": "Giao dịch bị huỷ",
|
|
165
|
+
"transactionConflict": "",
|
|
164
166
|
"transactionExpired": "",
|
|
165
167
|
"transactionFailed": "Giao dịch không thành công",
|
|
166
168
|
"transactionSimulationFailed": "",
|
|
@@ -309,8 +311,5 @@
|
|
|
309
311
|
"noBookmarkedWallets": "Không có ví được đánh dấu",
|
|
310
312
|
"noConnectedWallets": "Không có ví được kết nối",
|
|
311
313
|
"noRecentWallets": "Không có ví gần đây"
|
|
312
|
-
},
|
|
313
|
-
"wallet": {
|
|
314
|
-
"extensionNotFound": "Chắc chắn rằng tiện ích trên trình duyệt {{name}} đã được kích hoạt tước khi chọn ví này."
|
|
315
314
|
}
|
|
316
315
|
}
|
package/src/i18n/zh.json
CHANGED
|
@@ -16,10 +16,10 @@
|
|
|
16
16
|
"bridgeReview": "",
|
|
17
17
|
"buy": "购买",
|
|
18
18
|
"cancel": "取消",
|
|
19
|
-
"changeWallet": "更换钱包",
|
|
20
19
|
"checkoutReview": "",
|
|
21
20
|
"close": "关闭",
|
|
22
21
|
"confirm": "确认",
|
|
22
|
+
"connectAnotherWallet": "",
|
|
23
23
|
"connectWallet": "关联钱包",
|
|
24
24
|
"contactSupport": "联系技术支持",
|
|
25
25
|
"continue": "继续",
|
|
@@ -142,6 +142,7 @@
|
|
|
142
142
|
"signatureRejected": "需要您签名来完成此次交易。不用担心,{{chainName}} 链上 {{amount, number(maximumFractionDigits: 9)}} 个 {{tokenSymbol}} 仍在您的钱包里。",
|
|
143
143
|
"slippageThreshold": "滑点大于预设值,请选择其他路由并获取新的价格。",
|
|
144
144
|
"transactionCanceled": "交易已被取消。",
|
|
145
|
+
"transactionConflict": "",
|
|
145
146
|
"transactionExpired": "",
|
|
146
147
|
"transactionFailed": "请查看区块浏览器以了解更多信息。",
|
|
147
148
|
"transactionNotSent": "交易未能发送。",
|
|
@@ -161,6 +162,7 @@
|
|
|
161
162
|
"signatureRejected": "交易需要签名。",
|
|
162
163
|
"slippageNotMet": "滑点未满足",
|
|
163
164
|
"transactionCanceled": "交易取消",
|
|
165
|
+
"transactionConflict": "",
|
|
164
166
|
"transactionExpired": "",
|
|
165
167
|
"transactionFailed": "交易失败",
|
|
166
168
|
"transactionSimulationFailed": "",
|
|
@@ -309,8 +311,5 @@
|
|
|
309
311
|
"noBookmarkedWallets": "没有收藏的钱包",
|
|
310
312
|
"noConnectedWallets": "没有已连接的钱包",
|
|
311
313
|
"noRecentWallets": "没有最近使用的钱包"
|
|
312
|
-
},
|
|
313
|
-
"wallet": {
|
|
314
|
-
"extensionNotFound": "在选择钱包之前,请确保只有{{name}} 浏览器的扩展应用处于激活状态。"
|
|
315
314
|
}
|
|
316
315
|
}
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
ContentCopyRounded,
|
|
5
5
|
MoreHoriz,
|
|
6
6
|
OpenInNewRounded,
|
|
7
|
-
|
|
7
|
+
Wallet,
|
|
8
8
|
} from '@mui/icons-material'
|
|
9
9
|
import { ListItemAvatar, ListItemText, MenuItem } from '@mui/material'
|
|
10
10
|
import { useId, useState } from 'react'
|
|
@@ -47,6 +47,7 @@ export const ConnectedWalletsPage = () => {
|
|
|
47
47
|
const handleWalletSelected = (account: Account) => {
|
|
48
48
|
setFieldValue('toAddress', account.address!, {
|
|
49
49
|
isTouched: true,
|
|
50
|
+
isDirty: true,
|
|
50
51
|
})
|
|
51
52
|
setSelectedBookmark({
|
|
52
53
|
name: account.connector?.name,
|
|
@@ -138,7 +139,7 @@ export const ConnectedWalletsPage = () => {
|
|
|
138
139
|
)
|
|
139
140
|
})}
|
|
140
141
|
{!accounts.length && (
|
|
141
|
-
<EmptyListIndicator icon={<
|
|
142
|
+
<EmptyListIndicator icon={<Wallet sx={{ fontSize: 48 }} />}>
|
|
142
143
|
{t('sendToWallet.noConnectedWallets')}
|
|
143
144
|
</EmptyListIndicator>
|
|
144
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'
|
|
@@ -60,6 +60,7 @@ export const RecentWalletsPage = () => {
|
|
|
60
60
|
addRecentWallet(recentWallet)
|
|
61
61
|
setFieldValue('toAddress', recentWallet.address, {
|
|
62
62
|
isTouched: true,
|
|
63
|
+
isDirty: true,
|
|
63
64
|
})
|
|
64
65
|
setSelectedBookmark(recentWallet)
|
|
65
66
|
setSendToWallet(true)
|
|
@@ -174,7 +175,7 @@ export const RecentWalletsPage = () => {
|
|
|
174
175
|
</ListItem>
|
|
175
176
|
))}
|
|
176
177
|
{!recentWallets.length && (
|
|
177
|
-
<EmptyListIndicator icon={<
|
|
178
|
+
<EmptyListIndicator icon={<History sx={{ fontSize: 48 }} />}>
|
|
178
179
|
{t('sendToWallet.noRecentWallets')}
|
|
179
180
|
</EmptyListIndicator>
|
|
180
181
|
)}
|
|
@@ -43,7 +43,10 @@ export const SendToConfiguredWalletPage = () => {
|
|
|
43
43
|
|
|
44
44
|
const handleCuratedSelected = (toAddress: ToAddress) => {
|
|
45
45
|
setSelectedBookmark(toAddress)
|
|
46
|
-
setFieldValue('toAddress', toAddress.address, {
|
|
46
|
+
setFieldValue('toAddress', toAddress.address, {
|
|
47
|
+
isTouched: true,
|
|
48
|
+
isDirty: true,
|
|
49
|
+
})
|
|
47
50
|
navigateBack()
|
|
48
51
|
}
|
|
49
52
|
|
|
@@ -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 {
|
|
30
|
-
|
|
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:
|
|
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
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
}, [
|
|
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}>
|
|
@@ -102,6 +102,8 @@ export const createFormStore = (defaultValues?: DefaultValues) =>
|
|
|
102
102
|
},
|
|
103
103
|
isTouched: (fieldName: FormFieldNames) =>
|
|
104
104
|
!!get().userValues[fieldName]?.isTouched,
|
|
105
|
+
isDirty: (fieldName: FormFieldNames) =>
|
|
106
|
+
!!get().userValues[fieldName]?.isDirty,
|
|
105
107
|
setAsTouched: (fieldName: FormFieldNames) => {
|
|
106
108
|
const userValues = {
|
|
107
109
|
...get().userValues,
|
package/src/stores/form/types.ts
CHANGED
|
@@ -70,6 +70,7 @@ export interface FormActions {
|
|
|
70
70
|
setDefaultValues: (formValues: DefaultValues) => void
|
|
71
71
|
setUserAndDefaultValues: (formValues: Partial<DefaultValues>) => void
|
|
72
72
|
isTouched: (fieldName: FormFieldNames) => boolean
|
|
73
|
+
isDirty: (fieldName: FormFieldNames) => boolean
|
|
73
74
|
setAsTouched: (fieldName: FormFieldNames) => void
|
|
74
75
|
resetField: (fieldName: FormFieldNames, resetOptions?: ResetOptions) => void
|
|
75
76
|
setFieldValue: (
|
|
@@ -18,6 +18,7 @@ export const useFieldActions = () => {
|
|
|
18
18
|
(store) => ({
|
|
19
19
|
getFieldValues: store.getFieldValues,
|
|
20
20
|
isTouched: store.isTouched,
|
|
21
|
+
isDirty: store.isDirty,
|
|
21
22
|
resetField: store.resetField,
|
|
22
23
|
setAsTouched: store.setAsTouched,
|
|
23
24
|
setDefaultValues: store.setDefaultValues,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createContext, useContext, useRef } from 'react'
|
|
2
2
|
import { shallow } from 'zustand/shallow'
|
|
3
3
|
import { createWithEqualityFn } from 'zustand/traditional'
|
|
4
|
-
import type {
|
|
4
|
+
import type { PersistStoreProviderProps } from '../types.js'
|
|
5
5
|
import type { HeaderState, HeaderStore } from './types.js'
|
|
6
6
|
|
|
7
7
|
export const HeaderStoreContext = createContext<HeaderStore | null>(null)
|
package/src/types/widget.ts
CHANGED
|
@@ -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,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
|
-
}
|