signer-test-sdk-react 0.0.19 → 0.0.21

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.
@@ -458,10 +458,24 @@ function AbstraxnProviderInner({ config, children, base, wagmi }) {
458
458
  // Store in localStorage for restoration
459
459
  try {
460
460
  localStorage.setItem('abstraxn_connection_type', connectionTypeValue);
461
+ localStorage.setItem('abstraxn_oauth_pending', 'google');
461
462
  }
462
463
  catch (e) {
463
464
  // Ignore localStorage errors
464
465
  }
466
+ // Clear existing query params before starting new flow
467
+ if (typeof window !== 'undefined') {
468
+ const url = new URL(window.location.href);
469
+ // Remove auth params that might be present from previous attempts
470
+ url.searchParams.delete('code');
471
+ url.searchParams.delete('state');
472
+ url.searchParams.delete('error');
473
+ url.searchParams.delete('success');
474
+ url.searchParams.delete('accessToken');
475
+ url.searchParams.delete('provider');
476
+ url.searchParams.delete('authProvider');
477
+ window.history.replaceState({}, document.title, url.toString());
478
+ }
465
479
  const authManager = walletInstance.getAuthManager();
466
480
  await authManager.loginWithGoogle();
467
481
  },
@@ -472,10 +486,24 @@ function AbstraxnProviderInner({ config, children, base, wagmi }) {
472
486
  setConnectionType(connectionTypeValue);
473
487
  try {
474
488
  localStorage.setItem('abstraxn_connection_type', connectionTypeValue);
489
+ localStorage.setItem('abstraxn_oauth_pending', 'twitter');
475
490
  }
476
491
  catch (e) {
477
492
  // Ignore localStorage errors
478
493
  }
494
+ // Clear existing query params before starting new flow
495
+ if (typeof window !== 'undefined') {
496
+ const url = new URL(window.location.href);
497
+ // Remove auth params that might be present from previous attempts
498
+ url.searchParams.delete('code');
499
+ url.searchParams.delete('state');
500
+ url.searchParams.delete('error');
501
+ url.searchParams.delete('success');
502
+ url.searchParams.delete('accessToken');
503
+ url.searchParams.delete('provider');
504
+ url.searchParams.delete('authProvider');
505
+ window.history.replaceState({}, document.title, url.toString());
506
+ }
479
507
  const authManager = walletInstance.getAuthManager();
480
508
  await authManager.loginWithTwitter();
481
509
  },
@@ -486,10 +514,24 @@ function AbstraxnProviderInner({ config, children, base, wagmi }) {
486
514
  setConnectionType(connectionTypeValue);
487
515
  try {
488
516
  localStorage.setItem('abstraxn_connection_type', connectionTypeValue);
517
+ localStorage.setItem('abstraxn_oauth_pending', 'discord');
489
518
  }
490
519
  catch (e) {
491
520
  // Ignore localStorage errors
492
521
  }
522
+ // Clear existing query params before starting new flow
523
+ if (typeof window !== 'undefined') {
524
+ const url = new URL(window.location.href);
525
+ // Remove auth params that might be present from previous attempts
526
+ url.searchParams.delete('code');
527
+ url.searchParams.delete('state');
528
+ url.searchParams.delete('error');
529
+ url.searchParams.delete('success');
530
+ url.searchParams.delete('accessToken');
531
+ url.searchParams.delete('provider');
532
+ url.searchParams.delete('authProvider');
533
+ window.history.replaceState({}, document.title, url.toString());
534
+ }
493
535
  const authManager = walletInstance.getAuthManager();
494
536
  await authManager.loginWithDiscord();
495
537
  },
@@ -655,7 +697,12 @@ function AbstraxnProviderInner({ config, children, base, wagmi }) {
655
697
  }
656
698
  return path.includes(`/${provider}`);
657
699
  };
658
- onboarding.init();
700
+ try {
701
+ onboarding.init();
702
+ }
703
+ catch (err) {
704
+ console.error('Failed to initialize OnboardingUI:', err);
705
+ }
659
706
  // Check if we should keep it open (if handling a callback)
660
707
  const urlParams = new URLSearchParams(window.location.search);
661
708
  const shouldKeepOpen = hasAuthParams(urlParams);
@@ -682,13 +729,26 @@ function AbstraxnProviderInner({ config, children, base, wagmi }) {
682
729
  }
683
730
  onboardingRef.current = onboarding;
684
731
  // Handle Google OAuth callback (only in useEffect, not exposed)
685
- const handleGoogleCallback = async () => {
732
+ const handleGoogleCallback = async (force = false) => {
686
733
  if (googleCallbackHandledRef.current)
687
734
  return;
688
735
  const urlParams = new URLSearchParams(window.location.search);
689
736
  if (!hasAuthParams(urlParams) || matchesProvider('twitter', urlParams) || matchesProvider('discord', urlParams)) {
690
737
  return;
691
738
  }
739
+ // Check if we initiated this OAuth flow
740
+ let oauthPending = null;
741
+ try {
742
+ oauthPending = localStorage.getItem('abstraxn_oauth_pending');
743
+ }
744
+ catch (e) { }
745
+ if (!force && !oauthPending)
746
+ return;
747
+ // Clear the pending flag
748
+ try {
749
+ localStorage.removeItem('abstraxn_oauth_pending');
750
+ }
751
+ catch (e) { }
692
752
  // Show loading modal if success=true is in URL
693
753
  const hasSuccess = urlParams.get('success') === 'true';
694
754
  if (hasSuccess && onboardingRef.current) {
@@ -748,6 +808,19 @@ function AbstraxnProviderInner({ config, children, base, wagmi }) {
748
808
  if (!hasAuthParams(urlParams) || !matchesProvider('discord', urlParams)) {
749
809
  return;
750
810
  }
811
+ // Check if we initiated this OAuth flow
812
+ let oauthPending = null;
813
+ try {
814
+ oauthPending = localStorage.getItem('abstraxn_oauth_pending');
815
+ }
816
+ catch (e) { }
817
+ if (!oauthPending)
818
+ return;
819
+ // Clear the pending flag
820
+ try {
821
+ localStorage.removeItem('abstraxn_oauth_pending');
822
+ }
823
+ catch (e) { }
751
824
  // Show loading modal if success=true is in URL
752
825
  const hasSuccess = urlParams.get('success') === 'true';
753
826
  if (hasSuccess && onboardingRef.current) {
@@ -807,6 +880,19 @@ function AbstraxnProviderInner({ config, children, base, wagmi }) {
807
880
  if (!hasAuthParams(urlParams) || !matchesProvider('twitter', urlParams)) {
808
881
  return;
809
882
  }
883
+ // Check if we initiated this OAuth flow
884
+ let oauthPending = null;
885
+ try {
886
+ oauthPending = localStorage.getItem('abstraxn_oauth_pending');
887
+ }
888
+ catch (e) { }
889
+ if (!oauthPending)
890
+ return;
891
+ // Clear the pending flag
892
+ try {
893
+ localStorage.removeItem('abstraxn_oauth_pending');
894
+ }
895
+ catch (e) { }
810
896
  // Show loading modal if success=true is in URL
811
897
  const hasSuccess = urlParams.get('success') === 'true';
812
898
  if (hasSuccess && onboardingRef.current) {
@@ -917,6 +1003,10 @@ function AbstraxnProviderInner({ config, children, base, wagmi }) {
917
1003
  // Show onboarding UI (defined first to avoid hoisting issues)
918
1004
  const showOnboarding = useCallback(() => {
919
1005
  setError(null); // Clear any previous errors
1006
+ if (!onboardingRef.current) {
1007
+ console.error('OnboardingUI not initialized - cannot show modal');
1008
+ return;
1009
+ }
920
1010
  if (onboardingRef.current) {
921
1011
  const onboarding = onboardingRef.current;
922
1012
  // Re-initialize if destroyed
@@ -1613,7 +1703,7 @@ function AbstraxnProviderInner({ config, children, base, wagmi }) {
1613
1703
  }
1614
1704
  }, []);
1615
1705
  // Handle Google callback
1616
- const handleGoogleCallback = useCallback(async () => {
1706
+ const handleGoogleCallback = useCallback(async (_force = false) => {
1617
1707
  if (!walletRef.current)
1618
1708
  return;
1619
1709
  setLoading(true);
@@ -2350,7 +2440,7 @@ function AbstraxnProviderInner({ config, children, base, wagmi }) {
2350
2440
  loginWithOTP,
2351
2441
  verifyOTP,
2352
2442
  loginWithGoogle,
2353
- handleGoogleCallback,
2443
+ handleGoogleCallback: () => handleGoogleCallback(true),
2354
2444
  refreshWhoami,
2355
2445
  uiConfig: config.ui,
2356
2446
  // External wallet methods
@@ -2987,8 +3077,12 @@ export function AbstraxnProvider({ config, children }) {
2987
3077
  const { wagmiConfig, configError } = useMemo(() => {
2988
3078
  if (!externalWalletsEnabled)
2989
3079
  return { wagmiConfig: null, configError: null };
3080
+ // Use provided config if available
3081
+ if (config.wagmiConfig) {
3082
+ return { wagmiConfig: config.wagmiConfig, configError: null };
3083
+ }
2990
3084
  try {
2991
- const configResult = createWagmiConfig(wagmiChains, config.externalWallets?.walletConnectProjectId, config.externalWallets?.connectors, config.ui?.theme || 'dark');
3085
+ const configResult = createWagmiConfig(wagmiChains, config.externalWallets?.walletConnectProjectId, config.externalWallets?.connectors, config.ui?.theme || 'dark', config.externalWallets?.ssr);
2992
3086
  return { wagmiConfig: configResult, configError: null };
2993
3087
  }
2994
3088
  catch (error) {
@@ -2998,7 +3092,7 @@ export function AbstraxnProvider({ config, children }) {
2998
3092
  configError: error instanceof Error ? error : new Error('Failed to create wagmi config')
2999
3093
  };
3000
3094
  }
3001
- }, [externalWalletsEnabled, wagmiChains, config.externalWallets?.walletConnectProjectId, config.externalWallets?.connectors]);
3095
+ }, [externalWalletsEnabled, wagmiChains, config.externalWallets?.walletConnectProjectId, config.externalWallets?.connectors, config.wagmiConfig, config.externalWallets?.ssr]);
3002
3096
  // If external wallets are enabled, wrap with QueryClientProvider and WagmiProvider
3003
3097
  if (externalWalletsEnabled) {
3004
3098
  // Check if React Query is available BEFORE doing anything else
@@ -3021,7 +3115,7 @@ export function AbstraxnProvider({ config, children }) {
3021
3115
  // Don't render AbstraxnProviderInner until wagmiConfig is ready
3022
3116
  return (_jsx(QueryClientWrapper, { queryClient: queryClient, children: _jsx("div", { style: { display: 'none' }, children: "Loading wallet connectors..." }) }));
3023
3117
  }
3024
- return (_jsx(QueryClientWrapper, { queryClient: queryClient, children: _jsx(WagmiProvider, { config: wagmiConfig, children: _jsx(AbstraxnProviderWithWagmi, { config: config, children: children }) }) }));
3118
+ return (_jsx(QueryClientWrapper, { queryClient: queryClient, children: _jsx(WagmiProvider, { config: wagmiConfig, initialState: config.initialState, children: _jsx(AbstraxnProviderWithWagmi, { config: config, children: children }) }) }));
3025
3119
  }
3026
3120
  // If external wallets are disabled, use the provider without wagmi
3027
3121
  return _jsx(AbstraxnProviderWithoutWagmi, { config: config, children: children });