@volr/react 0.1.102 → 0.1.104

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.cjs CHANGED
@@ -9909,11 +9909,18 @@ function useWalletEvents({
9909
9909
  }) {
9910
9910
  react.useEffect(() => {
9911
9911
  if (!user) return;
9912
+ if (user.keyStorageType === "passkey") {
9913
+ console.log("[Provider] Passkey user - skipping external wallet event listeners");
9914
+ return;
9915
+ }
9912
9916
  if (typeof window === "undefined" || !window.ethereum) {
9913
9917
  return;
9914
9918
  }
9915
9919
  const ethereum = window.ethereum;
9916
9920
  const handleAccountsChanged = (accounts) => {
9921
+ if (user.signerType !== "external_wallet") {
9922
+ return;
9923
+ }
9917
9924
  if (accounts.length === 0) {
9918
9925
  console.warn("[Provider] Wallet disconnected, logging out...");
9919
9926
  setTimeout(() => logout(), 3e3);
@@ -9928,9 +9935,15 @@ function useWalletEvents({
9928
9935
  setUser(
9929
9936
  (prev) => prev ? { ...prev, lastWalletChainId: newChainId } : null
9930
9937
  );
9931
- window.location.reload();
9938
+ if (user.signerType === "external_wallet") {
9939
+ window.location.reload();
9940
+ }
9932
9941
  };
9933
9942
  const handleDisconnect = () => {
9943
+ if (user.signerType !== "external_wallet") {
9944
+ console.log("[Provider] disconnect event ignored (not external_wallet signer)");
9945
+ return;
9946
+ }
9934
9947
  console.log("[Provider] disconnect event");
9935
9948
  setProviderState(null);
9936
9949
  safeStorage.removeItem(STORAGE_KEYS.provider);
@@ -18533,21 +18546,53 @@ function useVolr() {
18533
18546
  const { precheck } = usePrecheck();
18534
18547
  const { relay } = useRelay();
18535
18548
  const { client: apiClient } = useInternalAuth();
18549
+ const restoringRef = react.useRef(null);
18536
18550
  const getRpcUrl = react.useCallback(
18537
18551
  createGetRpcUrl({ client: apiClient, rpcOverrides: config.rpcOverrides }),
18538
18552
  [apiClient, config.rpcOverrides]
18539
18553
  );
18554
+ const ensureProvider = react.useCallback(async () => {
18555
+ if (provider) {
18556
+ return provider;
18557
+ }
18558
+ if (!user?.keyStorageType || user.keyStorageType !== "passkey") {
18559
+ throw new Error(
18560
+ "No wallet provider available. Please complete passkey enrollment first."
18561
+ );
18562
+ }
18563
+ if (!user.blobUrl || !user.prfInput || !user.id) {
18564
+ throw new Error(
18565
+ "Missing passkey data. Please re-enroll your passkey."
18566
+ );
18567
+ }
18568
+ if (restoringRef.current) {
18569
+ return restoringRef.current;
18570
+ }
18571
+ console.log("[useVolr] Auto-restoring passkey provider...");
18572
+ restoringRef.current = restorePasskey({
18573
+ client: apiClient,
18574
+ userId: user.id,
18575
+ blobUrl: user.blobUrl,
18576
+ prfInput: user.prfInput,
18577
+ credentialId: user.credentialId
18578
+ }).then(async ({ provider: restoredProvider }) => {
18579
+ await setProvider(restoredProvider);
18580
+ console.log("[useVolr] Passkey provider restored successfully");
18581
+ restoringRef.current = null;
18582
+ return restoredProvider;
18583
+ }).catch((err) => {
18584
+ restoringRef.current = null;
18585
+ throw err;
18586
+ });
18587
+ return restoringRef.current;
18588
+ }, [provider, user, apiClient, setProvider]);
18540
18589
  const signMessage = react.useCallback(
18541
18590
  async (message) => {
18542
- if (!provider) {
18543
- throw new Error(
18544
- "No wallet provider available. Please log in with a Passkey or MPC wallet to sign messages."
18545
- );
18546
- }
18591
+ const activeProvider = await ensureProvider();
18547
18592
  if (config.onSignRequest) {
18548
18593
  await config.onSignRequest({ type: "message", message });
18549
18594
  }
18550
- await provider.ensureSession({ interactive: true });
18595
+ await activeProvider.ensureSession({ interactive: true });
18551
18596
  const messageHash = hashMessage(
18552
18597
  typeof message === "string" ? message : { raw: message }
18553
18598
  );
@@ -18556,28 +18601,25 @@ function useVolr() {
18556
18601
  for (let i = 0; i < 32; i++) {
18557
18602
  hashBytes[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);
18558
18603
  }
18559
- const sig = await provider.signMessage(hashBytes);
18604
+ const sig = await activeProvider.signMessage(hashBytes);
18560
18605
  const v = sig.yParity + 27;
18561
18606
  const rHex = Array.from(sig.r).map((b) => b.toString(16).padStart(2, "0")).join("");
18562
18607
  const sHex = Array.from(sig.s).map((b) => b.toString(16).padStart(2, "0")).join("");
18563
18608
  const vHex = v.toString(16).padStart(2, "0");
18564
18609
  return `0x${rHex}${sHex}${vHex}`;
18565
18610
  },
18566
- [provider, config.onSignRequest]
18611
+ [ensureProvider, config.onSignRequest]
18567
18612
  );
18568
18613
  const signTypedData = react.useCallback(
18569
18614
  async (typedData) => {
18570
- if (!provider) {
18571
- throw new Error(
18572
- "No wallet provider available. Please log in with a Passkey or MPC wallet to sign typed data."
18573
- );
18574
- }
18615
+ const activeProvider = await ensureProvider();
18575
18616
  if (config.onSignRequest) {
18576
18617
  await config.onSignRequest({ type: "typedData", typedData });
18577
18618
  }
18578
- return provider.signTypedData(typedData);
18619
+ await activeProvider.ensureSession({ interactive: true });
18620
+ return activeProvider.signTypedData(typedData);
18579
18621
  },
18580
- [provider, config.onSignRequest]
18622
+ [ensureProvider, config.onSignRequest]
18581
18623
  );
18582
18624
  const createChainClient = react.useCallback(
18583
18625
  (chainId) => {