@gluwa/connect-kit 0.2.0-next.7 → 0.2.0-next.9
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 +17 -0
- package/dist/{chunk-EDNRW47A.js → chunk-VE5LB7BN.js} +4 -0
- package/dist/credit-connect.js +1 -1
- package/dist/index.css +33 -34
- package/dist/index.js +212 -82
- package/dist/package.json +1 -1
- package/package.json +6 -6
- package/src/components/qrArea/index.tsx +3 -1
- package/src/components/qrArea/style.scss +25 -33
- package/src/creditConnectConnector.ts +6 -0
- package/src/hooks/useConnectTimeout.ts +82 -0
- package/src/hooks/useMetaMaskExtension.ts +29 -0
- package/src/hooks/useWCState.ts +7 -8
- package/src/hooks/useWagmiConnect.ts +9 -7
- package/src/layout/allWallets/index.tsx +1 -1
- package/src/layout/allWallets/style.scss +2 -7
- package/src/layout/connectDialog/index.tsx +74 -11
- package/src/layout/connectDialog/style.scss +2 -1
- package/src/layout/detailPanel/index.tsx +4 -1
- package/src/layout/detailPanel/style.scss +5 -0
- package/src/utils/platform.ts +0 -4
- package/src/wallet-display-override.ts +15 -0
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import React from "react";
|
|
|
2
2
|
import {
|
|
3
3
|
__name,
|
|
4
4
|
creditConnectConnector
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-VE5LB7BN.js";
|
|
6
6
|
|
|
7
7
|
// src/api/contract.ts
|
|
8
8
|
import { readContract as wagmiReadContract, writeContract as wagmiWriteContract } from "@wagmi/core";
|
|
@@ -194,13 +194,13 @@ var disconnectAll = /* @__PURE__ */ __name(async (onLog) => {
|
|
|
194
194
|
}, "disconnectAll");
|
|
195
195
|
|
|
196
196
|
// src/ConnectKitProvider.tsx
|
|
197
|
-
import { createContext, useCallback as
|
|
197
|
+
import { createContext, useCallback as useCallback4, useContext, useEffect as useEffect6, useMemo as useMemo2, useRef as useRef5, useState as useState6 } from "react";
|
|
198
198
|
import { WagmiProvider, useAccount, useConfig as useConfig3, useDisconnect, useSwitchChain } from "wagmi";
|
|
199
199
|
import { getAccount as getAccount2 } from "@wagmi/core";
|
|
200
200
|
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
|
201
201
|
|
|
202
202
|
// src/layout/connectDialog/index.tsx
|
|
203
|
-
import { useEffect as
|
|
203
|
+
import { useEffect as useEffect5, useRef as useRef4, useState as useState5 } from "react";
|
|
204
204
|
import { useConfig as useConfig2 } from "wagmi";
|
|
205
205
|
|
|
206
206
|
// src/layout/connectDialog/asset/closeIcon.tsx
|
|
@@ -504,7 +504,9 @@ var QrArea = /* @__PURE__ */ __name(({ uri, status, logoUrl, hasBg = false, labe
|
|
|
504
504
|
className: "ck-qr-skeleton",
|
|
505
505
|
"aria-busy": "true",
|
|
506
506
|
"aria-label": "Loading QR code"
|
|
507
|
-
}
|
|
507
|
+
}, /* @__PURE__ */ React.createElement("div", {
|
|
508
|
+
className: "ck-qr-skeleton-inner"
|
|
509
|
+
})), status === "ready" && uri && /* @__PURE__ */ React.createElement("div", {
|
|
508
510
|
className: "ck-qr-frame",
|
|
509
511
|
style: {
|
|
510
512
|
"background": bgColor,
|
|
@@ -869,7 +871,7 @@ var AllWallets = /* @__PURE__ */ __name(({ wallets, isLoading, onSelectWallet })
|
|
|
869
871
|
}))), !isLoading && filtered.length === 0 ? /* @__PURE__ */ React.createElement("div", {
|
|
870
872
|
className: "ck-all-wallets-empty",
|
|
871
873
|
role: "status"
|
|
872
|
-
}, /* @__PURE__ */ React.createElement("p", null, "No
|
|
874
|
+
}, /* @__PURE__ */ React.createElement("p", null, "No Wallet found")) : /* @__PURE__ */ React.createElement(WalletGrid, {
|
|
873
875
|
wallets: filtered,
|
|
874
876
|
isLoading,
|
|
875
877
|
onSelect: onSelectWallet
|
|
@@ -919,7 +921,7 @@ var getTitle = /* @__PURE__ */ __name((content, connector) => {
|
|
|
919
921
|
return "";
|
|
920
922
|
}
|
|
921
923
|
}, "getTitle");
|
|
922
|
-
var DetailPanel = /* @__PURE__ */ __name(({ selectedConnector, selectedWallet = null, content = "idle", qrUri = null, wallets = [], walletListLoading = false, walletCount, onBack, onClose, onShowAllWallets, onSelectWallet, onCopyLink }) => {
|
|
924
|
+
var DetailPanel = /* @__PURE__ */ __name(({ selectedConnector, selectedWallet = null, content = "idle", qrUri = null, wallets = [], walletListLoading = false, walletCount, onBack, onClose, onShowAllWallets, onSelectWallet, onCopyLink, onRetry }) => {
|
|
923
925
|
const connectorMeta = selectedConnector ? CONNECTOR_META[selectedConnector] : null;
|
|
924
926
|
const connectorLogoUrl = connectorMeta == null ? void 0 : connectorMeta.logoUrl;
|
|
925
927
|
const connectorDownloadUrl = connectorMeta == null ? void 0 : connectorMeta.downloadUrl;
|
|
@@ -950,7 +952,9 @@ var DetailPanel = /* @__PURE__ */ __name(({ selectedConnector, selectedWallet =
|
|
|
950
952
|
uri: qrUri,
|
|
951
953
|
logoUrl: connectorLogoUrl,
|
|
952
954
|
downloadUrl: connectorDownloadUrl
|
|
953
|
-
}), content === "timeout" && /* @__PURE__ */ React.createElement(Timeout,
|
|
955
|
+
}), content === "timeout" && /* @__PURE__ */ React.createElement(Timeout, {
|
|
956
|
+
onRetry
|
|
957
|
+
}), (content === "metamask-ext" || content === "metamask-qr") && /* @__PURE__ */ React.createElement(MetaMask, {
|
|
954
958
|
variant: content === "metamask-ext" ? "extension" : "qr",
|
|
955
959
|
logoUrl: connectorLogoUrl,
|
|
956
960
|
uri: qrUri,
|
|
@@ -1022,18 +1026,36 @@ var Snackbar = /* @__PURE__ */ __name(({ message, onClose }) => {
|
|
|
1022
1026
|
})));
|
|
1023
1027
|
}, "Snackbar");
|
|
1024
1028
|
|
|
1029
|
+
// src/hooks/useMetaMaskExtension.ts
|
|
1030
|
+
import { useEffect, useState as useState2 } from "react";
|
|
1031
|
+
var METAMASK_RDNS = "io.metamask";
|
|
1032
|
+
var isMetaMaskAnnouncement = /* @__PURE__ */ __name((event) => {
|
|
1033
|
+
var _a, _b;
|
|
1034
|
+
const detail = event.detail;
|
|
1035
|
+
return ((_b = (_a = detail == null ? void 0 : detail.info) == null ? void 0 : _a.rdns) == null ? void 0 : _b.toLowerCase()) === METAMASK_RDNS && detail.provider != null;
|
|
1036
|
+
}, "isMetaMaskAnnouncement");
|
|
1037
|
+
var useMetaMaskExtension = /* @__PURE__ */ __name(() => {
|
|
1038
|
+
const [isInstalled, setIsInstalled] = useState2(false);
|
|
1039
|
+
useEffect(() => {
|
|
1040
|
+
const handleAnnouncement = /* @__PURE__ */ __name((event) => {
|
|
1041
|
+
if (isMetaMaskAnnouncement(event)) setIsInstalled(true);
|
|
1042
|
+
}, "handleAnnouncement");
|
|
1043
|
+
window.addEventListener("eip6963:announceProvider", handleAnnouncement);
|
|
1044
|
+
window.dispatchEvent(new Event("eip6963:requestProvider"));
|
|
1045
|
+
return () => {
|
|
1046
|
+
window.removeEventListener("eip6963:announceProvider", handleAnnouncement);
|
|
1047
|
+
};
|
|
1048
|
+
}, []);
|
|
1049
|
+
return isInstalled;
|
|
1050
|
+
}, "useMetaMaskExtension");
|
|
1051
|
+
|
|
1025
1052
|
// src/hooks/useWagmiConnect.ts
|
|
1026
|
-
import { useEffect, useRef, useCallback } from "react";
|
|
1053
|
+
import { useEffect as useEffect2, useRef, useCallback } from "react";
|
|
1027
1054
|
import { useConnect, useConfig } from "wagmi";
|
|
1028
1055
|
var hasMetaMaskKeyword = /* @__PURE__ */ __name((value) => value.toLowerCase().includes("metamask"), "hasMetaMaskKeyword");
|
|
1029
1056
|
var hasWalletConnectKeyword = /* @__PURE__ */ __name((value) => value.toLowerCase().includes("walletconnect"), "hasWalletConnectKeyword");
|
|
1030
1057
|
var isMetaMaskConnector = /* @__PURE__ */ __name((connector) => {
|
|
1031
1058
|
if (connector.id === "metaMaskSDK") return true;
|
|
1032
|
-
if (connector.id === "injected") {
|
|
1033
|
-
if (typeof window === "undefined") return false;
|
|
1034
|
-
const eth = window.ethereum;
|
|
1035
|
-
return (eth == null ? void 0 : eth.isMetaMask) === true;
|
|
1036
|
-
}
|
|
1037
1059
|
if (hasMetaMaskKeyword(connector.id) || hasMetaMaskKeyword(connector.name)) return true;
|
|
1038
1060
|
if (connector.rdns) {
|
|
1039
1061
|
const rdnsList = Array.isArray(connector.rdns) ? connector.rdns : [
|
|
@@ -1060,29 +1082,36 @@ var resolveWagmiConnector = /* @__PURE__ */ __name((connectors, connectorId) =>
|
|
|
1060
1082
|
return void 0;
|
|
1061
1083
|
}
|
|
1062
1084
|
}, "resolveWagmiConnector");
|
|
1063
|
-
var useWagmiConnect = /* @__PURE__ */ __name(({ onConnect, onError, onQrUri }) => {
|
|
1085
|
+
var useWagmiConnect = /* @__PURE__ */ __name(({ onConnect, onError, onQrUri, onSessionExpired }) => {
|
|
1064
1086
|
const config = useConfig();
|
|
1065
1087
|
const pendingConnectorId = useRef(null);
|
|
1066
1088
|
const attemptCounter = useRef(0);
|
|
1067
1089
|
const onConnectRef = useRef(onConnect);
|
|
1068
1090
|
const onErrorRef = useRef(onError);
|
|
1069
1091
|
const onQrUriRef = useRef(onQrUri);
|
|
1070
|
-
|
|
1092
|
+
const onSessionExpiredRef = useRef(onSessionExpired);
|
|
1093
|
+
useEffect2(() => {
|
|
1071
1094
|
onConnectRef.current = onConnect;
|
|
1072
1095
|
onErrorRef.current = onError;
|
|
1073
1096
|
onQrUriRef.current = onQrUri;
|
|
1097
|
+
onSessionExpiredRef.current = onSessionExpired;
|
|
1074
1098
|
}, [
|
|
1075
1099
|
onConnect,
|
|
1076
1100
|
onError,
|
|
1077
|
-
onQrUri
|
|
1101
|
+
onQrUri,
|
|
1102
|
+
onSessionExpired
|
|
1078
1103
|
]);
|
|
1079
1104
|
const { connectAsync, reset, isPending } = useConnect();
|
|
1080
|
-
|
|
1105
|
+
useEffect2(() => {
|
|
1081
1106
|
const handler = /* @__PURE__ */ __name((data) => {
|
|
1107
|
+
var _a;
|
|
1082
1108
|
const msg = data;
|
|
1083
1109
|
if ((msg == null ? void 0 : msg.type) === "display_uri" && typeof msg.data === "string") {
|
|
1084
1110
|
onQrUriRef.current(msg.data);
|
|
1085
1111
|
}
|
|
1112
|
+
if ((msg == null ? void 0 : msg.type) === "session_expired") {
|
|
1113
|
+
(_a = onSessionExpiredRef.current) == null ? void 0 : _a.call(onSessionExpiredRef);
|
|
1114
|
+
}
|
|
1086
1115
|
}, "handler");
|
|
1087
1116
|
const unsubscribers = config.connectors.map((connector) => {
|
|
1088
1117
|
connector.emitter.on("message", handler);
|
|
@@ -1145,14 +1174,73 @@ var useWagmiConnect = /* @__PURE__ */ __name(({ onConnect, onError, onQrUri }) =
|
|
|
1145
1174
|
};
|
|
1146
1175
|
}, "useWagmiConnect");
|
|
1147
1176
|
|
|
1177
|
+
// src/hooks/useConnectTimeout.ts
|
|
1178
|
+
import { useCallback as useCallback2, useEffect as useEffect3, useRef as useRef2, useState as useState3 } from "react";
|
|
1179
|
+
var DEFAULT_CONNECT_TIMEOUT_MS = 6e5;
|
|
1180
|
+
var useConnectTimeout = /* @__PURE__ */ __name(({ connectorId, active, expiredSignal = 0, onRetry }) => {
|
|
1181
|
+
const [timedOut, setTimedOut] = useState3(false);
|
|
1182
|
+
const fire = useCallback2(() => {
|
|
1183
|
+
setTimedOut(true);
|
|
1184
|
+
}, []);
|
|
1185
|
+
useEffect3(() => {
|
|
1186
|
+
setTimedOut(false);
|
|
1187
|
+
}, [
|
|
1188
|
+
connectorId
|
|
1189
|
+
]);
|
|
1190
|
+
useEffect3(() => {
|
|
1191
|
+
if (!active || connectorId !== "METAMASK") return;
|
|
1192
|
+
const timer = setTimeout(fire, DEFAULT_CONNECT_TIMEOUT_MS);
|
|
1193
|
+
return () => clearTimeout(timer);
|
|
1194
|
+
}, [
|
|
1195
|
+
active,
|
|
1196
|
+
connectorId,
|
|
1197
|
+
fire
|
|
1198
|
+
]);
|
|
1199
|
+
const prevSignal = useRef2(expiredSignal);
|
|
1200
|
+
useEffect3(() => {
|
|
1201
|
+
if (!active || connectorId === "METAMASK" || !connectorId) {
|
|
1202
|
+
prevSignal.current = expiredSignal;
|
|
1203
|
+
return;
|
|
1204
|
+
}
|
|
1205
|
+
if (expiredSignal !== prevSignal.current) {
|
|
1206
|
+
prevSignal.current = expiredSignal;
|
|
1207
|
+
fire();
|
|
1208
|
+
}
|
|
1209
|
+
}, [
|
|
1210
|
+
expiredSignal,
|
|
1211
|
+
connectorId,
|
|
1212
|
+
active,
|
|
1213
|
+
fire
|
|
1214
|
+
]);
|
|
1215
|
+
const retry = useCallback2(() => {
|
|
1216
|
+
setTimedOut(false);
|
|
1217
|
+
onRetry == null ? void 0 : onRetry();
|
|
1218
|
+
}, [
|
|
1219
|
+
onRetry
|
|
1220
|
+
]);
|
|
1221
|
+
return {
|
|
1222
|
+
timedOut,
|
|
1223
|
+
retry
|
|
1224
|
+
};
|
|
1225
|
+
}, "useConnectTimeout");
|
|
1226
|
+
|
|
1227
|
+
// src/hooks/useWCState.ts
|
|
1228
|
+
import { useState as useState4, useRef as useRef3, useCallback as useCallback3, useEffect as useEffect4 } from "react";
|
|
1229
|
+
|
|
1230
|
+
// src/wallet-display-override.ts
|
|
1231
|
+
var CREDIT_WALLET_LISTING_ID = "ce02f1ae74686234eabfa7d31876c442779b730dfe7924a3ca0e6559a7afa30f";
|
|
1232
|
+
var overrideWalletDisplay = /* @__PURE__ */ __name((wallet) => wallet.id === CREDIT_WALLET_LISTING_ID ? {
|
|
1233
|
+
...wallet,
|
|
1234
|
+
name: "PenguinWallet",
|
|
1235
|
+
imageUrl: penguinwallet_default
|
|
1236
|
+
} : wallet, "overrideWalletDisplay");
|
|
1237
|
+
|
|
1148
1238
|
// src/hooks/useWCState.ts
|
|
1149
|
-
import { useState as useState2, useRef as useRef2, useCallback as useCallback2, useEffect as useEffect2 } from "react";
|
|
1150
|
-
var WC_EXPLORER_CREDIT_WALLET_NAME = "Credit Wallet";
|
|
1151
1239
|
var sortCreditWalletFirst = /* @__PURE__ */ __name((list) => [
|
|
1152
1240
|
...list
|
|
1153
1241
|
].sort((a, b) => {
|
|
1154
|
-
if (a.
|
|
1155
|
-
if (b.
|
|
1242
|
+
if (a.id === CREDIT_WALLET_LISTING_ID) return -1;
|
|
1243
|
+
if (b.id === CREDIT_WALLET_LISTING_ID) return 1;
|
|
1156
1244
|
return 0;
|
|
1157
1245
|
}), "sortCreditWalletFirst");
|
|
1158
1246
|
var fetchWCWalletList = /* @__PURE__ */ __name(async (projectId, signal) => {
|
|
@@ -1193,16 +1281,16 @@ var fetchWCWalletList = /* @__PURE__ */ __name(async (projectId, signal) => {
|
|
|
1193
1281
|
return Array.from(byId.values());
|
|
1194
1282
|
}, "fetchWCWalletList");
|
|
1195
1283
|
var useWCState = /* @__PURE__ */ __name(() => {
|
|
1196
|
-
const [subView, setSubView] =
|
|
1197
|
-
const [walletList, setWalletList] =
|
|
1198
|
-
const [walletListLoading, setWalletListLoading] =
|
|
1199
|
-
const [walletListSearch, setWalletListSearch] =
|
|
1200
|
-
const [filterActive, setFilterActive] =
|
|
1201
|
-
const [selectedWallet, setSelectedWallet] =
|
|
1202
|
-
const loadedRef =
|
|
1203
|
-
const abortControllerRef =
|
|
1204
|
-
const isMountedRef =
|
|
1205
|
-
|
|
1284
|
+
const [subView, setSubView] = useState4("qr");
|
|
1285
|
+
const [walletList, setWalletList] = useState4([]);
|
|
1286
|
+
const [walletListLoading, setWalletListLoading] = useState4(false);
|
|
1287
|
+
const [walletListSearch, setWalletListSearch] = useState4("");
|
|
1288
|
+
const [filterActive, setFilterActive] = useState4(false);
|
|
1289
|
+
const [selectedWallet, setSelectedWallet] = useState4(null);
|
|
1290
|
+
const loadedRef = useRef3(false);
|
|
1291
|
+
const abortControllerRef = useRef3(null);
|
|
1292
|
+
const isMountedRef = useRef3(true);
|
|
1293
|
+
useEffect4(() => {
|
|
1206
1294
|
isMountedRef.current = true;
|
|
1207
1295
|
return () => {
|
|
1208
1296
|
var _a;
|
|
@@ -1211,7 +1299,7 @@ var useWCState = /* @__PURE__ */ __name(() => {
|
|
|
1211
1299
|
abortControllerRef.current = null;
|
|
1212
1300
|
};
|
|
1213
1301
|
}, []);
|
|
1214
|
-
const loadWalletList =
|
|
1302
|
+
const loadWalletList = useCallback3(async (projectId) => {
|
|
1215
1303
|
if (loadedRef.current) return;
|
|
1216
1304
|
loadedRef.current = true;
|
|
1217
1305
|
const controller = new AbortController();
|
|
@@ -1219,7 +1307,7 @@ var useWCState = /* @__PURE__ */ __name(() => {
|
|
|
1219
1307
|
setWalletListLoading(true);
|
|
1220
1308
|
try {
|
|
1221
1309
|
const list = await fetchWCWalletList(projectId, controller.signal);
|
|
1222
|
-
const sorted = sortCreditWalletFirst(list);
|
|
1310
|
+
const sorted = sortCreditWalletFirst(list).map(overrideWalletDisplay);
|
|
1223
1311
|
if (isMountedRef.current) setWalletList(sorted);
|
|
1224
1312
|
} catch (err) {
|
|
1225
1313
|
const isAbort = err instanceof DOMException && err.name === "AbortError";
|
|
@@ -1229,14 +1317,14 @@ var useWCState = /* @__PURE__ */ __name(() => {
|
|
|
1229
1317
|
if (abortControllerRef.current === controller) abortControllerRef.current = null;
|
|
1230
1318
|
}
|
|
1231
1319
|
}, []);
|
|
1232
|
-
const onShowList =
|
|
1233
|
-
const onSelectWallet =
|
|
1320
|
+
const onShowList = useCallback3(() => setSubView("list"), []);
|
|
1321
|
+
const onSelectWallet = useCallback3((wallet) => {
|
|
1234
1322
|
setSelectedWallet(wallet);
|
|
1235
1323
|
setSubView("wallet");
|
|
1236
1324
|
}, []);
|
|
1237
|
-
const onSearchChange =
|
|
1238
|
-
const onFilterToggle =
|
|
1239
|
-
const handleBack =
|
|
1325
|
+
const onSearchChange = useCallback3((q) => setWalletListSearch(q), []);
|
|
1326
|
+
const onFilterToggle = useCallback3(() => setFilterActive((prev) => !prev), []);
|
|
1327
|
+
const handleBack = useCallback3(() => {
|
|
1240
1328
|
if (subView === "wallet") {
|
|
1241
1329
|
setSelectedWallet(null);
|
|
1242
1330
|
setSubView("list");
|
|
@@ -1250,11 +1338,11 @@ var useWCState = /* @__PURE__ */ __name(() => {
|
|
|
1250
1338
|
}, [
|
|
1251
1339
|
subView
|
|
1252
1340
|
]);
|
|
1253
|
-
const resetView =
|
|
1341
|
+
const resetView = useCallback3(() => {
|
|
1254
1342
|
setSubView("qr");
|
|
1255
1343
|
setSelectedWallet(null);
|
|
1256
1344
|
}, []);
|
|
1257
|
-
const reset =
|
|
1345
|
+
const reset = useCallback3(() => {
|
|
1258
1346
|
setSubView("qr");
|
|
1259
1347
|
setWalletListSearch("");
|
|
1260
1348
|
setFilterActive(false);
|
|
@@ -1290,10 +1378,6 @@ var tryOpenDeepLink = /* @__PURE__ */ __name((uri, deepLinkBase) => {
|
|
|
1290
1378
|
var tryOpenCreditWalletDeeplink = /* @__PURE__ */ __name((payloadUrl) => {
|
|
1291
1379
|
window.location.replace(`creditwallet://?uri=${encodeURIComponent(payloadUrl)}`);
|
|
1292
1380
|
}, "tryOpenCreditWalletDeeplink");
|
|
1293
|
-
var detectMetaMaskExtension = /* @__PURE__ */ __name(() => {
|
|
1294
|
-
var _a;
|
|
1295
|
-
return typeof window !== "undefined" && Boolean((_a = window.ethereum) == null ? void 0 : _a.isMetaMask);
|
|
1296
|
-
}, "detectMetaMaskExtension");
|
|
1297
1381
|
|
|
1298
1382
|
// src/layout/connectDialog/index.tsx
|
|
1299
1383
|
var getContentForConnector = /* @__PURE__ */ __name((id) => {
|
|
@@ -1302,6 +1386,7 @@ var getContentForConnector = /* @__PURE__ */ __name((id) => {
|
|
|
1302
1386
|
if (id === "WALLET_CONNECT") return "walletconnect";
|
|
1303
1387
|
return "idle";
|
|
1304
1388
|
}, "getContentForConnector");
|
|
1389
|
+
var getInitialContentForConnector = /* @__PURE__ */ __name((id, isMetaMaskExtensionInstalled) => id === "METAMASK" && !isMetaMaskExtensionInstalled ? "metamask-qr" : getContentForConnector(id), "getInitialContentForConnector");
|
|
1305
1390
|
var ConnectDialog = /* @__PURE__ */ __name(({
|
|
1306
1391
|
open,
|
|
1307
1392
|
theme = "dark",
|
|
@@ -1320,24 +1405,69 @@ var ConnectDialog = /* @__PURE__ */ __name(({
|
|
|
1320
1405
|
onConnect,
|
|
1321
1406
|
onError
|
|
1322
1407
|
}) => {
|
|
1323
|
-
const dialogRef =
|
|
1324
|
-
const [selectedConnector, setSelectedConnector] =
|
|
1325
|
-
const [recentConnector, setRecentConnector] =
|
|
1326
|
-
const [selectedWallet, setSelectedWallet] =
|
|
1327
|
-
const [step, setStep] =
|
|
1328
|
-
const [content, setContent] =
|
|
1329
|
-
const [showCopySnackbar, setShowCopySnackbar] =
|
|
1330
|
-
const [qrUri, setQrUri] =
|
|
1408
|
+
const dialogRef = useRef4(null);
|
|
1409
|
+
const [selectedConnector, setSelectedConnector] = useState5(selectedConnectorProp);
|
|
1410
|
+
const [recentConnector, setRecentConnector] = useState5(null);
|
|
1411
|
+
const [selectedWallet, setSelectedWallet] = useState5(null);
|
|
1412
|
+
const [step, setStep] = useState5(stepProp);
|
|
1413
|
+
const [content, setContent] = useState5("idle");
|
|
1414
|
+
const [showCopySnackbar, setShowCopySnackbar] = useState5(false);
|
|
1415
|
+
const [qrUri, setQrUri] = useState5(null);
|
|
1416
|
+
const [expiredSignal, setExpiredSignal] = useState5(0);
|
|
1417
|
+
const isMetaMaskExtensionInstalled = useMetaMaskExtension();
|
|
1418
|
+
const contentRef = useRef4(content);
|
|
1419
|
+
contentRef.current = content;
|
|
1420
|
+
const preTimeoutContentRef = useRef4("idle");
|
|
1331
1421
|
const config = useConfig2();
|
|
1332
1422
|
const { triggerConnect, cancelConnect } = useWagmiConnect({
|
|
1333
1423
|
onConnect: /* @__PURE__ */ __name((result) => {
|
|
1334
1424
|
setRecentConnector(result.connectorId);
|
|
1335
1425
|
onConnect == null ? void 0 : onConnect(result);
|
|
1336
1426
|
}, "onConnect"),
|
|
1337
|
-
onError: /* @__PURE__ */ __name((err, connectorId) =>
|
|
1338
|
-
|
|
1427
|
+
onError: /* @__PURE__ */ __name((err, connectorId) => {
|
|
1428
|
+
if (connectorId === "WALLET_CONNECT") {
|
|
1429
|
+
setExpiredSignal((n) => n + 1);
|
|
1430
|
+
}
|
|
1431
|
+
onError == null ? void 0 : onError(err, connectorId);
|
|
1432
|
+
}, "onError"),
|
|
1433
|
+
onQrUri: /* @__PURE__ */ __name((uri) => setQrUri(uri), "onQrUri"),
|
|
1434
|
+
// CC connector 가 서버 OnSessionExpired 를 릴레이 → 만료 신호 증가.
|
|
1435
|
+
onSessionExpired: /* @__PURE__ */ __name(() => setExpiredSignal((n) => n + 1), "onSessionExpired")
|
|
1339
1436
|
});
|
|
1340
|
-
|
|
1437
|
+
const timeoutActive = step === "detail" && !!selectedConnector && content !== "timeout";
|
|
1438
|
+
const { timedOut, retry } = useConnectTimeout({
|
|
1439
|
+
connectorId: selectedConnector,
|
|
1440
|
+
active: timeoutActive,
|
|
1441
|
+
expiredSignal,
|
|
1442
|
+
onRetry: /* @__PURE__ */ __name(() => {
|
|
1443
|
+
if (!selectedConnector) return;
|
|
1444
|
+
cancelConnect();
|
|
1445
|
+
setQrUri(null);
|
|
1446
|
+
const restore = preTimeoutContentRef.current;
|
|
1447
|
+
const nextContent = restore !== "idle" && restore !== "timeout" ? restore : getInitialContentForConnector(selectedConnector, isMetaMaskExtensionInstalled);
|
|
1448
|
+
setContent(nextContent);
|
|
1449
|
+
triggerConnect(selectedConnector);
|
|
1450
|
+
}, "onRetry")
|
|
1451
|
+
});
|
|
1452
|
+
useEffect5(() => {
|
|
1453
|
+
if (!timedOut) return;
|
|
1454
|
+
preTimeoutContentRef.current = contentRef.current;
|
|
1455
|
+
cancelConnect();
|
|
1456
|
+
setContent("timeout");
|
|
1457
|
+
}, [
|
|
1458
|
+
timedOut,
|
|
1459
|
+
cancelConnect
|
|
1460
|
+
]);
|
|
1461
|
+
useEffect5(() => {
|
|
1462
|
+
if (isMetaMaskExtensionInstalled && selectedConnector === "METAMASK" && content === "metamask-qr") {
|
|
1463
|
+
setContent("metamask-ext");
|
|
1464
|
+
}
|
|
1465
|
+
}, [
|
|
1466
|
+
isMetaMaskExtensionInstalled,
|
|
1467
|
+
selectedConnector,
|
|
1468
|
+
content
|
|
1469
|
+
]);
|
|
1470
|
+
useEffect5(() => {
|
|
1341
1471
|
const restoreRecent = /* @__PURE__ */ __name(async () => {
|
|
1342
1472
|
var _a;
|
|
1343
1473
|
const wagmiId = await ((_a = config.storage) == null ? void 0 : _a.getItem("recentConnectorId"));
|
|
@@ -1351,8 +1481,7 @@ var ConnectDialog = /* @__PURE__ */ __name(({
|
|
|
1351
1481
|
const wc = useWCState();
|
|
1352
1482
|
const handleSelect = /* @__PURE__ */ __name((id) => {
|
|
1353
1483
|
setSelectedConnector(id);
|
|
1354
|
-
|
|
1355
|
-
setContent(initialContent);
|
|
1484
|
+
setContent(getInitialContentForConnector(id, isMetaMaskExtensionInstalled));
|
|
1356
1485
|
setStep("detail");
|
|
1357
1486
|
triggerConnect(id);
|
|
1358
1487
|
onSelectConnector == null ? void 0 : onSelectConnector(id);
|
|
@@ -1384,7 +1513,7 @@ var ConnectDialog = /* @__PURE__ */ __name(({
|
|
|
1384
1513
|
wc.loadWalletList(wcProjectId).catch(() => void 0);
|
|
1385
1514
|
}
|
|
1386
1515
|
}, "handleShowAllWallets");
|
|
1387
|
-
|
|
1516
|
+
useEffect5(() => {
|
|
1388
1517
|
const dialog = dialogRef.current;
|
|
1389
1518
|
if (!dialog) return;
|
|
1390
1519
|
if (open && !dialog.open) dialog.showModal();
|
|
@@ -1392,13 +1521,13 @@ var ConnectDialog = /* @__PURE__ */ __name(({
|
|
|
1392
1521
|
}, [
|
|
1393
1522
|
open
|
|
1394
1523
|
]);
|
|
1395
|
-
const deeplinkTriedRef =
|
|
1396
|
-
|
|
1524
|
+
const deeplinkTriedRef = useRef4(false);
|
|
1525
|
+
useEffect5(() => {
|
|
1397
1526
|
deeplinkTriedRef.current = false;
|
|
1398
1527
|
}, [
|
|
1399
1528
|
selectedWallet
|
|
1400
1529
|
]);
|
|
1401
|
-
|
|
1530
|
+
useEffect5(() => {
|
|
1402
1531
|
if (deeplinkTriedRef.current) return;
|
|
1403
1532
|
if (!selectedWallet || !qrUri || content !== "wallet-qr") return;
|
|
1404
1533
|
if (!isMobileDevice()) return;
|
|
@@ -1411,13 +1540,13 @@ var ConnectDialog = /* @__PURE__ */ __name(({
|
|
|
1411
1540
|
qrUri,
|
|
1412
1541
|
content
|
|
1413
1542
|
]);
|
|
1414
|
-
const creditConnectDeeplinkTriedRef =
|
|
1415
|
-
|
|
1543
|
+
const creditConnectDeeplinkTriedRef = useRef4(false);
|
|
1544
|
+
useEffect5(() => {
|
|
1416
1545
|
creditConnectDeeplinkTriedRef.current = false;
|
|
1417
1546
|
}, [
|
|
1418
1547
|
selectedConnector
|
|
1419
1548
|
]);
|
|
1420
|
-
|
|
1549
|
+
useEffect5(() => {
|
|
1421
1550
|
if (creditConnectDeeplinkTriedRef.current) return;
|
|
1422
1551
|
if (content !== "qr" || !qrUri) return;
|
|
1423
1552
|
if (selectedConnector !== "CREDIT_CONNECT") return;
|
|
@@ -1429,7 +1558,7 @@ var ConnectDialog = /* @__PURE__ */ __name(({
|
|
|
1429
1558
|
qrUri,
|
|
1430
1559
|
selectedConnector
|
|
1431
1560
|
]);
|
|
1432
|
-
|
|
1561
|
+
useEffect5(() => {
|
|
1433
1562
|
const prev = document.body.style.overflow;
|
|
1434
1563
|
if (open) document.body.style.overflow = "hidden";
|
|
1435
1564
|
return () => {
|
|
@@ -1438,7 +1567,7 @@ var ConnectDialog = /* @__PURE__ */ __name(({
|
|
|
1438
1567
|
}, [
|
|
1439
1568
|
open
|
|
1440
1569
|
]);
|
|
1441
|
-
|
|
1570
|
+
useEffect5(() => {
|
|
1442
1571
|
if (!open) {
|
|
1443
1572
|
cancelConnect();
|
|
1444
1573
|
setQrUri(null);
|
|
@@ -1451,7 +1580,7 @@ var ConnectDialog = /* @__PURE__ */ __name(({
|
|
|
1451
1580
|
open,
|
|
1452
1581
|
cancelConnect
|
|
1453
1582
|
]);
|
|
1454
|
-
|
|
1583
|
+
useEffect5(() => {
|
|
1455
1584
|
const dialog = dialogRef.current;
|
|
1456
1585
|
if (!dialog) return void 0;
|
|
1457
1586
|
const handleCancel = /* @__PURE__ */ __name((e) => {
|
|
@@ -1492,6 +1621,7 @@ var ConnectDialog = /* @__PURE__ */ __name(({
|
|
|
1492
1621
|
walletCount: wc.walletList.length,
|
|
1493
1622
|
onBack: handleBack,
|
|
1494
1623
|
onClose,
|
|
1624
|
+
onRetry: retry,
|
|
1495
1625
|
onShowAllWallets: handleShowAllWallets,
|
|
1496
1626
|
onSelectWallet: handleSelectWallet,
|
|
1497
1627
|
onCopyLink: /* @__PURE__ */ __name(() => {
|
|
@@ -1538,32 +1668,32 @@ var ConnectKitProvider = /* @__PURE__ */ __name((props) => {
|
|
|
1538
1668
|
}, "ConnectKitProvider");
|
|
1539
1669
|
var ConnectKitProviderInner = /* @__PURE__ */ __name(({ children, connectors, kitConfig, requiredChainId, theme, onConnect, onLog }) => {
|
|
1540
1670
|
var _a;
|
|
1541
|
-
const [isOpen, setIsOpen] =
|
|
1542
|
-
const [pendingResult, setPendingResult] =
|
|
1671
|
+
const [isOpen, setIsOpen] = useState6(false);
|
|
1672
|
+
const [pendingResult, setPendingResult] = useState6(null);
|
|
1543
1673
|
const account = useAccount();
|
|
1544
1674
|
const wagmiConfig = useConfig3();
|
|
1545
1675
|
const { disconnectAsync } = useDisconnect();
|
|
1546
1676
|
const { switchChainAsync } = useSwitchChain();
|
|
1547
|
-
const onConnectRef =
|
|
1548
|
-
|
|
1677
|
+
const onConnectRef = useRef5(onConnect);
|
|
1678
|
+
useEffect6(() => {
|
|
1549
1679
|
onConnectRef.current = onConnect;
|
|
1550
1680
|
}, [
|
|
1551
1681
|
onConnect
|
|
1552
1682
|
]);
|
|
1553
|
-
const isMountedRef =
|
|
1554
|
-
|
|
1683
|
+
const isMountedRef = useRef5(true);
|
|
1684
|
+
useEffect6(() => {
|
|
1555
1685
|
isMountedRef.current = true;
|
|
1556
1686
|
return () => {
|
|
1557
1687
|
isMountedRef.current = false;
|
|
1558
1688
|
};
|
|
1559
1689
|
}, []);
|
|
1560
1690
|
const needsChainSwitch = requiredChainId != null && account.status === "connected" && account.chainId != null && account.chainId !== requiredChainId;
|
|
1561
|
-
const [isSwitchingChain, setIsSwitchingChain] =
|
|
1691
|
+
const [isSwitchingChain, setIsSwitchingChain] = useState6(false);
|
|
1562
1692
|
const effectiveOpen = isOpen;
|
|
1563
|
-
const open =
|
|
1693
|
+
const open = useCallback4(() => {
|
|
1564
1694
|
setIsOpen(true);
|
|
1565
1695
|
}, []);
|
|
1566
|
-
const close =
|
|
1696
|
+
const close = useCallback4(() => {
|
|
1567
1697
|
setIsOpen(false);
|
|
1568
1698
|
const status = getAccount2(wagmiConfig).status;
|
|
1569
1699
|
if (status === "connecting" || status === "reconnecting") {
|
|
@@ -1573,12 +1703,12 @@ var ConnectKitProviderInner = /* @__PURE__ */ __name(({ children, connectors, ki
|
|
|
1573
1703
|
wagmiConfig,
|
|
1574
1704
|
disconnectAsync
|
|
1575
1705
|
]);
|
|
1576
|
-
const disconnect =
|
|
1706
|
+
const disconnect = useCallback4(async () => {
|
|
1577
1707
|
await disconnectAsync();
|
|
1578
1708
|
}, [
|
|
1579
1709
|
disconnectAsync
|
|
1580
1710
|
]);
|
|
1581
|
-
const switchToRequiredChain =
|
|
1711
|
+
const switchToRequiredChain = useCallback4(async () => {
|
|
1582
1712
|
if (requiredChainId == null) return;
|
|
1583
1713
|
setIsSwitchingChain(true);
|
|
1584
1714
|
try {
|
|
@@ -1592,15 +1722,15 @@ var ConnectKitProviderInner = /* @__PURE__ */ __name(({ children, connectors, ki
|
|
|
1592
1722
|
requiredChainId,
|
|
1593
1723
|
switchChainAsync
|
|
1594
1724
|
]);
|
|
1595
|
-
const handleDialogConnect =
|
|
1725
|
+
const handleDialogConnect = useCallback4((result) => {
|
|
1596
1726
|
setPendingResult(result);
|
|
1597
1727
|
}, []);
|
|
1598
|
-
const handleDialogError =
|
|
1728
|
+
const handleDialogError = useCallback4((error, connectorId) => {
|
|
1599
1729
|
onLog == null ? void 0 : onLog(`[connect-kit] connect failed: ${connectorId} \u2014 ${error.message}`, error);
|
|
1600
1730
|
}, [
|
|
1601
1731
|
onLog
|
|
1602
1732
|
]);
|
|
1603
|
-
|
|
1733
|
+
useEffect6(() => {
|
|
1604
1734
|
if (!effectiveOpen) return;
|
|
1605
1735
|
if (account.status !== "connected") return;
|
|
1606
1736
|
setIsOpen(false);
|
|
@@ -1608,7 +1738,7 @@ var ConnectKitProviderInner = /* @__PURE__ */ __name(({ children, connectors, ki
|
|
|
1608
1738
|
effectiveOpen,
|
|
1609
1739
|
account.status
|
|
1610
1740
|
]);
|
|
1611
|
-
|
|
1741
|
+
useEffect6(() => {
|
|
1612
1742
|
var _a2;
|
|
1613
1743
|
if (!pendingResult) return;
|
|
1614
1744
|
if (account.status !== "connected") {
|
package/dist/package.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gluwa/connect-kit",
|
|
3
|
-
"version": "0.2.0-next.
|
|
3
|
+
"version": "0.2.0-next.9",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -26,10 +26,10 @@
|
|
|
26
26
|
"qrcode.react": "^4.2.0",
|
|
27
27
|
"wagmi": "^2.15.6",
|
|
28
28
|
"@wagmi/core": "^2.16.7",
|
|
29
|
-
"@gluwa/credit-connect-
|
|
30
|
-
"@gluwa/credit-connect-
|
|
31
|
-
"@gluwa/credit-connect-
|
|
32
|
-
"@gluwa/credit-connect-
|
|
29
|
+
"@gluwa/credit-connect-e2ee-tweetnacl": "0.2.0-next.4",
|
|
30
|
+
"@gluwa/credit-connect-hub-node-ws": "0.1.0-next.4",
|
|
31
|
+
"@gluwa/credit-connect-sdk": "0.2.0-next.4",
|
|
32
|
+
"@gluwa/credit-connect-storage-local": "0.2.0-next.4"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@tanstack/react-query": "^5.62.0",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"typescript-eslint": "^8.18.2",
|
|
44
44
|
"viem": "^2.31.7",
|
|
45
45
|
"wagmi": "^2.15.6",
|
|
46
|
-
"@gluwa/credit-connect-sdk": "0.2.0-next.
|
|
46
|
+
"@gluwa/credit-connect-sdk": "0.2.0-next.4"
|
|
47
47
|
},
|
|
48
48
|
"peerDependencies": {
|
|
49
49
|
"@tanstack/react-query": ">=5.0.0",
|
|
@@ -27,7 +27,9 @@ export const QrArea: FC<QrAreaProps> = ({ uri, status, logoUrl, hasBg = false, l
|
|
|
27
27
|
<div className="ck-qr-group">
|
|
28
28
|
<figure className={`ck-qr ck-qr-${status}`} aria-label="QR Code">
|
|
29
29
|
{status === 'loading' && (
|
|
30
|
-
<div className="ck-qr-skeleton" aria-busy="true" aria-label="Loading QR code"
|
|
30
|
+
<div className="ck-qr-skeleton" aria-busy="true" aria-label="Loading QR code">
|
|
31
|
+
<div className="ck-qr-skeleton-inner" />
|
|
32
|
+
</div>
|
|
31
33
|
)}
|
|
32
34
|
{status === 'ready' && uri && (
|
|
33
35
|
<div
|