@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.js CHANGED
@@ -9885,11 +9885,18 @@ function useWalletEvents({
9885
9885
  }) {
9886
9886
  useEffect(() => {
9887
9887
  if (!user) return;
9888
+ if (user.keyStorageType === "passkey") {
9889
+ console.log("[Provider] Passkey user - skipping external wallet event listeners");
9890
+ return;
9891
+ }
9888
9892
  if (typeof window === "undefined" || !window.ethereum) {
9889
9893
  return;
9890
9894
  }
9891
9895
  const ethereum = window.ethereum;
9892
9896
  const handleAccountsChanged = (accounts) => {
9897
+ if (user.signerType !== "external_wallet") {
9898
+ return;
9899
+ }
9893
9900
  if (accounts.length === 0) {
9894
9901
  console.warn("[Provider] Wallet disconnected, logging out...");
9895
9902
  setTimeout(() => logout(), 3e3);
@@ -9904,9 +9911,15 @@ function useWalletEvents({
9904
9911
  setUser(
9905
9912
  (prev) => prev ? { ...prev, lastWalletChainId: newChainId } : null
9906
9913
  );
9907
- window.location.reload();
9914
+ if (user.signerType === "external_wallet") {
9915
+ window.location.reload();
9916
+ }
9908
9917
  };
9909
9918
  const handleDisconnect = () => {
9919
+ if (user.signerType !== "external_wallet") {
9920
+ console.log("[Provider] disconnect event ignored (not external_wallet signer)");
9921
+ return;
9922
+ }
9910
9923
  console.log("[Provider] disconnect event");
9911
9924
  setProviderState(null);
9912
9925
  safeStorage.removeItem(STORAGE_KEYS.provider);
@@ -18509,21 +18522,53 @@ function useVolr() {
18509
18522
  const { precheck } = usePrecheck();
18510
18523
  const { relay } = useRelay();
18511
18524
  const { client: apiClient } = useInternalAuth();
18525
+ const restoringRef = useRef(null);
18512
18526
  const getRpcUrl = useCallback(
18513
18527
  createGetRpcUrl({ client: apiClient, rpcOverrides: config.rpcOverrides }),
18514
18528
  [apiClient, config.rpcOverrides]
18515
18529
  );
18530
+ const ensureProvider = useCallback(async () => {
18531
+ if (provider) {
18532
+ return provider;
18533
+ }
18534
+ if (!user?.keyStorageType || user.keyStorageType !== "passkey") {
18535
+ throw new Error(
18536
+ "No wallet provider available. Please complete passkey enrollment first."
18537
+ );
18538
+ }
18539
+ if (!user.blobUrl || !user.prfInput || !user.id) {
18540
+ throw new Error(
18541
+ "Missing passkey data. Please re-enroll your passkey."
18542
+ );
18543
+ }
18544
+ if (restoringRef.current) {
18545
+ return restoringRef.current;
18546
+ }
18547
+ console.log("[useVolr] Auto-restoring passkey provider...");
18548
+ restoringRef.current = restorePasskey({
18549
+ client: apiClient,
18550
+ userId: user.id,
18551
+ blobUrl: user.blobUrl,
18552
+ prfInput: user.prfInput,
18553
+ credentialId: user.credentialId
18554
+ }).then(async ({ provider: restoredProvider }) => {
18555
+ await setProvider(restoredProvider);
18556
+ console.log("[useVolr] Passkey provider restored successfully");
18557
+ restoringRef.current = null;
18558
+ return restoredProvider;
18559
+ }).catch((err) => {
18560
+ restoringRef.current = null;
18561
+ throw err;
18562
+ });
18563
+ return restoringRef.current;
18564
+ }, [provider, user, apiClient, setProvider]);
18516
18565
  const signMessage = useCallback(
18517
18566
  async (message) => {
18518
- if (!provider) {
18519
- throw new Error(
18520
- "No wallet provider available. Please log in with a Passkey or MPC wallet to sign messages."
18521
- );
18522
- }
18567
+ const activeProvider = await ensureProvider();
18523
18568
  if (config.onSignRequest) {
18524
18569
  await config.onSignRequest({ type: "message", message });
18525
18570
  }
18526
- await provider.ensureSession({ interactive: true });
18571
+ await activeProvider.ensureSession({ interactive: true });
18527
18572
  const messageHash = hashMessage(
18528
18573
  typeof message === "string" ? message : { raw: message }
18529
18574
  );
@@ -18532,28 +18577,25 @@ function useVolr() {
18532
18577
  for (let i = 0; i < 32; i++) {
18533
18578
  hashBytes[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);
18534
18579
  }
18535
- const sig = await provider.signMessage(hashBytes);
18580
+ const sig = await activeProvider.signMessage(hashBytes);
18536
18581
  const v = sig.yParity + 27;
18537
18582
  const rHex = Array.from(sig.r).map((b) => b.toString(16).padStart(2, "0")).join("");
18538
18583
  const sHex = Array.from(sig.s).map((b) => b.toString(16).padStart(2, "0")).join("");
18539
18584
  const vHex = v.toString(16).padStart(2, "0");
18540
18585
  return `0x${rHex}${sHex}${vHex}`;
18541
18586
  },
18542
- [provider, config.onSignRequest]
18587
+ [ensureProvider, config.onSignRequest]
18543
18588
  );
18544
18589
  const signTypedData = useCallback(
18545
18590
  async (typedData) => {
18546
- if (!provider) {
18547
- throw new Error(
18548
- "No wallet provider available. Please log in with a Passkey or MPC wallet to sign typed data."
18549
- );
18550
- }
18591
+ const activeProvider = await ensureProvider();
18551
18592
  if (config.onSignRequest) {
18552
18593
  await config.onSignRequest({ type: "typedData", typedData });
18553
18594
  }
18554
- return provider.signTypedData(typedData);
18595
+ await activeProvider.ensureSession({ interactive: true });
18596
+ return activeProvider.signTypedData(typedData);
18555
18597
  },
18556
- [provider, config.onSignRequest]
18598
+ [ensureProvider, config.onSignRequest]
18557
18599
  );
18558
18600
  const createChainClient = useCallback(
18559
18601
  (chainId) => {