@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/dist/index.js CHANGED
@@ -2,7 +2,7 @@ import React from "react";
2
2
  import {
3
3
  __name,
4
4
  creditConnectConnector
5
- } from "./chunk-EDNRW47A.js";
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 useCallback3, useContext, useEffect as useEffect4, useMemo as useMemo2, useRef as useRef4, useState as useState4 } from "react";
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 useEffect3, useRef as useRef3, useState as useState3 } from "react";
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
- }), status === "ready" && uri && /* @__PURE__ */ React.createElement("div", {
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 wallets found")) : /* @__PURE__ */ React.createElement(WalletGrid, {
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, null), (content === "metamask-ext" || content === "metamask-qr") && /* @__PURE__ */ React.createElement(MetaMask, {
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
- useEffect(() => {
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
- useEffect(() => {
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.name === WC_EXPLORER_CREDIT_WALLET_NAME) return -1;
1155
- if (b.name === WC_EXPLORER_CREDIT_WALLET_NAME) return 1;
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] = useState2("qr");
1197
- const [walletList, setWalletList] = useState2([]);
1198
- const [walletListLoading, setWalletListLoading] = useState2(false);
1199
- const [walletListSearch, setWalletListSearch] = useState2("");
1200
- const [filterActive, setFilterActive] = useState2(false);
1201
- const [selectedWallet, setSelectedWallet] = useState2(null);
1202
- const loadedRef = useRef2(false);
1203
- const abortControllerRef = useRef2(null);
1204
- const isMountedRef = useRef2(true);
1205
- useEffect2(() => {
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 = useCallback2(async (projectId) => {
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 = useCallback2(() => setSubView("list"), []);
1233
- const onSelectWallet = useCallback2((wallet) => {
1320
+ const onShowList = useCallback3(() => setSubView("list"), []);
1321
+ const onSelectWallet = useCallback3((wallet) => {
1234
1322
  setSelectedWallet(wallet);
1235
1323
  setSubView("wallet");
1236
1324
  }, []);
1237
- const onSearchChange = useCallback2((q) => setWalletListSearch(q), []);
1238
- const onFilterToggle = useCallback2(() => setFilterActive((prev) => !prev), []);
1239
- const handleBack = useCallback2(() => {
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 = useCallback2(() => {
1341
+ const resetView = useCallback3(() => {
1254
1342
  setSubView("qr");
1255
1343
  setSelectedWallet(null);
1256
1344
  }, []);
1257
- const reset = useCallback2(() => {
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 = useRef3(null);
1324
- const [selectedConnector, setSelectedConnector] = useState3(selectedConnectorProp);
1325
- const [recentConnector, setRecentConnector] = useState3(null);
1326
- const [selectedWallet, setSelectedWallet] = useState3(null);
1327
- const [step, setStep] = useState3(stepProp);
1328
- const [content, setContent] = useState3("idle");
1329
- const [showCopySnackbar, setShowCopySnackbar] = useState3(false);
1330
- const [qrUri, setQrUri] = useState3(null);
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) => onError == null ? void 0 : onError(err, connectorId), "onError"),
1338
- onQrUri: /* @__PURE__ */ __name((uri) => setQrUri(uri), "onQrUri")
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
- useEffect3(() => {
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
- const initialContent = id === "METAMASK" && !detectMetaMaskExtension() ? "metamask-qr" : getContentForConnector(id);
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
- useEffect3(() => {
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 = useRef3(false);
1396
- useEffect3(() => {
1524
+ const deeplinkTriedRef = useRef4(false);
1525
+ useEffect5(() => {
1397
1526
  deeplinkTriedRef.current = false;
1398
1527
  }, [
1399
1528
  selectedWallet
1400
1529
  ]);
1401
- useEffect3(() => {
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 = useRef3(false);
1415
- useEffect3(() => {
1543
+ const creditConnectDeeplinkTriedRef = useRef4(false);
1544
+ useEffect5(() => {
1416
1545
  creditConnectDeeplinkTriedRef.current = false;
1417
1546
  }, [
1418
1547
  selectedConnector
1419
1548
  ]);
1420
- useEffect3(() => {
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
- useEffect3(() => {
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
- useEffect3(() => {
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
- useEffect3(() => {
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] = useState4(false);
1542
- const [pendingResult, setPendingResult] = useState4(null);
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 = useRef4(onConnect);
1548
- useEffect4(() => {
1677
+ const onConnectRef = useRef5(onConnect);
1678
+ useEffect6(() => {
1549
1679
  onConnectRef.current = onConnect;
1550
1680
  }, [
1551
1681
  onConnect
1552
1682
  ]);
1553
- const isMountedRef = useRef4(true);
1554
- useEffect4(() => {
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] = useState4(false);
1691
+ const [isSwitchingChain, setIsSwitchingChain] = useState6(false);
1562
1692
  const effectiveOpen = isOpen;
1563
- const open = useCallback3(() => {
1693
+ const open = useCallback4(() => {
1564
1694
  setIsOpen(true);
1565
1695
  }, []);
1566
- const close = useCallback3(() => {
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 = useCallback3(async () => {
1706
+ const disconnect = useCallback4(async () => {
1577
1707
  await disconnectAsync();
1578
1708
  }, [
1579
1709
  disconnectAsync
1580
1710
  ]);
1581
- const switchToRequiredChain = useCallback3(async () => {
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 = useCallback3((result) => {
1725
+ const handleDialogConnect = useCallback4((result) => {
1596
1726
  setPendingResult(result);
1597
1727
  }, []);
1598
- const handleDialogError = useCallback3((error, connectorId) => {
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
- useEffect4(() => {
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
- useEffect4(() => {
1741
+ useEffect6(() => {
1612
1742
  var _a2;
1613
1743
  if (!pendingResult) return;
1614
1744
  if (account.status !== "connected") {
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gluwa/connect-kit",
3
- "version": "0.2.0-next.7",
3
+ "version": "0.2.0-next.9",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gluwa/connect-kit",
3
- "version": "0.2.0-next.7",
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-sdk": "0.2.0-next.3",
30
- "@gluwa/credit-connect-storage-local": "0.2.0-next.3",
31
- "@gluwa/credit-connect-e2ee-tweetnacl": "0.2.0-next.3",
32
- "@gluwa/credit-connect-hub-node-ws": "0.1.0-next.3"
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.3"
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