@kodiak-finance/orderly-ui-chain-selector 2.8.18 → 2.8.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +321 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +319 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +7 -7
package/dist/index.js
CHANGED
|
@@ -7,10 +7,327 @@ var orderlyReactApp = require('@kodiak-finance/orderly-react-app');
|
|
|
7
7
|
var orderlyI18n = require('@kodiak-finance/orderly-i18n');
|
|
8
8
|
var jsxRuntime = require('react/jsx-runtime');
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
// src/chainSelector.widget.tsx
|
|
11
|
+
var KEY = "orderly_selected_chains";
|
|
12
|
+
var MAX_RECENT_CHAINS = 6;
|
|
13
|
+
var useChainSelectorScript = (options) => {
|
|
14
|
+
const { networkId, bridgeLessOnly } = options || {};
|
|
15
|
+
const { setStorageChain } = orderlyHooks.useStorageChain();
|
|
16
|
+
const config = orderlyHooks.useConfig();
|
|
17
|
+
const [_chains, { checkChainSupport }] = orderlyHooks.useChains();
|
|
18
|
+
const { setChain, connectedChain } = orderlyHooks.useWalletConnector();
|
|
19
|
+
const { onChainChanged, currentChainId, setCurrentChainId, wrongNetwork } = orderlyReactApp.useAppContext();
|
|
20
|
+
const [selectChainId, setSelectChainId] = react.useState(
|
|
21
|
+
currentChainId
|
|
22
|
+
);
|
|
23
|
+
const { getComponentTheme } = orderlyUi.useOrderlyTheme();
|
|
24
|
+
const chains = react.useMemo(() => {
|
|
25
|
+
const bridgeLessChains = bridgeLessOnly ? _chains.mainnet.filter((chain) => chain.network_infos.bridgeless) : _chains.mainnet;
|
|
26
|
+
return {
|
|
27
|
+
mainnet: bridgeLessChains.map((chain) => ({
|
|
28
|
+
name: chain.network_infos.name,
|
|
29
|
+
id: chain.network_infos.chain_id,
|
|
30
|
+
lowestFee: chain.network_infos.bridgeless,
|
|
31
|
+
isTestnet: false
|
|
32
|
+
})),
|
|
33
|
+
testnet: _chains.testnet.map((chain) => ({
|
|
34
|
+
name: chain.network_infos.name,
|
|
35
|
+
id: chain.network_infos.chain_id,
|
|
36
|
+
lowestFee: chain.network_infos.bridgeless,
|
|
37
|
+
isTestnet: true
|
|
38
|
+
}))
|
|
39
|
+
};
|
|
40
|
+
}, [_chains, bridgeLessOnly]);
|
|
41
|
+
const showTestnet = react.useMemo(() => {
|
|
42
|
+
const chainSelectorOverrides = getComponentTheme("chainSelector", {
|
|
43
|
+
showTestnet: true
|
|
44
|
+
});
|
|
45
|
+
if (chainSelectorOverrides.showTestnet === false || !chains.testnet.length) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
return true;
|
|
49
|
+
}, [chains.testnet]);
|
|
50
|
+
const { recentChains, saveRecentChain } = useRecentChains(chains);
|
|
51
|
+
const onChainChange = async (chain) => {
|
|
52
|
+
if (connectedChain) {
|
|
53
|
+
const result = await setChain({ chainId: chain.id });
|
|
54
|
+
if (!result)
|
|
55
|
+
return result;
|
|
56
|
+
return {
|
|
57
|
+
result,
|
|
58
|
+
wrongNetwork: !checkChainSupport(chain.id, config.get("networkId")),
|
|
59
|
+
chainId: chain.id
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
setStorageChain(chain.id);
|
|
63
|
+
setCurrentChainId(chain.id);
|
|
64
|
+
return {
|
|
65
|
+
result: true,
|
|
66
|
+
wrongNetwork: false,
|
|
67
|
+
chainId: chain.id
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
const changedCallback = (chain, isWalletConnected) => {
|
|
71
|
+
const params = {
|
|
72
|
+
isTestnet: chain.isTestnet,
|
|
73
|
+
isWalletConnected
|
|
74
|
+
};
|
|
75
|
+
options.onChainChangeAfter?.(chain.id, params);
|
|
76
|
+
onChainChanged?.(chain.id, params);
|
|
77
|
+
};
|
|
78
|
+
const onChainClick = async (chain) => {
|
|
79
|
+
setSelectChainId(chain.id);
|
|
80
|
+
options.onChainChangeBefore?.(chain.id, { isTestnet: chain.isTestnet });
|
|
81
|
+
try {
|
|
82
|
+
const complete = await onChainChange?.(chain);
|
|
83
|
+
if (complete) {
|
|
84
|
+
options.resolve?.(complete);
|
|
85
|
+
options.close?.();
|
|
86
|
+
saveRecentChain(chain);
|
|
87
|
+
changedCallback(chain, true);
|
|
88
|
+
} else {
|
|
89
|
+
setSelectChainId(void 0);
|
|
90
|
+
changedCallback(chain, false);
|
|
91
|
+
}
|
|
92
|
+
} catch (err) {
|
|
93
|
+
changedCallback(chain, false);
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
const { selectedTab, onTabChange } = useChainTab(
|
|
97
|
+
chains,
|
|
98
|
+
currentChainId,
|
|
99
|
+
wrongNetwork,
|
|
100
|
+
showTestnet
|
|
101
|
+
);
|
|
102
|
+
return {
|
|
103
|
+
recentChains,
|
|
104
|
+
chains,
|
|
105
|
+
selectChainId,
|
|
106
|
+
onChainClick,
|
|
107
|
+
selectedTab,
|
|
108
|
+
onTabChange,
|
|
109
|
+
showTestnet
|
|
110
|
+
};
|
|
111
|
+
};
|
|
112
|
+
function useChainTab(chains, currentChainId, wrongNetwork, showTestnet) {
|
|
113
|
+
const [selectedTab, setSelectedTab] = react.useState("Mainnet" /* Mainnet */);
|
|
114
|
+
const onTabChange = (tab) => {
|
|
115
|
+
setSelectedTab(tab);
|
|
116
|
+
};
|
|
117
|
+
react.useEffect(() => {
|
|
118
|
+
if (!showTestnet) {
|
|
119
|
+
setSelectedTab("Mainnet" /* Mainnet */);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (currentChainId) {
|
|
123
|
+
const isMainnet = chains.mainnet?.some(
|
|
124
|
+
(chain) => chain.id === currentChainId
|
|
125
|
+
);
|
|
126
|
+
if (isMainnet) {
|
|
127
|
+
setSelectedTab(wrongNetwork ? "Testnet" /* Testnet */ : "Mainnet" /* Mainnet */);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const isTestnet = chains.testnet?.some(
|
|
131
|
+
(chain) => chain.id === currentChainId
|
|
132
|
+
);
|
|
133
|
+
if (isTestnet) {
|
|
134
|
+
setSelectedTab(wrongNetwork ? "Mainnet" /* Mainnet */ : "Testnet" /* Testnet */);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}, [currentChainId, chains, wrongNetwork, showTestnet]);
|
|
139
|
+
return { selectedTab, onTabChange };
|
|
140
|
+
}
|
|
141
|
+
function useRecentChains(chains) {
|
|
142
|
+
const [recentChainsIds, setRecentChainsIds] = orderlyHooks.useLocalStorage(
|
|
143
|
+
KEY,
|
|
144
|
+
[]
|
|
145
|
+
);
|
|
146
|
+
const recentChains = react.useMemo(() => {
|
|
147
|
+
return recentChainsIds?.map(
|
|
148
|
+
(id) => chains.mainnet?.find((item) => item.id === parseInt(id))
|
|
149
|
+
).filter((chains2) => !!chains2);
|
|
150
|
+
}, [chains, recentChainsIds]);
|
|
151
|
+
const saveRecentChain = react.useCallback(
|
|
152
|
+
(chain) => {
|
|
153
|
+
if (chain.isTestnet) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
let ids = recentChainsIds?.filter((id) => id !== chain.id);
|
|
157
|
+
ids = [chain.id, ...ids].slice(0, MAX_RECENT_CHAINS);
|
|
158
|
+
setRecentChainsIds(ids);
|
|
159
|
+
},
|
|
160
|
+
[recentChainsIds]
|
|
161
|
+
);
|
|
162
|
+
return { recentChains, saveRecentChain };
|
|
163
|
+
}
|
|
164
|
+
var chainSelectorVariants = orderlyUi.tv({
|
|
165
|
+
slots: {
|
|
166
|
+
icon: "",
|
|
167
|
+
list: "oui-grid oui-grid-cols-1 oui-gap-1",
|
|
168
|
+
mainnetList: '"',
|
|
169
|
+
testnetList: '"',
|
|
170
|
+
recentList: "",
|
|
171
|
+
item: "oui-w-full oui-rounded-md",
|
|
172
|
+
tip: "oui-text-center"
|
|
173
|
+
},
|
|
174
|
+
variants: {
|
|
175
|
+
variant: {
|
|
176
|
+
compact: {
|
|
177
|
+
icon: "oui-w-6 oui-h-6",
|
|
178
|
+
list: "oui-bg-base-9 oui-rounded-lg oui-p-1",
|
|
179
|
+
mainnetList: "oui-grid-cols-2 oui-mt-4",
|
|
180
|
+
testnetList: "oui-grid-cols-1 oui-mt-4",
|
|
181
|
+
recentList: "oui-mt-4",
|
|
182
|
+
item: "oui-bg-base-6 hover:oui-bg-base-7",
|
|
183
|
+
tip: "oui-pt-6"
|
|
184
|
+
},
|
|
185
|
+
wide: {
|
|
186
|
+
icon: "oui-w-[18px] oui-h-[18px]",
|
|
187
|
+
mainnetList: "oui-grid-cols-3 oui-mt-3",
|
|
188
|
+
testnetList: "oui-grid-cols-2 oui-mt-3",
|
|
189
|
+
recentList: "oui-mt-3",
|
|
190
|
+
item: "oui-bg-base-5 hover:oui-bg-base-6",
|
|
191
|
+
tip: "oui-pt-8"
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
selected: {
|
|
195
|
+
true: {
|
|
196
|
+
item: ""
|
|
197
|
+
},
|
|
198
|
+
false: { item: "oui-bg-transparent" }
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
compoundVariants: [
|
|
202
|
+
{
|
|
203
|
+
variant: "compact",
|
|
204
|
+
selected: true,
|
|
205
|
+
className: {
|
|
206
|
+
item: "hover:oui-bg-base-6"
|
|
207
|
+
}
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
variant: "wide",
|
|
211
|
+
selected: true,
|
|
212
|
+
className: {
|
|
213
|
+
item: "hover:oui-bg-base-5"
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
],
|
|
217
|
+
defaultVariants: {
|
|
218
|
+
variant: "wide",
|
|
219
|
+
selected: false
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
var ChainSelector = (props) => {
|
|
223
|
+
const { isWrongNetwork, variant = "wide" } = props;
|
|
224
|
+
const { t } = orderlyI18n.useTranslation();
|
|
225
|
+
const { list, recentList, mainnetList, testnetList, icon, item, tip } = chainSelectorVariants({ variant });
|
|
226
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(orderlyUi.Box, { className: orderlyUi.cn("oui-font-semibold", props.className), children: [
|
|
227
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
228
|
+
orderlyUi.Tabs,
|
|
229
|
+
{
|
|
230
|
+
value: props.selectedTab,
|
|
231
|
+
variant: "contained",
|
|
232
|
+
size: variant === "wide" ? "md" : "lg",
|
|
233
|
+
onValueChange: (e) => props.onTabChange(e),
|
|
234
|
+
children: [
|
|
235
|
+
/* @__PURE__ */ jsxRuntime.jsxs(orderlyUi.TabPanel, { value: "Mainnet" /* Mainnet */, title: t("connector.mainnet"), children: [
|
|
236
|
+
!!props.recentChains?.length && /* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Flex, { gap: 2, className: recentList(), children: props.recentChains?.map((item2) => {
|
|
237
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
238
|
+
RecentChainItem,
|
|
239
|
+
{
|
|
240
|
+
item: item2,
|
|
241
|
+
onClick: () => props.onChainClick(item2),
|
|
242
|
+
iconClassName: icon()
|
|
243
|
+
},
|
|
244
|
+
item2.id
|
|
245
|
+
);
|
|
246
|
+
}) }),
|
|
247
|
+
/* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Box, { r: "2xl", className: orderlyUi.cn(list(), mainnetList()), children: props.chains.mainnet?.map((chain) => {
|
|
248
|
+
const selected = props.selectChainId === chain.id;
|
|
249
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
250
|
+
ChainItem,
|
|
251
|
+
{
|
|
252
|
+
selected,
|
|
253
|
+
item: chain,
|
|
254
|
+
onClick: () => props.onChainClick(chain),
|
|
255
|
+
className: item({ selected })
|
|
256
|
+
},
|
|
257
|
+
chain.id
|
|
258
|
+
);
|
|
259
|
+
}) })
|
|
260
|
+
] }),
|
|
261
|
+
props.showTestnet && /* @__PURE__ */ jsxRuntime.jsx(orderlyUi.TabPanel, { value: "Testnet" /* Testnet */, title: t("connector.testnet"), children: /* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Box, { r: "2xl", className: orderlyUi.cn(list(), testnetList()), children: props.chains.testnet?.map((chain) => {
|
|
262
|
+
const selected = props.selectChainId === chain.id;
|
|
263
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
264
|
+
ChainItem,
|
|
265
|
+
{
|
|
266
|
+
selected,
|
|
267
|
+
item: chain,
|
|
268
|
+
onClick: () => props.onChainClick(chain),
|
|
269
|
+
className: item({ selected })
|
|
270
|
+
},
|
|
271
|
+
chain.id
|
|
272
|
+
);
|
|
273
|
+
}) }) })
|
|
274
|
+
]
|
|
275
|
+
}
|
|
276
|
+
),
|
|
277
|
+
isWrongNetwork && /* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Box, { className: tip(), children: /* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Text, { color: "warning", size: "xs", children: t("connector.wrongNetwork.tooltip") }) })
|
|
278
|
+
] });
|
|
279
|
+
};
|
|
280
|
+
var ChainItem = (props) => {
|
|
281
|
+
const { item } = props;
|
|
282
|
+
return /* @__PURE__ */ jsxRuntime.jsx("button", { className: props.className, onClick: props.onClick, children: /* @__PURE__ */ jsxRuntime.jsxs(orderlyUi.Flex, { justify: "between", className: "oui-py-2.5", px: 3, children: [
|
|
283
|
+
/* @__PURE__ */ jsxRuntime.jsxs(orderlyUi.Flex, { itemAlign: "center", width: "100%", className: "oui-gap-x-[6px]", children: [
|
|
284
|
+
/* @__PURE__ */ jsxRuntime.jsx(orderlyUi.ChainIcon, { chainId: item.id, size: "xs" }),
|
|
285
|
+
/* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Text, { size: "2xs", children: item.name })
|
|
286
|
+
] }),
|
|
287
|
+
props.selected && /* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Box, { gradient: "brand", r: "full", width: 4, height: 4 })
|
|
288
|
+
] }) });
|
|
289
|
+
};
|
|
290
|
+
var RecentChainItem = (props) => {
|
|
291
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
292
|
+
"button",
|
|
293
|
+
{
|
|
294
|
+
className: "oui-border oui-border-line-12 oui-rounded-lg hover:oui-border-primary-light",
|
|
295
|
+
onClick: props.onClick,
|
|
296
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Flex, { itemAlign: "center", p: 2, children: /* @__PURE__ */ jsxRuntime.jsx(orderlyUi.ChainIcon, { chainId: props.item.id, className: props.iconClassName }) })
|
|
297
|
+
}
|
|
298
|
+
);
|
|
299
|
+
};
|
|
300
|
+
var ChainSelectorWidget = (props) => {
|
|
301
|
+
const state = useChainSelectorScript(props);
|
|
302
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
303
|
+
ChainSelector,
|
|
304
|
+
{
|
|
305
|
+
...state,
|
|
306
|
+
variant: props.variant,
|
|
307
|
+
isWrongNetwork: props.isWrongNetwork
|
|
308
|
+
}
|
|
309
|
+
);
|
|
310
|
+
};
|
|
311
|
+
var ChainSelectorDialogId = "ChainSelectorDialogId";
|
|
312
|
+
var ChainSelectorSheetId = "ChainSelectorSheetId";
|
|
313
|
+
orderlyUi.registerSimpleDialog(ChainSelectorDialogId, ChainSelectorWidget, {
|
|
314
|
+
size: "lg",
|
|
315
|
+
title: () => orderlyI18n.i18n.t("connector.switchNetwork"),
|
|
316
|
+
variant: "wide",
|
|
317
|
+
isWrongNetwork: true
|
|
318
|
+
});
|
|
319
|
+
orderlyUi.registerSimpleSheet(ChainSelectorSheetId, ChainSelectorWidget, {
|
|
320
|
+
title: () => orderlyI18n.i18n.t("connector.switchNetwork"),
|
|
321
|
+
classNames: {
|
|
322
|
+
content: "!oui-bg-base-8",
|
|
323
|
+
body: "!oui-bg-base-8"
|
|
324
|
+
},
|
|
325
|
+
variant: "compact",
|
|
326
|
+
isWrongNetwork: true
|
|
327
|
+
});
|
|
11
328
|
|
|
12
|
-
exports.ChainSelectorDialogId =
|
|
13
|
-
exports.ChainSelectorSheetId =
|
|
14
|
-
exports.ChainSelectorWidget =
|
|
329
|
+
exports.ChainSelectorDialogId = ChainSelectorDialogId;
|
|
330
|
+
exports.ChainSelectorSheetId = ChainSelectorSheetId;
|
|
331
|
+
exports.ChainSelectorWidget = ChainSelectorWidget;
|
|
15
332
|
//# sourceMappingURL=out.js.map
|
|
16
333
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/chainSelector.widget.tsx","../src/chainSelector.script.ts","../src/chainSelector.ui.tsx"],"names":["registerSimpleDialog","registerSimpleSheet","useMemo","useCallback","useState","useEffect","useConfig","useStorageChain","useChains","useWalletConnector","useLocalStorage","useAppContext","useOrderlyTheme","KEY","MAX_RECENT_CHAINS","useChainSelectorScript","options","networkId","bridgeLessOnly","setStorageChain","config","_chains","checkChainSupport","setChain","connectedChain","onChainChanged","currentChainId","setCurrentChainId","wrongNetwork","selectChainId","setSelectChainId","getComponentTheme","chains","chain","showTestnet","recentChains","saveRecentChain","useRecentChains","onChainChange","result","changedCallback","isWalletConnected","params","onChainClick","complete","selectedTab","onTabChange","useChainTab","setSelectedTab","tab","recentChainsIds","setRecentChainsIds","id","item","ids","Box","Flex","Text","ChainIcon","Tabs","TabPanel","cn","tv","useTranslation","jsx","jsxs","chainSelectorVariants","ChainSelector","props","isWrongNetwork","variant","t","list","recentList","mainnetList","testnetList","icon","tip","e","RecentChainItem","selected","ChainItem","i18n","ChainSelectorWidget","state","ChainSelectorDialogId","ChainSelectorSheetId"],"mappings":"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","sourcesContent":["import { registerSimpleDialog, registerSimpleSheet } from \"@kodiak-finance/orderly-ui\";\nimport {\n useChainSelectorScript,\n UseChainSelectorScriptOptions,\n} from \"./chainSelector.script\";\nimport { ChainSelector, ChainSelectorProps } from \"./chainSelector.ui\";\nimport { i18n } from \"@kodiak-finance/orderly-i18n\";\n\nexport type ChainSelectorWidgetProps = UseChainSelectorScriptOptions &\n Pick<ChainSelectorProps, \"isWrongNetwork\" | \"variant\" | \"className\">;\n\nexport const ChainSelectorWidget = (props: ChainSelectorWidgetProps) => {\n const state = useChainSelectorScript(props);\n\n return (\n <ChainSelector\n {...state}\n variant={props.variant}\n isWrongNetwork={props.isWrongNetwork}\n />\n );\n};\n\nexport const ChainSelectorDialogId = \"ChainSelectorDialogId\";\nexport const ChainSelectorSheetId = \"ChainSelectorSheetId\";\n\nregisterSimpleDialog(ChainSelectorDialogId, ChainSelectorWidget, {\n size: \"lg\",\n title: () => i18n.t(\"connector.switchNetwork\"),\n variant: \"wide\",\n isWrongNetwork: true,\n});\n\nregisterSimpleSheet(ChainSelectorSheetId, ChainSelectorWidget, {\n title: () => i18n.t(\"connector.switchNetwork\"),\n classNames: {\n content: \"!oui-bg-base-8\",\n body: \"!oui-bg-base-8\",\n },\n variant: \"compact\",\n isWrongNetwork: true,\n});\n","import { useMemo, useCallback, useState, useEffect } from \"react\";\nimport { useConfig, useStorageChain } from \"@kodiak-finance/orderly-hooks\";\nimport {\n useChains,\n useWalletConnector,\n useLocalStorage,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { NetworkId } from \"@kodiak-finance/orderly-types\";\nimport { useAppContext } from \"@kodiak-finance/orderly-react-app\";\nimport { ChainType, TChainItem } from \"./type\";\nimport { useOrderlyTheme } from \"@kodiak-finance/orderly-ui\";\n\nconst KEY = \"orderly_selected_chains\";\nconst MAX_RECENT_CHAINS = 6;\n\nexport type UseChainSelectorScriptReturn = ReturnType<\n typeof useChainSelectorScript\n>;\n\nexport type UseChainSelectorScriptOptions = {\n networkId?: NetworkId;\n bridgeLessOnly?: boolean;\n close?: () => void;\n resolve?: (isSuccess: boolean) => void;\n reject?: () => void;\n onChainChangeBefore?: (\n chainId: number,\n state: {\n isTestnet: boolean;\n }\n ) => void;\n onChainChangeAfter?: (\n chainId: number,\n state: {\n isTestnet: boolean;\n isWalletConnected: boolean;\n }\n ) => void;\n};\n\nexport const useChainSelectorScript = (\n options: UseChainSelectorScriptOptions\n) => {\n const { networkId, bridgeLessOnly } = options || {};\n const { setStorageChain } = useStorageChain();\n\n const config = useConfig();\n const [_chains, { checkChainSupport }] = useChains();\n const { setChain, connectedChain } = useWalletConnector();\n\n const { onChainChanged, currentChainId, setCurrentChainId, wrongNetwork } =\n useAppContext();\n\n const [selectChainId, setSelectChainId] = useState<number | undefined>(\n currentChainId\n );\n\n const { getComponentTheme } = useOrderlyTheme();\n\n const chains = useMemo(() => {\n const bridgeLessChains = bridgeLessOnly\n ? _chains.mainnet.filter((chain) => chain.network_infos.bridgeless)\n : _chains.mainnet;\n\n return {\n mainnet: bridgeLessChains.map((chain) => ({\n name: chain.network_infos.name,\n id: chain.network_infos.chain_id,\n lowestFee: chain.network_infos.bridgeless,\n isTestnet: false,\n })),\n testnet: _chains.testnet.map((chain) => ({\n name: chain.network_infos.name,\n id: chain.network_infos.chain_id,\n lowestFee: chain.network_infos.bridgeless,\n isTestnet: true,\n })),\n };\n }, [_chains, bridgeLessOnly]);\n\n const showTestnet = useMemo(() => {\n const chainSelectorOverrides = getComponentTheme(\"chainSelector\", {\n showTestnet: true,\n });\n\n if (\n chainSelectorOverrides.showTestnet === false ||\n !chains.testnet.length\n ) {\n return false;\n }\n\n return true;\n }, [chains.testnet]);\n\n const { recentChains, saveRecentChain } = useRecentChains(chains);\n\n const onChainChange = async (chain: TChainItem) => {\n if (connectedChain) {\n const result = await setChain({ chainId: chain.id });\n\n if (!result) return result;\n\n return {\n result,\n wrongNetwork: !checkChainSupport(chain.id, config.get(\"networkId\")),\n chainId: chain.id,\n };\n }\n\n setStorageChain(chain.id);\n\n setCurrentChainId(chain.id);\n return {\n result: true,\n wrongNetwork: false,\n chainId: chain.id,\n };\n // return Promise.reject(\"No connected chain\");\n };\n\n const changedCallback = (chain: TChainItem, isWalletConnected: boolean) => {\n const params = {\n isTestnet: chain.isTestnet,\n isWalletConnected,\n };\n options.onChainChangeAfter?.(chain.id, params);\n onChainChanged?.(chain.id, params);\n };\n\n const onChainClick = async (chain: TChainItem) => {\n setSelectChainId(chain.id);\n options.onChainChangeBefore?.(chain.id, { isTestnet: chain.isTestnet });\n try {\n const complete = await onChainChange?.(chain);\n\n if (complete) {\n options.resolve?.(complete);\n options.close?.();\n saveRecentChain(chain);\n changedCallback(chain, true);\n } else {\n setSelectChainId(undefined);\n changedCallback(chain, false);\n }\n } catch (err) {\n changedCallback(chain, false);\n }\n };\n\n const { selectedTab, onTabChange } = useChainTab(\n chains,\n currentChainId,\n wrongNetwork,\n showTestnet\n );\n\n return {\n recentChains,\n chains,\n selectChainId,\n onChainClick,\n selectedTab,\n onTabChange,\n showTestnet,\n };\n};\n\nfunction useChainTab(\n chains: Record<NetworkId, TChainItem[]>,\n currentChainId?: number,\n wrongNetwork?: boolean,\n showTestnet?: boolean\n) {\n const [selectedTab, setSelectedTab] = useState<ChainType>(ChainType.Mainnet);\n\n const onTabChange = (tab: ChainType) => {\n setSelectedTab(tab);\n };\n\n useEffect(() => {\n if (!showTestnet) {\n setSelectedTab(ChainType.Mainnet);\n return;\n }\n\n if (currentChainId) {\n const isMainnet = chains.mainnet?.some(\n (chain) => chain.id === currentChainId\n );\n if (isMainnet) {\n setSelectedTab(wrongNetwork ? ChainType.Testnet : ChainType.Mainnet);\n return;\n }\n\n const isTestnet = chains.testnet?.some(\n (chain) => chain.id === currentChainId\n );\n if (isTestnet) {\n setSelectedTab(wrongNetwork ? ChainType.Mainnet : ChainType.Testnet);\n return;\n }\n }\n }, [currentChainId, chains, wrongNetwork, showTestnet]);\n\n return { selectedTab, onTabChange };\n}\n\nfunction useRecentChains(chains: Record<NetworkId, TChainItem[]>) {\n const [recentChainsIds, setRecentChainsIds] = useLocalStorage<string[]>(\n KEY,\n []\n );\n\n const recentChains = useMemo<TChainItem[]>(() => {\n return recentChainsIds\n ?.map((id: string) =>\n chains.mainnet?.find((item) => item.id === parseInt(id))\n )\n .filter((chains: TChainItem) => !!chains);\n }, [chains, recentChainsIds]);\n\n const saveRecentChain = useCallback(\n (chain: TChainItem) => {\n // only mainnet can save chain id to local storage\n if (chain.isTestnet) {\n return;\n }\n let ids = recentChainsIds?.filter((id: number) => id !== chain.id);\n ids = [chain.id, ...ids].slice(0, MAX_RECENT_CHAINS);\n setRecentChainsIds(ids);\n },\n [recentChainsIds]\n );\n\n return { recentChains, saveRecentChain };\n}\n","import {\n Box,\n Flex,\n Text,\n ChainIcon,\n Tabs,\n TabPanel,\n cn,\n tv,\n} from \"@kodiak-finance/orderly-ui\";\nimport { ChainType, TChainItem } from \"./type\";\nimport { UseChainSelectorScriptReturn } from \"./chainSelector.script\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\n\nexport type ChainSelectorProps = {\n isWrongNetwork?: boolean;\n /**\n * wide: This represents the wide screen (desktop) UI mode\n * compact: This indicates a compact (mobile) UI pattern.\n */\n variant?: \"wide\" | \"compact\";\n className?: string;\n} & UseChainSelectorScriptReturn;\n\nconst chainSelectorVariants = tv({\n slots: {\n icon: \"\",\n list: \"oui-grid oui-grid-cols-1 oui-gap-1\",\n mainnetList: '\"',\n testnetList: '\"',\n recentList: \"\",\n item: \"oui-w-full oui-rounded-md\",\n tip: \"oui-text-center\",\n },\n variants: {\n variant: {\n compact: {\n icon: \"oui-w-6 oui-h-6\",\n list: \"oui-bg-base-9 oui-rounded-lg oui-p-1\",\n mainnetList: \"oui-grid-cols-2 oui-mt-4\",\n testnetList: \"oui-grid-cols-1 oui-mt-4\",\n recentList: \"oui-mt-4\",\n item: \"oui-bg-base-6 hover:oui-bg-base-7\",\n tip: \"oui-pt-6\",\n },\n wide: {\n icon: \"oui-w-[18px] oui-h-[18px]\",\n mainnetList: \"oui-grid-cols-3 oui-mt-3\",\n testnetList: \"oui-grid-cols-2 oui-mt-3\",\n recentList: \"oui-mt-3\",\n item: \"oui-bg-base-5 hover:oui-bg-base-6\",\n tip: \"oui-pt-8\",\n },\n },\n selected: {\n true: {\n item: \"\",\n },\n false: { item: \"oui-bg-transparent\" },\n },\n },\n compoundVariants: [\n {\n variant: \"compact\",\n selected: true,\n className: {\n item: \"hover:oui-bg-base-6\",\n },\n },\n {\n variant: \"wide\",\n selected: true,\n className: {\n item: \"hover:oui-bg-base-5\",\n },\n },\n ],\n defaultVariants: {\n variant: \"wide\",\n selected: false,\n },\n});\n\n//------------------ ChainSelector start ------------------\nexport const ChainSelector = (props: ChainSelectorProps) => {\n const { isWrongNetwork, variant = \"wide\" } = props;\n const { t } = useTranslation();\n const { list, recentList, mainnetList, testnetList, icon, item, tip } =\n chainSelectorVariants({ variant });\n\n return (\n <Box className={cn(\"oui-font-semibold\", props.className)}>\n <Tabs\n value={props.selectedTab}\n variant=\"contained\"\n size={variant === \"wide\" ? \"md\" : \"lg\"}\n onValueChange={(e) => props.onTabChange(e as ChainType)}\n >\n <TabPanel value={ChainType.Mainnet} title={t(\"connector.mainnet\")}>\n {!!props.recentChains?.length && (\n <Flex gap={2} className={recentList()}>\n {props.recentChains?.map((item) => {\n return (\n <RecentChainItem\n key={item.id}\n item={item}\n onClick={() => props.onChainClick(item)}\n iconClassName={icon()}\n />\n );\n })}\n </Flex>\n )}\n\n <Box r=\"2xl\" className={cn(list(), mainnetList())}>\n {props.chains.mainnet?.map((chain) => {\n const selected = props.selectChainId === chain.id;\n return (\n <ChainItem\n key={chain.id}\n selected={selected}\n item={chain}\n onClick={() => props.onChainClick(chain)}\n className={item({ selected })}\n />\n );\n })}\n </Box>\n </TabPanel>\n\n {props.showTestnet && (\n <TabPanel value={ChainType.Testnet} title={t(\"connector.testnet\")}>\n <Box r=\"2xl\" className={cn(list(), testnetList())}>\n {props.chains.testnet?.map((chain) => {\n const selected = props.selectChainId === chain.id;\n return (\n <ChainItem\n key={chain.id}\n selected={selected}\n item={chain}\n onClick={() => props.onChainClick(chain)}\n className={item({ selected })}\n />\n );\n })}\n </Box>\n </TabPanel>\n )}\n </Tabs>\n\n {isWrongNetwork && (\n <Box className={tip()}>\n <Text color=\"warning\" size=\"xs\">\n {t(\"connector.wrongNetwork.tooltip\")}\n </Text>\n </Box>\n )}\n </Box>\n );\n};\n// ------------------ ChainSelector end ------------------\n\n// ------------------ ChainItem start ------------------\nexport const ChainItem = (props: {\n selected: boolean;\n item: TChainItem;\n onClick?: () => void;\n className?: string;\n}) => {\n const { item } = props;\n return (\n <button className={props.className} onClick={props.onClick}>\n <Flex justify=\"between\" className=\"oui-py-2.5\" px={3}>\n <Flex itemAlign=\"center\" width=\"100%\" className=\"oui-gap-x-[6px]\">\n <ChainIcon chainId={item.id} size=\"xs\" />\n <Text size=\"2xs\">{item.name}</Text>\n </Flex>\n {props.selected && (\n <Box gradient=\"brand\" r=\"full\" width={4} height={4} />\n )}\n </Flex>\n </button>\n );\n};\n\n// ------------------ Recent ChainItem start ------------------\nexport const RecentChainItem = (props: {\n item: TChainItem;\n onClick?: () => void;\n iconClassName?: string;\n}) => {\n return (\n <button\n className=\"oui-border oui-border-line-12 oui-rounded-lg hover:oui-border-primary-light\"\n onClick={props.onClick}\n >\n <Flex itemAlign=\"center\" p={2}>\n <ChainIcon chainId={props.item.id} className={props.iconClassName} />\n </Flex>\n </button>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/chainSelector.widget.tsx","../src/chainSelector.script.ts","../src/chainSelector.ui.tsx"],"names":["chains","item","jsx"],"mappings":"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","sourcesContent":["import { registerSimpleDialog, registerSimpleSheet } from \"@kodiak-finance/orderly-ui\";\nimport {\n useChainSelectorScript,\n UseChainSelectorScriptOptions,\n} from \"./chainSelector.script\";\nimport { ChainSelector, ChainSelectorProps } from \"./chainSelector.ui\";\nimport { i18n } from \"@kodiak-finance/orderly-i18n\";\n\nexport type ChainSelectorWidgetProps = UseChainSelectorScriptOptions &\n Pick<ChainSelectorProps, \"isWrongNetwork\" | \"variant\" | \"className\">;\n\nexport const ChainSelectorWidget = (props: ChainSelectorWidgetProps) => {\n const state = useChainSelectorScript(props);\n\n return (\n <ChainSelector\n {...state}\n variant={props.variant}\n isWrongNetwork={props.isWrongNetwork}\n />\n );\n};\n\nexport const ChainSelectorDialogId = \"ChainSelectorDialogId\";\nexport const ChainSelectorSheetId = \"ChainSelectorSheetId\";\n\nregisterSimpleDialog(ChainSelectorDialogId, ChainSelectorWidget, {\n size: \"lg\",\n title: () => i18n.t(\"connector.switchNetwork\"),\n variant: \"wide\",\n isWrongNetwork: true,\n});\n\nregisterSimpleSheet(ChainSelectorSheetId, ChainSelectorWidget, {\n title: () => i18n.t(\"connector.switchNetwork\"),\n classNames: {\n content: \"!oui-bg-base-8\",\n body: \"!oui-bg-base-8\",\n },\n variant: \"compact\",\n isWrongNetwork: true,\n});\n","import { useMemo, useCallback, useState, useEffect } from \"react\";\nimport { useConfig, useStorageChain } from \"@kodiak-finance/orderly-hooks\";\nimport {\n useChains,\n useWalletConnector,\n useLocalStorage,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { NetworkId } from \"@kodiak-finance/orderly-types\";\nimport { useAppContext } from \"@kodiak-finance/orderly-react-app\";\nimport { ChainType, TChainItem } from \"./type\";\nimport { useOrderlyTheme } from \"@kodiak-finance/orderly-ui\";\n\nconst KEY = \"orderly_selected_chains\";\nconst MAX_RECENT_CHAINS = 6;\n\nexport type UseChainSelectorScriptReturn = ReturnType<\n typeof useChainSelectorScript\n>;\n\nexport type UseChainSelectorScriptOptions = {\n networkId?: NetworkId;\n bridgeLessOnly?: boolean;\n close?: () => void;\n resolve?: (isSuccess: boolean) => void;\n reject?: () => void;\n onChainChangeBefore?: (\n chainId: number,\n state: {\n isTestnet: boolean;\n }\n ) => void;\n onChainChangeAfter?: (\n chainId: number,\n state: {\n isTestnet: boolean;\n isWalletConnected: boolean;\n }\n ) => void;\n};\n\nexport const useChainSelectorScript = (\n options: UseChainSelectorScriptOptions\n) => {\n const { networkId, bridgeLessOnly } = options || {};\n const { setStorageChain } = useStorageChain();\n\n const config = useConfig();\n const [_chains, { checkChainSupport }] = useChains();\n const { setChain, connectedChain } = useWalletConnector();\n\n const { onChainChanged, currentChainId, setCurrentChainId, wrongNetwork } =\n useAppContext();\n\n const [selectChainId, setSelectChainId] = useState<number | undefined>(\n currentChainId\n );\n\n const { getComponentTheme } = useOrderlyTheme();\n\n const chains = useMemo(() => {\n const bridgeLessChains = bridgeLessOnly\n ? _chains.mainnet.filter((chain) => chain.network_infos.bridgeless)\n : _chains.mainnet;\n\n return {\n mainnet: bridgeLessChains.map((chain) => ({\n name: chain.network_infos.name,\n id: chain.network_infos.chain_id,\n lowestFee: chain.network_infos.bridgeless,\n isTestnet: false,\n })),\n testnet: _chains.testnet.map((chain) => ({\n name: chain.network_infos.name,\n id: chain.network_infos.chain_id,\n lowestFee: chain.network_infos.bridgeless,\n isTestnet: true,\n })),\n };\n }, [_chains, bridgeLessOnly]);\n\n const showTestnet = useMemo(() => {\n const chainSelectorOverrides = getComponentTheme(\"chainSelector\", {\n showTestnet: true,\n });\n\n if (\n chainSelectorOverrides.showTestnet === false ||\n !chains.testnet.length\n ) {\n return false;\n }\n\n return true;\n }, [chains.testnet]);\n\n const { recentChains, saveRecentChain } = useRecentChains(chains);\n\n const onChainChange = async (chain: TChainItem) => {\n if (connectedChain) {\n const result = await setChain({ chainId: chain.id });\n\n if (!result) return result;\n\n return {\n result,\n wrongNetwork: !checkChainSupport(chain.id, config.get(\"networkId\")),\n chainId: chain.id,\n };\n }\n\n setStorageChain(chain.id);\n\n setCurrentChainId(chain.id);\n return {\n result: true,\n wrongNetwork: false,\n chainId: chain.id,\n };\n // return Promise.reject(\"No connected chain\");\n };\n\n const changedCallback = (chain: TChainItem, isWalletConnected: boolean) => {\n const params = {\n isTestnet: chain.isTestnet,\n isWalletConnected,\n };\n options.onChainChangeAfter?.(chain.id, params);\n onChainChanged?.(chain.id, params);\n };\n\n const onChainClick = async (chain: TChainItem) => {\n setSelectChainId(chain.id);\n options.onChainChangeBefore?.(chain.id, { isTestnet: chain.isTestnet });\n try {\n const complete = await onChainChange?.(chain);\n\n if (complete) {\n options.resolve?.(complete);\n options.close?.();\n saveRecentChain(chain);\n changedCallback(chain, true);\n } else {\n setSelectChainId(undefined);\n changedCallback(chain, false);\n }\n } catch (err) {\n changedCallback(chain, false);\n }\n };\n\n const { selectedTab, onTabChange } = useChainTab(\n chains,\n currentChainId,\n wrongNetwork,\n showTestnet\n );\n\n return {\n recentChains,\n chains,\n selectChainId,\n onChainClick,\n selectedTab,\n onTabChange,\n showTestnet,\n };\n};\n\nfunction useChainTab(\n chains: Record<NetworkId, TChainItem[]>,\n currentChainId?: number,\n wrongNetwork?: boolean,\n showTestnet?: boolean\n) {\n const [selectedTab, setSelectedTab] = useState<ChainType>(ChainType.Mainnet);\n\n const onTabChange = (tab: ChainType) => {\n setSelectedTab(tab);\n };\n\n useEffect(() => {\n if (!showTestnet) {\n setSelectedTab(ChainType.Mainnet);\n return;\n }\n\n if (currentChainId) {\n const isMainnet = chains.mainnet?.some(\n (chain) => chain.id === currentChainId\n );\n if (isMainnet) {\n setSelectedTab(wrongNetwork ? ChainType.Testnet : ChainType.Mainnet);\n return;\n }\n\n const isTestnet = chains.testnet?.some(\n (chain) => chain.id === currentChainId\n );\n if (isTestnet) {\n setSelectedTab(wrongNetwork ? ChainType.Mainnet : ChainType.Testnet);\n return;\n }\n }\n }, [currentChainId, chains, wrongNetwork, showTestnet]);\n\n return { selectedTab, onTabChange };\n}\n\nfunction useRecentChains(chains: Record<NetworkId, TChainItem[]>) {\n const [recentChainsIds, setRecentChainsIds] = useLocalStorage<string[]>(\n KEY,\n []\n );\n\n const recentChains = useMemo<TChainItem[]>(() => {\n return recentChainsIds\n ?.map((id: string) =>\n chains.mainnet?.find((item) => item.id === parseInt(id))\n )\n .filter((chains: TChainItem) => !!chains);\n }, [chains, recentChainsIds]);\n\n const saveRecentChain = useCallback(\n (chain: TChainItem) => {\n // only mainnet can save chain id to local storage\n if (chain.isTestnet) {\n return;\n }\n let ids = recentChainsIds?.filter((id: number) => id !== chain.id);\n ids = [chain.id, ...ids].slice(0, MAX_RECENT_CHAINS);\n setRecentChainsIds(ids);\n },\n [recentChainsIds]\n );\n\n return { recentChains, saveRecentChain };\n}\n","import {\n Box,\n Flex,\n Text,\n ChainIcon,\n Tabs,\n TabPanel,\n cn,\n tv,\n} from \"@kodiak-finance/orderly-ui\";\nimport { ChainType, TChainItem } from \"./type\";\nimport { UseChainSelectorScriptReturn } from \"./chainSelector.script\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\n\nexport type ChainSelectorProps = {\n isWrongNetwork?: boolean;\n /**\n * wide: This represents the wide screen (desktop) UI mode\n * compact: This indicates a compact (mobile) UI pattern.\n */\n variant?: \"wide\" | \"compact\";\n className?: string;\n} & UseChainSelectorScriptReturn;\n\nconst chainSelectorVariants = tv({\n slots: {\n icon: \"\",\n list: \"oui-grid oui-grid-cols-1 oui-gap-1\",\n mainnetList: '\"',\n testnetList: '\"',\n recentList: \"\",\n item: \"oui-w-full oui-rounded-md\",\n tip: \"oui-text-center\",\n },\n variants: {\n variant: {\n compact: {\n icon: \"oui-w-6 oui-h-6\",\n list: \"oui-bg-base-9 oui-rounded-lg oui-p-1\",\n mainnetList: \"oui-grid-cols-2 oui-mt-4\",\n testnetList: \"oui-grid-cols-1 oui-mt-4\",\n recentList: \"oui-mt-4\",\n item: \"oui-bg-base-6 hover:oui-bg-base-7\",\n tip: \"oui-pt-6\",\n },\n wide: {\n icon: \"oui-w-[18px] oui-h-[18px]\",\n mainnetList: \"oui-grid-cols-3 oui-mt-3\",\n testnetList: \"oui-grid-cols-2 oui-mt-3\",\n recentList: \"oui-mt-3\",\n item: \"oui-bg-base-5 hover:oui-bg-base-6\",\n tip: \"oui-pt-8\",\n },\n },\n selected: {\n true: {\n item: \"\",\n },\n false: { item: \"oui-bg-transparent\" },\n },\n },\n compoundVariants: [\n {\n variant: \"compact\",\n selected: true,\n className: {\n item: \"hover:oui-bg-base-6\",\n },\n },\n {\n variant: \"wide\",\n selected: true,\n className: {\n item: \"hover:oui-bg-base-5\",\n },\n },\n ],\n defaultVariants: {\n variant: \"wide\",\n selected: false,\n },\n});\n\n//------------------ ChainSelector start ------------------\nexport const ChainSelector = (props: ChainSelectorProps) => {\n const { isWrongNetwork, variant = \"wide\" } = props;\n const { t } = useTranslation();\n const { list, recentList, mainnetList, testnetList, icon, item, tip } =\n chainSelectorVariants({ variant });\n\n return (\n <Box className={cn(\"oui-font-semibold\", props.className)}>\n <Tabs\n value={props.selectedTab}\n variant=\"contained\"\n size={variant === \"wide\" ? \"md\" : \"lg\"}\n onValueChange={(e) => props.onTabChange(e as ChainType)}\n >\n <TabPanel value={ChainType.Mainnet} title={t(\"connector.mainnet\")}>\n {!!props.recentChains?.length && (\n <Flex gap={2} className={recentList()}>\n {props.recentChains?.map((item) => {\n return (\n <RecentChainItem\n key={item.id}\n item={item}\n onClick={() => props.onChainClick(item)}\n iconClassName={icon()}\n />\n );\n })}\n </Flex>\n )}\n\n <Box r=\"2xl\" className={cn(list(), mainnetList())}>\n {props.chains.mainnet?.map((chain) => {\n const selected = props.selectChainId === chain.id;\n return (\n <ChainItem\n key={chain.id}\n selected={selected}\n item={chain}\n onClick={() => props.onChainClick(chain)}\n className={item({ selected })}\n />\n );\n })}\n </Box>\n </TabPanel>\n\n {props.showTestnet && (\n <TabPanel value={ChainType.Testnet} title={t(\"connector.testnet\")}>\n <Box r=\"2xl\" className={cn(list(), testnetList())}>\n {props.chains.testnet?.map((chain) => {\n const selected = props.selectChainId === chain.id;\n return (\n <ChainItem\n key={chain.id}\n selected={selected}\n item={chain}\n onClick={() => props.onChainClick(chain)}\n className={item({ selected })}\n />\n );\n })}\n </Box>\n </TabPanel>\n )}\n </Tabs>\n\n {isWrongNetwork && (\n <Box className={tip()}>\n <Text color=\"warning\" size=\"xs\">\n {t(\"connector.wrongNetwork.tooltip\")}\n </Text>\n </Box>\n )}\n </Box>\n );\n};\n// ------------------ ChainSelector end ------------------\n\n// ------------------ ChainItem start ------------------\nexport const ChainItem = (props: {\n selected: boolean;\n item: TChainItem;\n onClick?: () => void;\n className?: string;\n}) => {\n const { item } = props;\n return (\n <button className={props.className} onClick={props.onClick}>\n <Flex justify=\"between\" className=\"oui-py-2.5\" px={3}>\n <Flex itemAlign=\"center\" width=\"100%\" className=\"oui-gap-x-[6px]\">\n <ChainIcon chainId={item.id} size=\"xs\" />\n <Text size=\"2xs\">{item.name}</Text>\n </Flex>\n {props.selected && (\n <Box gradient=\"brand\" r=\"full\" width={4} height={4} />\n )}\n </Flex>\n </button>\n );\n};\n\n// ------------------ Recent ChainItem start ------------------\nexport const RecentChainItem = (props: {\n item: TChainItem;\n onClick?: () => void;\n iconClassName?: string;\n}) => {\n return (\n <button\n className=\"oui-border oui-border-line-12 oui-rounded-lg hover:oui-border-primary-light\"\n onClick={props.onClick}\n >\n <Flex itemAlign=\"center\" p={2}>\n <ChainIcon chainId={props.item.id} className={props.iconClassName} />\n </Flex>\n </button>\n );\n};\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -5,8 +5,325 @@ import { useAppContext } from '@kodiak-finance/orderly-react-app';
|
|
|
5
5
|
import { i18n, useTranslation } from '@kodiak-finance/orderly-i18n';
|
|
6
6
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
// src/chainSelector.widget.tsx
|
|
9
|
+
var KEY = "orderly_selected_chains";
|
|
10
|
+
var MAX_RECENT_CHAINS = 6;
|
|
11
|
+
var useChainSelectorScript = (options) => {
|
|
12
|
+
const { networkId, bridgeLessOnly } = options || {};
|
|
13
|
+
const { setStorageChain } = useStorageChain();
|
|
14
|
+
const config = useConfig();
|
|
15
|
+
const [_chains, { checkChainSupport }] = useChains();
|
|
16
|
+
const { setChain, connectedChain } = useWalletConnector();
|
|
17
|
+
const { onChainChanged, currentChainId, setCurrentChainId, wrongNetwork } = useAppContext();
|
|
18
|
+
const [selectChainId, setSelectChainId] = useState(
|
|
19
|
+
currentChainId
|
|
20
|
+
);
|
|
21
|
+
const { getComponentTheme } = useOrderlyTheme();
|
|
22
|
+
const chains = useMemo(() => {
|
|
23
|
+
const bridgeLessChains = bridgeLessOnly ? _chains.mainnet.filter((chain) => chain.network_infos.bridgeless) : _chains.mainnet;
|
|
24
|
+
return {
|
|
25
|
+
mainnet: bridgeLessChains.map((chain) => ({
|
|
26
|
+
name: chain.network_infos.name,
|
|
27
|
+
id: chain.network_infos.chain_id,
|
|
28
|
+
lowestFee: chain.network_infos.bridgeless,
|
|
29
|
+
isTestnet: false
|
|
30
|
+
})),
|
|
31
|
+
testnet: _chains.testnet.map((chain) => ({
|
|
32
|
+
name: chain.network_infos.name,
|
|
33
|
+
id: chain.network_infos.chain_id,
|
|
34
|
+
lowestFee: chain.network_infos.bridgeless,
|
|
35
|
+
isTestnet: true
|
|
36
|
+
}))
|
|
37
|
+
};
|
|
38
|
+
}, [_chains, bridgeLessOnly]);
|
|
39
|
+
const showTestnet = useMemo(() => {
|
|
40
|
+
const chainSelectorOverrides = getComponentTheme("chainSelector", {
|
|
41
|
+
showTestnet: true
|
|
42
|
+
});
|
|
43
|
+
if (chainSelectorOverrides.showTestnet === false || !chains.testnet.length) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
return true;
|
|
47
|
+
}, [chains.testnet]);
|
|
48
|
+
const { recentChains, saveRecentChain } = useRecentChains(chains);
|
|
49
|
+
const onChainChange = async (chain) => {
|
|
50
|
+
if (connectedChain) {
|
|
51
|
+
const result = await setChain({ chainId: chain.id });
|
|
52
|
+
if (!result)
|
|
53
|
+
return result;
|
|
54
|
+
return {
|
|
55
|
+
result,
|
|
56
|
+
wrongNetwork: !checkChainSupport(chain.id, config.get("networkId")),
|
|
57
|
+
chainId: chain.id
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
setStorageChain(chain.id);
|
|
61
|
+
setCurrentChainId(chain.id);
|
|
62
|
+
return {
|
|
63
|
+
result: true,
|
|
64
|
+
wrongNetwork: false,
|
|
65
|
+
chainId: chain.id
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
const changedCallback = (chain, isWalletConnected) => {
|
|
69
|
+
const params = {
|
|
70
|
+
isTestnet: chain.isTestnet,
|
|
71
|
+
isWalletConnected
|
|
72
|
+
};
|
|
73
|
+
options.onChainChangeAfter?.(chain.id, params);
|
|
74
|
+
onChainChanged?.(chain.id, params);
|
|
75
|
+
};
|
|
76
|
+
const onChainClick = async (chain) => {
|
|
77
|
+
setSelectChainId(chain.id);
|
|
78
|
+
options.onChainChangeBefore?.(chain.id, { isTestnet: chain.isTestnet });
|
|
79
|
+
try {
|
|
80
|
+
const complete = await onChainChange?.(chain);
|
|
81
|
+
if (complete) {
|
|
82
|
+
options.resolve?.(complete);
|
|
83
|
+
options.close?.();
|
|
84
|
+
saveRecentChain(chain);
|
|
85
|
+
changedCallback(chain, true);
|
|
86
|
+
} else {
|
|
87
|
+
setSelectChainId(void 0);
|
|
88
|
+
changedCallback(chain, false);
|
|
89
|
+
}
|
|
90
|
+
} catch (err) {
|
|
91
|
+
changedCallback(chain, false);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
const { selectedTab, onTabChange } = useChainTab(
|
|
95
|
+
chains,
|
|
96
|
+
currentChainId,
|
|
97
|
+
wrongNetwork,
|
|
98
|
+
showTestnet
|
|
99
|
+
);
|
|
100
|
+
return {
|
|
101
|
+
recentChains,
|
|
102
|
+
chains,
|
|
103
|
+
selectChainId,
|
|
104
|
+
onChainClick,
|
|
105
|
+
selectedTab,
|
|
106
|
+
onTabChange,
|
|
107
|
+
showTestnet
|
|
108
|
+
};
|
|
109
|
+
};
|
|
110
|
+
function useChainTab(chains, currentChainId, wrongNetwork, showTestnet) {
|
|
111
|
+
const [selectedTab, setSelectedTab] = useState("Mainnet" /* Mainnet */);
|
|
112
|
+
const onTabChange = (tab) => {
|
|
113
|
+
setSelectedTab(tab);
|
|
114
|
+
};
|
|
115
|
+
useEffect(() => {
|
|
116
|
+
if (!showTestnet) {
|
|
117
|
+
setSelectedTab("Mainnet" /* Mainnet */);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
if (currentChainId) {
|
|
121
|
+
const isMainnet = chains.mainnet?.some(
|
|
122
|
+
(chain) => chain.id === currentChainId
|
|
123
|
+
);
|
|
124
|
+
if (isMainnet) {
|
|
125
|
+
setSelectedTab(wrongNetwork ? "Testnet" /* Testnet */ : "Mainnet" /* Mainnet */);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const isTestnet = chains.testnet?.some(
|
|
129
|
+
(chain) => chain.id === currentChainId
|
|
130
|
+
);
|
|
131
|
+
if (isTestnet) {
|
|
132
|
+
setSelectedTab(wrongNetwork ? "Mainnet" /* Mainnet */ : "Testnet" /* Testnet */);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}, [currentChainId, chains, wrongNetwork, showTestnet]);
|
|
137
|
+
return { selectedTab, onTabChange };
|
|
138
|
+
}
|
|
139
|
+
function useRecentChains(chains) {
|
|
140
|
+
const [recentChainsIds, setRecentChainsIds] = useLocalStorage(
|
|
141
|
+
KEY,
|
|
142
|
+
[]
|
|
143
|
+
);
|
|
144
|
+
const recentChains = useMemo(() => {
|
|
145
|
+
return recentChainsIds?.map(
|
|
146
|
+
(id) => chains.mainnet?.find((item) => item.id === parseInt(id))
|
|
147
|
+
).filter((chains2) => !!chains2);
|
|
148
|
+
}, [chains, recentChainsIds]);
|
|
149
|
+
const saveRecentChain = useCallback(
|
|
150
|
+
(chain) => {
|
|
151
|
+
if (chain.isTestnet) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
let ids = recentChainsIds?.filter((id) => id !== chain.id);
|
|
155
|
+
ids = [chain.id, ...ids].slice(0, MAX_RECENT_CHAINS);
|
|
156
|
+
setRecentChainsIds(ids);
|
|
157
|
+
},
|
|
158
|
+
[recentChainsIds]
|
|
159
|
+
);
|
|
160
|
+
return { recentChains, saveRecentChain };
|
|
161
|
+
}
|
|
162
|
+
var chainSelectorVariants = tv({
|
|
163
|
+
slots: {
|
|
164
|
+
icon: "",
|
|
165
|
+
list: "oui-grid oui-grid-cols-1 oui-gap-1",
|
|
166
|
+
mainnetList: '"',
|
|
167
|
+
testnetList: '"',
|
|
168
|
+
recentList: "",
|
|
169
|
+
item: "oui-w-full oui-rounded-md",
|
|
170
|
+
tip: "oui-text-center"
|
|
171
|
+
},
|
|
172
|
+
variants: {
|
|
173
|
+
variant: {
|
|
174
|
+
compact: {
|
|
175
|
+
icon: "oui-w-6 oui-h-6",
|
|
176
|
+
list: "oui-bg-base-9 oui-rounded-lg oui-p-1",
|
|
177
|
+
mainnetList: "oui-grid-cols-2 oui-mt-4",
|
|
178
|
+
testnetList: "oui-grid-cols-1 oui-mt-4",
|
|
179
|
+
recentList: "oui-mt-4",
|
|
180
|
+
item: "oui-bg-base-6 hover:oui-bg-base-7",
|
|
181
|
+
tip: "oui-pt-6"
|
|
182
|
+
},
|
|
183
|
+
wide: {
|
|
184
|
+
icon: "oui-w-[18px] oui-h-[18px]",
|
|
185
|
+
mainnetList: "oui-grid-cols-3 oui-mt-3",
|
|
186
|
+
testnetList: "oui-grid-cols-2 oui-mt-3",
|
|
187
|
+
recentList: "oui-mt-3",
|
|
188
|
+
item: "oui-bg-base-5 hover:oui-bg-base-6",
|
|
189
|
+
tip: "oui-pt-8"
|
|
190
|
+
}
|
|
191
|
+
},
|
|
192
|
+
selected: {
|
|
193
|
+
true: {
|
|
194
|
+
item: ""
|
|
195
|
+
},
|
|
196
|
+
false: { item: "oui-bg-transparent" }
|
|
197
|
+
}
|
|
198
|
+
},
|
|
199
|
+
compoundVariants: [
|
|
200
|
+
{
|
|
201
|
+
variant: "compact",
|
|
202
|
+
selected: true,
|
|
203
|
+
className: {
|
|
204
|
+
item: "hover:oui-bg-base-6"
|
|
205
|
+
}
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
variant: "wide",
|
|
209
|
+
selected: true,
|
|
210
|
+
className: {
|
|
211
|
+
item: "hover:oui-bg-base-5"
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
],
|
|
215
|
+
defaultVariants: {
|
|
216
|
+
variant: "wide",
|
|
217
|
+
selected: false
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
var ChainSelector = (props) => {
|
|
221
|
+
const { isWrongNetwork, variant = "wide" } = props;
|
|
222
|
+
const { t } = useTranslation();
|
|
223
|
+
const { list, recentList, mainnetList, testnetList, icon, item, tip } = chainSelectorVariants({ variant });
|
|
224
|
+
return /* @__PURE__ */ jsxs(Box, { className: cn("oui-font-semibold", props.className), children: [
|
|
225
|
+
/* @__PURE__ */ jsxs(
|
|
226
|
+
Tabs,
|
|
227
|
+
{
|
|
228
|
+
value: props.selectedTab,
|
|
229
|
+
variant: "contained",
|
|
230
|
+
size: variant === "wide" ? "md" : "lg",
|
|
231
|
+
onValueChange: (e) => props.onTabChange(e),
|
|
232
|
+
children: [
|
|
233
|
+
/* @__PURE__ */ jsxs(TabPanel, { value: "Mainnet" /* Mainnet */, title: t("connector.mainnet"), children: [
|
|
234
|
+
!!props.recentChains?.length && /* @__PURE__ */ jsx(Flex, { gap: 2, className: recentList(), children: props.recentChains?.map((item2) => {
|
|
235
|
+
return /* @__PURE__ */ jsx(
|
|
236
|
+
RecentChainItem,
|
|
237
|
+
{
|
|
238
|
+
item: item2,
|
|
239
|
+
onClick: () => props.onChainClick(item2),
|
|
240
|
+
iconClassName: icon()
|
|
241
|
+
},
|
|
242
|
+
item2.id
|
|
243
|
+
);
|
|
244
|
+
}) }),
|
|
245
|
+
/* @__PURE__ */ jsx(Box, { r: "2xl", className: cn(list(), mainnetList()), children: props.chains.mainnet?.map((chain) => {
|
|
246
|
+
const selected = props.selectChainId === chain.id;
|
|
247
|
+
return /* @__PURE__ */ jsx(
|
|
248
|
+
ChainItem,
|
|
249
|
+
{
|
|
250
|
+
selected,
|
|
251
|
+
item: chain,
|
|
252
|
+
onClick: () => props.onChainClick(chain),
|
|
253
|
+
className: item({ selected })
|
|
254
|
+
},
|
|
255
|
+
chain.id
|
|
256
|
+
);
|
|
257
|
+
}) })
|
|
258
|
+
] }),
|
|
259
|
+
props.showTestnet && /* @__PURE__ */ jsx(TabPanel, { value: "Testnet" /* Testnet */, title: t("connector.testnet"), children: /* @__PURE__ */ jsx(Box, { r: "2xl", className: cn(list(), testnetList()), children: props.chains.testnet?.map((chain) => {
|
|
260
|
+
const selected = props.selectChainId === chain.id;
|
|
261
|
+
return /* @__PURE__ */ jsx(
|
|
262
|
+
ChainItem,
|
|
263
|
+
{
|
|
264
|
+
selected,
|
|
265
|
+
item: chain,
|
|
266
|
+
onClick: () => props.onChainClick(chain),
|
|
267
|
+
className: item({ selected })
|
|
268
|
+
},
|
|
269
|
+
chain.id
|
|
270
|
+
);
|
|
271
|
+
}) }) })
|
|
272
|
+
]
|
|
273
|
+
}
|
|
274
|
+
),
|
|
275
|
+
isWrongNetwork && /* @__PURE__ */ jsx(Box, { className: tip(), children: /* @__PURE__ */ jsx(Text, { color: "warning", size: "xs", children: t("connector.wrongNetwork.tooltip") }) })
|
|
276
|
+
] });
|
|
277
|
+
};
|
|
278
|
+
var ChainItem = (props) => {
|
|
279
|
+
const { item } = props;
|
|
280
|
+
return /* @__PURE__ */ jsx("button", { className: props.className, onClick: props.onClick, children: /* @__PURE__ */ jsxs(Flex, { justify: "between", className: "oui-py-2.5", px: 3, children: [
|
|
281
|
+
/* @__PURE__ */ jsxs(Flex, { itemAlign: "center", width: "100%", className: "oui-gap-x-[6px]", children: [
|
|
282
|
+
/* @__PURE__ */ jsx(ChainIcon, { chainId: item.id, size: "xs" }),
|
|
283
|
+
/* @__PURE__ */ jsx(Text, { size: "2xs", children: item.name })
|
|
284
|
+
] }),
|
|
285
|
+
props.selected && /* @__PURE__ */ jsx(Box, { gradient: "brand", r: "full", width: 4, height: 4 })
|
|
286
|
+
] }) });
|
|
287
|
+
};
|
|
288
|
+
var RecentChainItem = (props) => {
|
|
289
|
+
return /* @__PURE__ */ jsx(
|
|
290
|
+
"button",
|
|
291
|
+
{
|
|
292
|
+
className: "oui-border oui-border-line-12 oui-rounded-lg hover:oui-border-primary-light",
|
|
293
|
+
onClick: props.onClick,
|
|
294
|
+
children: /* @__PURE__ */ jsx(Flex, { itemAlign: "center", p: 2, children: /* @__PURE__ */ jsx(ChainIcon, { chainId: props.item.id, className: props.iconClassName }) })
|
|
295
|
+
}
|
|
296
|
+
);
|
|
297
|
+
};
|
|
298
|
+
var ChainSelectorWidget = (props) => {
|
|
299
|
+
const state = useChainSelectorScript(props);
|
|
300
|
+
return /* @__PURE__ */ jsx(
|
|
301
|
+
ChainSelector,
|
|
302
|
+
{
|
|
303
|
+
...state,
|
|
304
|
+
variant: props.variant,
|
|
305
|
+
isWrongNetwork: props.isWrongNetwork
|
|
306
|
+
}
|
|
307
|
+
);
|
|
308
|
+
};
|
|
309
|
+
var ChainSelectorDialogId = "ChainSelectorDialogId";
|
|
310
|
+
var ChainSelectorSheetId = "ChainSelectorSheetId";
|
|
311
|
+
registerSimpleDialog(ChainSelectorDialogId, ChainSelectorWidget, {
|
|
312
|
+
size: "lg",
|
|
313
|
+
title: () => i18n.t("connector.switchNetwork"),
|
|
314
|
+
variant: "wide",
|
|
315
|
+
isWrongNetwork: true
|
|
316
|
+
});
|
|
317
|
+
registerSimpleSheet(ChainSelectorSheetId, ChainSelectorWidget, {
|
|
318
|
+
title: () => i18n.t("connector.switchNetwork"),
|
|
319
|
+
classNames: {
|
|
320
|
+
content: "!oui-bg-base-8",
|
|
321
|
+
body: "!oui-bg-base-8"
|
|
322
|
+
},
|
|
323
|
+
variant: "compact",
|
|
324
|
+
isWrongNetwork: true
|
|
325
|
+
});
|
|
9
326
|
|
|
10
|
-
export {
|
|
327
|
+
export { ChainSelectorDialogId, ChainSelectorSheetId, ChainSelectorWidget };
|
|
11
328
|
//# sourceMappingURL=out.js.map
|
|
12
329
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/chainSelector.widget.tsx","../src/chainSelector.script.ts","../src/chainSelector.ui.tsx"],"names":["registerSimpleDialog","registerSimpleSheet","useMemo","useCallback","useState","useEffect","useConfig","useStorageChain","useChains","useWalletConnector","useLocalStorage","useAppContext","useOrderlyTheme","KEY","MAX_RECENT_CHAINS","useChainSelectorScript","options","networkId","bridgeLessOnly","setStorageChain","config","_chains","checkChainSupport","setChain","connectedChain","onChainChanged","currentChainId","setCurrentChainId","wrongNetwork","selectChainId","setSelectChainId","getComponentTheme","chains","chain","showTestnet","recentChains","saveRecentChain","useRecentChains","onChainChange","result","changedCallback","isWalletConnected","params","onChainClick","complete","selectedTab","onTabChange","useChainTab","setSelectedTab","tab","recentChainsIds","setRecentChainsIds","id","item","ids","Box","Flex","Text","ChainIcon","Tabs","TabPanel","cn","tv","useTranslation","jsx","jsxs","chainSelectorVariants","ChainSelector","props","isWrongNetwork","variant","t","list","recentList","mainnetList","testnetList","icon","tip","e","RecentChainItem","selected","ChainItem","i18n","ChainSelectorWidget","state","ChainSelectorDialogId","ChainSelectorSheetId"],"mappings":"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","sourcesContent":["import { registerSimpleDialog, registerSimpleSheet } from \"@kodiak-finance/orderly-ui\";\nimport {\n useChainSelectorScript,\n UseChainSelectorScriptOptions,\n} from \"./chainSelector.script\";\nimport { ChainSelector, ChainSelectorProps } from \"./chainSelector.ui\";\nimport { i18n } from \"@kodiak-finance/orderly-i18n\";\n\nexport type ChainSelectorWidgetProps = UseChainSelectorScriptOptions &\n Pick<ChainSelectorProps, \"isWrongNetwork\" | \"variant\" | \"className\">;\n\nexport const ChainSelectorWidget = (props: ChainSelectorWidgetProps) => {\n const state = useChainSelectorScript(props);\n\n return (\n <ChainSelector\n {...state}\n variant={props.variant}\n isWrongNetwork={props.isWrongNetwork}\n />\n );\n};\n\nexport const ChainSelectorDialogId = \"ChainSelectorDialogId\";\nexport const ChainSelectorSheetId = \"ChainSelectorSheetId\";\n\nregisterSimpleDialog(ChainSelectorDialogId, ChainSelectorWidget, {\n size: \"lg\",\n title: () => i18n.t(\"connector.switchNetwork\"),\n variant: \"wide\",\n isWrongNetwork: true,\n});\n\nregisterSimpleSheet(ChainSelectorSheetId, ChainSelectorWidget, {\n title: () => i18n.t(\"connector.switchNetwork\"),\n classNames: {\n content: \"!oui-bg-base-8\",\n body: \"!oui-bg-base-8\",\n },\n variant: \"compact\",\n isWrongNetwork: true,\n});\n","import { useMemo, useCallback, useState, useEffect } from \"react\";\nimport { useConfig, useStorageChain } from \"@kodiak-finance/orderly-hooks\";\nimport {\n useChains,\n useWalletConnector,\n useLocalStorage,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { NetworkId } from \"@kodiak-finance/orderly-types\";\nimport { useAppContext } from \"@kodiak-finance/orderly-react-app\";\nimport { ChainType, TChainItem } from \"./type\";\nimport { useOrderlyTheme } from \"@kodiak-finance/orderly-ui\";\n\nconst KEY = \"orderly_selected_chains\";\nconst MAX_RECENT_CHAINS = 6;\n\nexport type UseChainSelectorScriptReturn = ReturnType<\n typeof useChainSelectorScript\n>;\n\nexport type UseChainSelectorScriptOptions = {\n networkId?: NetworkId;\n bridgeLessOnly?: boolean;\n close?: () => void;\n resolve?: (isSuccess: boolean) => void;\n reject?: () => void;\n onChainChangeBefore?: (\n chainId: number,\n state: {\n isTestnet: boolean;\n }\n ) => void;\n onChainChangeAfter?: (\n chainId: number,\n state: {\n isTestnet: boolean;\n isWalletConnected: boolean;\n }\n ) => void;\n};\n\nexport const useChainSelectorScript = (\n options: UseChainSelectorScriptOptions\n) => {\n const { networkId, bridgeLessOnly } = options || {};\n const { setStorageChain } = useStorageChain();\n\n const config = useConfig();\n const [_chains, { checkChainSupport }] = useChains();\n const { setChain, connectedChain } = useWalletConnector();\n\n const { onChainChanged, currentChainId, setCurrentChainId, wrongNetwork } =\n useAppContext();\n\n const [selectChainId, setSelectChainId] = useState<number | undefined>(\n currentChainId\n );\n\n const { getComponentTheme } = useOrderlyTheme();\n\n const chains = useMemo(() => {\n const bridgeLessChains = bridgeLessOnly\n ? _chains.mainnet.filter((chain) => chain.network_infos.bridgeless)\n : _chains.mainnet;\n\n return {\n mainnet: bridgeLessChains.map((chain) => ({\n name: chain.network_infos.name,\n id: chain.network_infos.chain_id,\n lowestFee: chain.network_infos.bridgeless,\n isTestnet: false,\n })),\n testnet: _chains.testnet.map((chain) => ({\n name: chain.network_infos.name,\n id: chain.network_infos.chain_id,\n lowestFee: chain.network_infos.bridgeless,\n isTestnet: true,\n })),\n };\n }, [_chains, bridgeLessOnly]);\n\n const showTestnet = useMemo(() => {\n const chainSelectorOverrides = getComponentTheme(\"chainSelector\", {\n showTestnet: true,\n });\n\n if (\n chainSelectorOverrides.showTestnet === false ||\n !chains.testnet.length\n ) {\n return false;\n }\n\n return true;\n }, [chains.testnet]);\n\n const { recentChains, saveRecentChain } = useRecentChains(chains);\n\n const onChainChange = async (chain: TChainItem) => {\n if (connectedChain) {\n const result = await setChain({ chainId: chain.id });\n\n if (!result) return result;\n\n return {\n result,\n wrongNetwork: !checkChainSupport(chain.id, config.get(\"networkId\")),\n chainId: chain.id,\n };\n }\n\n setStorageChain(chain.id);\n\n setCurrentChainId(chain.id);\n return {\n result: true,\n wrongNetwork: false,\n chainId: chain.id,\n };\n // return Promise.reject(\"No connected chain\");\n };\n\n const changedCallback = (chain: TChainItem, isWalletConnected: boolean) => {\n const params = {\n isTestnet: chain.isTestnet,\n isWalletConnected,\n };\n options.onChainChangeAfter?.(chain.id, params);\n onChainChanged?.(chain.id, params);\n };\n\n const onChainClick = async (chain: TChainItem) => {\n setSelectChainId(chain.id);\n options.onChainChangeBefore?.(chain.id, { isTestnet: chain.isTestnet });\n try {\n const complete = await onChainChange?.(chain);\n\n if (complete) {\n options.resolve?.(complete);\n options.close?.();\n saveRecentChain(chain);\n changedCallback(chain, true);\n } else {\n setSelectChainId(undefined);\n changedCallback(chain, false);\n }\n } catch (err) {\n changedCallback(chain, false);\n }\n };\n\n const { selectedTab, onTabChange } = useChainTab(\n chains,\n currentChainId,\n wrongNetwork,\n showTestnet\n );\n\n return {\n recentChains,\n chains,\n selectChainId,\n onChainClick,\n selectedTab,\n onTabChange,\n showTestnet,\n };\n};\n\nfunction useChainTab(\n chains: Record<NetworkId, TChainItem[]>,\n currentChainId?: number,\n wrongNetwork?: boolean,\n showTestnet?: boolean\n) {\n const [selectedTab, setSelectedTab] = useState<ChainType>(ChainType.Mainnet);\n\n const onTabChange = (tab: ChainType) => {\n setSelectedTab(tab);\n };\n\n useEffect(() => {\n if (!showTestnet) {\n setSelectedTab(ChainType.Mainnet);\n return;\n }\n\n if (currentChainId) {\n const isMainnet = chains.mainnet?.some(\n (chain) => chain.id === currentChainId\n );\n if (isMainnet) {\n setSelectedTab(wrongNetwork ? ChainType.Testnet : ChainType.Mainnet);\n return;\n }\n\n const isTestnet = chains.testnet?.some(\n (chain) => chain.id === currentChainId\n );\n if (isTestnet) {\n setSelectedTab(wrongNetwork ? ChainType.Mainnet : ChainType.Testnet);\n return;\n }\n }\n }, [currentChainId, chains, wrongNetwork, showTestnet]);\n\n return { selectedTab, onTabChange };\n}\n\nfunction useRecentChains(chains: Record<NetworkId, TChainItem[]>) {\n const [recentChainsIds, setRecentChainsIds] = useLocalStorage<string[]>(\n KEY,\n []\n );\n\n const recentChains = useMemo<TChainItem[]>(() => {\n return recentChainsIds\n ?.map((id: string) =>\n chains.mainnet?.find((item) => item.id === parseInt(id))\n )\n .filter((chains: TChainItem) => !!chains);\n }, [chains, recentChainsIds]);\n\n const saveRecentChain = useCallback(\n (chain: TChainItem) => {\n // only mainnet can save chain id to local storage\n if (chain.isTestnet) {\n return;\n }\n let ids = recentChainsIds?.filter((id: number) => id !== chain.id);\n ids = [chain.id, ...ids].slice(0, MAX_RECENT_CHAINS);\n setRecentChainsIds(ids);\n },\n [recentChainsIds]\n );\n\n return { recentChains, saveRecentChain };\n}\n","import {\n Box,\n Flex,\n Text,\n ChainIcon,\n Tabs,\n TabPanel,\n cn,\n tv,\n} from \"@kodiak-finance/orderly-ui\";\nimport { ChainType, TChainItem } from \"./type\";\nimport { UseChainSelectorScriptReturn } from \"./chainSelector.script\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\n\nexport type ChainSelectorProps = {\n isWrongNetwork?: boolean;\n /**\n * wide: This represents the wide screen (desktop) UI mode\n * compact: This indicates a compact (mobile) UI pattern.\n */\n variant?: \"wide\" | \"compact\";\n className?: string;\n} & UseChainSelectorScriptReturn;\n\nconst chainSelectorVariants = tv({\n slots: {\n icon: \"\",\n list: \"oui-grid oui-grid-cols-1 oui-gap-1\",\n mainnetList: '\"',\n testnetList: '\"',\n recentList: \"\",\n item: \"oui-w-full oui-rounded-md\",\n tip: \"oui-text-center\",\n },\n variants: {\n variant: {\n compact: {\n icon: \"oui-w-6 oui-h-6\",\n list: \"oui-bg-base-9 oui-rounded-lg oui-p-1\",\n mainnetList: \"oui-grid-cols-2 oui-mt-4\",\n testnetList: \"oui-grid-cols-1 oui-mt-4\",\n recentList: \"oui-mt-4\",\n item: \"oui-bg-base-6 hover:oui-bg-base-7\",\n tip: \"oui-pt-6\",\n },\n wide: {\n icon: \"oui-w-[18px] oui-h-[18px]\",\n mainnetList: \"oui-grid-cols-3 oui-mt-3\",\n testnetList: \"oui-grid-cols-2 oui-mt-3\",\n recentList: \"oui-mt-3\",\n item: \"oui-bg-base-5 hover:oui-bg-base-6\",\n tip: \"oui-pt-8\",\n },\n },\n selected: {\n true: {\n item: \"\",\n },\n false: { item: \"oui-bg-transparent\" },\n },\n },\n compoundVariants: [\n {\n variant: \"compact\",\n selected: true,\n className: {\n item: \"hover:oui-bg-base-6\",\n },\n },\n {\n variant: \"wide\",\n selected: true,\n className: {\n item: \"hover:oui-bg-base-5\",\n },\n },\n ],\n defaultVariants: {\n variant: \"wide\",\n selected: false,\n },\n});\n\n//------------------ ChainSelector start ------------------\nexport const ChainSelector = (props: ChainSelectorProps) => {\n const { isWrongNetwork, variant = \"wide\" } = props;\n const { t } = useTranslation();\n const { list, recentList, mainnetList, testnetList, icon, item, tip } =\n chainSelectorVariants({ variant });\n\n return (\n <Box className={cn(\"oui-font-semibold\", props.className)}>\n <Tabs\n value={props.selectedTab}\n variant=\"contained\"\n size={variant === \"wide\" ? \"md\" : \"lg\"}\n onValueChange={(e) => props.onTabChange(e as ChainType)}\n >\n <TabPanel value={ChainType.Mainnet} title={t(\"connector.mainnet\")}>\n {!!props.recentChains?.length && (\n <Flex gap={2} className={recentList()}>\n {props.recentChains?.map((item) => {\n return (\n <RecentChainItem\n key={item.id}\n item={item}\n onClick={() => props.onChainClick(item)}\n iconClassName={icon()}\n />\n );\n })}\n </Flex>\n )}\n\n <Box r=\"2xl\" className={cn(list(), mainnetList())}>\n {props.chains.mainnet?.map((chain) => {\n const selected = props.selectChainId === chain.id;\n return (\n <ChainItem\n key={chain.id}\n selected={selected}\n item={chain}\n onClick={() => props.onChainClick(chain)}\n className={item({ selected })}\n />\n );\n })}\n </Box>\n </TabPanel>\n\n {props.showTestnet && (\n <TabPanel value={ChainType.Testnet} title={t(\"connector.testnet\")}>\n <Box r=\"2xl\" className={cn(list(), testnetList())}>\n {props.chains.testnet?.map((chain) => {\n const selected = props.selectChainId === chain.id;\n return (\n <ChainItem\n key={chain.id}\n selected={selected}\n item={chain}\n onClick={() => props.onChainClick(chain)}\n className={item({ selected })}\n />\n );\n })}\n </Box>\n </TabPanel>\n )}\n </Tabs>\n\n {isWrongNetwork && (\n <Box className={tip()}>\n <Text color=\"warning\" size=\"xs\">\n {t(\"connector.wrongNetwork.tooltip\")}\n </Text>\n </Box>\n )}\n </Box>\n );\n};\n// ------------------ ChainSelector end ------------------\n\n// ------------------ ChainItem start ------------------\nexport const ChainItem = (props: {\n selected: boolean;\n item: TChainItem;\n onClick?: () => void;\n className?: string;\n}) => {\n const { item } = props;\n return (\n <button className={props.className} onClick={props.onClick}>\n <Flex justify=\"between\" className=\"oui-py-2.5\" px={3}>\n <Flex itemAlign=\"center\" width=\"100%\" className=\"oui-gap-x-[6px]\">\n <ChainIcon chainId={item.id} size=\"xs\" />\n <Text size=\"2xs\">{item.name}</Text>\n </Flex>\n {props.selected && (\n <Box gradient=\"brand\" r=\"full\" width={4} height={4} />\n )}\n </Flex>\n </button>\n );\n};\n\n// ------------------ Recent ChainItem start ------------------\nexport const RecentChainItem = (props: {\n item: TChainItem;\n onClick?: () => void;\n iconClassName?: string;\n}) => {\n return (\n <button\n className=\"oui-border oui-border-line-12 oui-rounded-lg hover:oui-border-primary-light\"\n onClick={props.onClick}\n >\n <Flex itemAlign=\"center\" p={2}>\n <ChainIcon chainId={props.item.id} className={props.iconClassName} />\n </Flex>\n </button>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/chainSelector.widget.tsx","../src/chainSelector.script.ts","../src/chainSelector.ui.tsx"],"names":["chains","item","jsx"],"mappings":"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","sourcesContent":["import { registerSimpleDialog, registerSimpleSheet } from \"@kodiak-finance/orderly-ui\";\nimport {\n useChainSelectorScript,\n UseChainSelectorScriptOptions,\n} from \"./chainSelector.script\";\nimport { ChainSelector, ChainSelectorProps } from \"./chainSelector.ui\";\nimport { i18n } from \"@kodiak-finance/orderly-i18n\";\n\nexport type ChainSelectorWidgetProps = UseChainSelectorScriptOptions &\n Pick<ChainSelectorProps, \"isWrongNetwork\" | \"variant\" | \"className\">;\n\nexport const ChainSelectorWidget = (props: ChainSelectorWidgetProps) => {\n const state = useChainSelectorScript(props);\n\n return (\n <ChainSelector\n {...state}\n variant={props.variant}\n isWrongNetwork={props.isWrongNetwork}\n />\n );\n};\n\nexport const ChainSelectorDialogId = \"ChainSelectorDialogId\";\nexport const ChainSelectorSheetId = \"ChainSelectorSheetId\";\n\nregisterSimpleDialog(ChainSelectorDialogId, ChainSelectorWidget, {\n size: \"lg\",\n title: () => i18n.t(\"connector.switchNetwork\"),\n variant: \"wide\",\n isWrongNetwork: true,\n});\n\nregisterSimpleSheet(ChainSelectorSheetId, ChainSelectorWidget, {\n title: () => i18n.t(\"connector.switchNetwork\"),\n classNames: {\n content: \"!oui-bg-base-8\",\n body: \"!oui-bg-base-8\",\n },\n variant: \"compact\",\n isWrongNetwork: true,\n});\n","import { useMemo, useCallback, useState, useEffect } from \"react\";\nimport { useConfig, useStorageChain } from \"@kodiak-finance/orderly-hooks\";\nimport {\n useChains,\n useWalletConnector,\n useLocalStorage,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { NetworkId } from \"@kodiak-finance/orderly-types\";\nimport { useAppContext } from \"@kodiak-finance/orderly-react-app\";\nimport { ChainType, TChainItem } from \"./type\";\nimport { useOrderlyTheme } from \"@kodiak-finance/orderly-ui\";\n\nconst KEY = \"orderly_selected_chains\";\nconst MAX_RECENT_CHAINS = 6;\n\nexport type UseChainSelectorScriptReturn = ReturnType<\n typeof useChainSelectorScript\n>;\n\nexport type UseChainSelectorScriptOptions = {\n networkId?: NetworkId;\n bridgeLessOnly?: boolean;\n close?: () => void;\n resolve?: (isSuccess: boolean) => void;\n reject?: () => void;\n onChainChangeBefore?: (\n chainId: number,\n state: {\n isTestnet: boolean;\n }\n ) => void;\n onChainChangeAfter?: (\n chainId: number,\n state: {\n isTestnet: boolean;\n isWalletConnected: boolean;\n }\n ) => void;\n};\n\nexport const useChainSelectorScript = (\n options: UseChainSelectorScriptOptions\n) => {\n const { networkId, bridgeLessOnly } = options || {};\n const { setStorageChain } = useStorageChain();\n\n const config = useConfig();\n const [_chains, { checkChainSupport }] = useChains();\n const { setChain, connectedChain } = useWalletConnector();\n\n const { onChainChanged, currentChainId, setCurrentChainId, wrongNetwork } =\n useAppContext();\n\n const [selectChainId, setSelectChainId] = useState<number | undefined>(\n currentChainId\n );\n\n const { getComponentTheme } = useOrderlyTheme();\n\n const chains = useMemo(() => {\n const bridgeLessChains = bridgeLessOnly\n ? _chains.mainnet.filter((chain) => chain.network_infos.bridgeless)\n : _chains.mainnet;\n\n return {\n mainnet: bridgeLessChains.map((chain) => ({\n name: chain.network_infos.name,\n id: chain.network_infos.chain_id,\n lowestFee: chain.network_infos.bridgeless,\n isTestnet: false,\n })),\n testnet: _chains.testnet.map((chain) => ({\n name: chain.network_infos.name,\n id: chain.network_infos.chain_id,\n lowestFee: chain.network_infos.bridgeless,\n isTestnet: true,\n })),\n };\n }, [_chains, bridgeLessOnly]);\n\n const showTestnet = useMemo(() => {\n const chainSelectorOverrides = getComponentTheme(\"chainSelector\", {\n showTestnet: true,\n });\n\n if (\n chainSelectorOverrides.showTestnet === false ||\n !chains.testnet.length\n ) {\n return false;\n }\n\n return true;\n }, [chains.testnet]);\n\n const { recentChains, saveRecentChain } = useRecentChains(chains);\n\n const onChainChange = async (chain: TChainItem) => {\n if (connectedChain) {\n const result = await setChain({ chainId: chain.id });\n\n if (!result) return result;\n\n return {\n result,\n wrongNetwork: !checkChainSupport(chain.id, config.get(\"networkId\")),\n chainId: chain.id,\n };\n }\n\n setStorageChain(chain.id);\n\n setCurrentChainId(chain.id);\n return {\n result: true,\n wrongNetwork: false,\n chainId: chain.id,\n };\n // return Promise.reject(\"No connected chain\");\n };\n\n const changedCallback = (chain: TChainItem, isWalletConnected: boolean) => {\n const params = {\n isTestnet: chain.isTestnet,\n isWalletConnected,\n };\n options.onChainChangeAfter?.(chain.id, params);\n onChainChanged?.(chain.id, params);\n };\n\n const onChainClick = async (chain: TChainItem) => {\n setSelectChainId(chain.id);\n options.onChainChangeBefore?.(chain.id, { isTestnet: chain.isTestnet });\n try {\n const complete = await onChainChange?.(chain);\n\n if (complete) {\n options.resolve?.(complete);\n options.close?.();\n saveRecentChain(chain);\n changedCallback(chain, true);\n } else {\n setSelectChainId(undefined);\n changedCallback(chain, false);\n }\n } catch (err) {\n changedCallback(chain, false);\n }\n };\n\n const { selectedTab, onTabChange } = useChainTab(\n chains,\n currentChainId,\n wrongNetwork,\n showTestnet\n );\n\n return {\n recentChains,\n chains,\n selectChainId,\n onChainClick,\n selectedTab,\n onTabChange,\n showTestnet,\n };\n};\n\nfunction useChainTab(\n chains: Record<NetworkId, TChainItem[]>,\n currentChainId?: number,\n wrongNetwork?: boolean,\n showTestnet?: boolean\n) {\n const [selectedTab, setSelectedTab] = useState<ChainType>(ChainType.Mainnet);\n\n const onTabChange = (tab: ChainType) => {\n setSelectedTab(tab);\n };\n\n useEffect(() => {\n if (!showTestnet) {\n setSelectedTab(ChainType.Mainnet);\n return;\n }\n\n if (currentChainId) {\n const isMainnet = chains.mainnet?.some(\n (chain) => chain.id === currentChainId\n );\n if (isMainnet) {\n setSelectedTab(wrongNetwork ? ChainType.Testnet : ChainType.Mainnet);\n return;\n }\n\n const isTestnet = chains.testnet?.some(\n (chain) => chain.id === currentChainId\n );\n if (isTestnet) {\n setSelectedTab(wrongNetwork ? ChainType.Mainnet : ChainType.Testnet);\n return;\n }\n }\n }, [currentChainId, chains, wrongNetwork, showTestnet]);\n\n return { selectedTab, onTabChange };\n}\n\nfunction useRecentChains(chains: Record<NetworkId, TChainItem[]>) {\n const [recentChainsIds, setRecentChainsIds] = useLocalStorage<string[]>(\n KEY,\n []\n );\n\n const recentChains = useMemo<TChainItem[]>(() => {\n return recentChainsIds\n ?.map((id: string) =>\n chains.mainnet?.find((item) => item.id === parseInt(id))\n )\n .filter((chains: TChainItem) => !!chains);\n }, [chains, recentChainsIds]);\n\n const saveRecentChain = useCallback(\n (chain: TChainItem) => {\n // only mainnet can save chain id to local storage\n if (chain.isTestnet) {\n return;\n }\n let ids = recentChainsIds?.filter((id: number) => id !== chain.id);\n ids = [chain.id, ...ids].slice(0, MAX_RECENT_CHAINS);\n setRecentChainsIds(ids);\n },\n [recentChainsIds]\n );\n\n return { recentChains, saveRecentChain };\n}\n","import {\n Box,\n Flex,\n Text,\n ChainIcon,\n Tabs,\n TabPanel,\n cn,\n tv,\n} from \"@kodiak-finance/orderly-ui\";\nimport { ChainType, TChainItem } from \"./type\";\nimport { UseChainSelectorScriptReturn } from \"./chainSelector.script\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\n\nexport type ChainSelectorProps = {\n isWrongNetwork?: boolean;\n /**\n * wide: This represents the wide screen (desktop) UI mode\n * compact: This indicates a compact (mobile) UI pattern.\n */\n variant?: \"wide\" | \"compact\";\n className?: string;\n} & UseChainSelectorScriptReturn;\n\nconst chainSelectorVariants = tv({\n slots: {\n icon: \"\",\n list: \"oui-grid oui-grid-cols-1 oui-gap-1\",\n mainnetList: '\"',\n testnetList: '\"',\n recentList: \"\",\n item: \"oui-w-full oui-rounded-md\",\n tip: \"oui-text-center\",\n },\n variants: {\n variant: {\n compact: {\n icon: \"oui-w-6 oui-h-6\",\n list: \"oui-bg-base-9 oui-rounded-lg oui-p-1\",\n mainnetList: \"oui-grid-cols-2 oui-mt-4\",\n testnetList: \"oui-grid-cols-1 oui-mt-4\",\n recentList: \"oui-mt-4\",\n item: \"oui-bg-base-6 hover:oui-bg-base-7\",\n tip: \"oui-pt-6\",\n },\n wide: {\n icon: \"oui-w-[18px] oui-h-[18px]\",\n mainnetList: \"oui-grid-cols-3 oui-mt-3\",\n testnetList: \"oui-grid-cols-2 oui-mt-3\",\n recentList: \"oui-mt-3\",\n item: \"oui-bg-base-5 hover:oui-bg-base-6\",\n tip: \"oui-pt-8\",\n },\n },\n selected: {\n true: {\n item: \"\",\n },\n false: { item: \"oui-bg-transparent\" },\n },\n },\n compoundVariants: [\n {\n variant: \"compact\",\n selected: true,\n className: {\n item: \"hover:oui-bg-base-6\",\n },\n },\n {\n variant: \"wide\",\n selected: true,\n className: {\n item: \"hover:oui-bg-base-5\",\n },\n },\n ],\n defaultVariants: {\n variant: \"wide\",\n selected: false,\n },\n});\n\n//------------------ ChainSelector start ------------------\nexport const ChainSelector = (props: ChainSelectorProps) => {\n const { isWrongNetwork, variant = \"wide\" } = props;\n const { t } = useTranslation();\n const { list, recentList, mainnetList, testnetList, icon, item, tip } =\n chainSelectorVariants({ variant });\n\n return (\n <Box className={cn(\"oui-font-semibold\", props.className)}>\n <Tabs\n value={props.selectedTab}\n variant=\"contained\"\n size={variant === \"wide\" ? \"md\" : \"lg\"}\n onValueChange={(e) => props.onTabChange(e as ChainType)}\n >\n <TabPanel value={ChainType.Mainnet} title={t(\"connector.mainnet\")}>\n {!!props.recentChains?.length && (\n <Flex gap={2} className={recentList()}>\n {props.recentChains?.map((item) => {\n return (\n <RecentChainItem\n key={item.id}\n item={item}\n onClick={() => props.onChainClick(item)}\n iconClassName={icon()}\n />\n );\n })}\n </Flex>\n )}\n\n <Box r=\"2xl\" className={cn(list(), mainnetList())}>\n {props.chains.mainnet?.map((chain) => {\n const selected = props.selectChainId === chain.id;\n return (\n <ChainItem\n key={chain.id}\n selected={selected}\n item={chain}\n onClick={() => props.onChainClick(chain)}\n className={item({ selected })}\n />\n );\n })}\n </Box>\n </TabPanel>\n\n {props.showTestnet && (\n <TabPanel value={ChainType.Testnet} title={t(\"connector.testnet\")}>\n <Box r=\"2xl\" className={cn(list(), testnetList())}>\n {props.chains.testnet?.map((chain) => {\n const selected = props.selectChainId === chain.id;\n return (\n <ChainItem\n key={chain.id}\n selected={selected}\n item={chain}\n onClick={() => props.onChainClick(chain)}\n className={item({ selected })}\n />\n );\n })}\n </Box>\n </TabPanel>\n )}\n </Tabs>\n\n {isWrongNetwork && (\n <Box className={tip()}>\n <Text color=\"warning\" size=\"xs\">\n {t(\"connector.wrongNetwork.tooltip\")}\n </Text>\n </Box>\n )}\n </Box>\n );\n};\n// ------------------ ChainSelector end ------------------\n\n// ------------------ ChainItem start ------------------\nexport const ChainItem = (props: {\n selected: boolean;\n item: TChainItem;\n onClick?: () => void;\n className?: string;\n}) => {\n const { item } = props;\n return (\n <button className={props.className} onClick={props.onClick}>\n <Flex justify=\"between\" className=\"oui-py-2.5\" px={3}>\n <Flex itemAlign=\"center\" width=\"100%\" className=\"oui-gap-x-[6px]\">\n <ChainIcon chainId={item.id} size=\"xs\" />\n <Text size=\"2xs\">{item.name}</Text>\n </Flex>\n {props.selected && (\n <Box gradient=\"brand\" r=\"full\" width={4} height={4} />\n )}\n </Flex>\n </button>\n );\n};\n\n// ------------------ Recent ChainItem start ------------------\nexport const RecentChainItem = (props: {\n item: TChainItem;\n onClick?: () => void;\n iconClassName?: string;\n}) => {\n return (\n <button\n className=\"oui-border oui-border-line-12 oui-rounded-lg hover:oui-border-primary-light\"\n onClick={props.onClick}\n >\n <Flex itemAlign=\"center\" p={2}>\n <ChainIcon chainId={props.item.id} className={props.iconClassName} />\n </Flex>\n </button>\n );\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kodiak-finance/orderly-ui-chain-selector",
|
|
3
|
-
"version": "2.8.
|
|
3
|
+
"version": "2.8.19",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -14,11 +14,11 @@
|
|
|
14
14
|
"access": "public"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@kodiak-finance/orderly-i18n": "2.8.
|
|
18
|
-
"@kodiak-finance/orderly-hooks": "2.8.
|
|
19
|
-
"@kodiak-finance/orderly-types": "2.8.
|
|
20
|
-
"@kodiak-finance/orderly-ui": "2.8.
|
|
21
|
-
"@kodiak-finance/orderly-react-app": "2.8.
|
|
17
|
+
"@kodiak-finance/orderly-i18n": "2.8.19",
|
|
18
|
+
"@kodiak-finance/orderly-hooks": "2.8.19",
|
|
19
|
+
"@kodiak-finance/orderly-types": "2.8.19",
|
|
20
|
+
"@kodiak-finance/orderly-ui": "2.8.19",
|
|
21
|
+
"@kodiak-finance/orderly-react-app": "2.8.19"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
24
|
"@types/react": "^18.3.2",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"tailwindcss": "^3.4.4",
|
|
31
31
|
"typescript": "^5.1.6",
|
|
32
32
|
"tsup": "^7.1.0",
|
|
33
|
-
"tsconfig": "0.11.
|
|
33
|
+
"tsconfig": "0.11.18"
|
|
34
34
|
},
|
|
35
35
|
"peerDependencies": {
|
|
36
36
|
"react": ">=18",
|