@proveanything/smartlinks-auth-ui 0.1.17 → 0.1.19

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.
@@ -1 +1 @@
1
- {"version":3,"file":"AuthContext.d.ts","sourceRoot":"","sources":["../../src/context/AuthContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8E,MAAM,OAAO,CAAC;AAKnG,OAAO,KAAK,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAElE,UAAU,gBAAgB;IACxB,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;IACxC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;IACxC,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3F,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACvC,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,UAAU,EAAE,CAAC,YAAY,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IACrE,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IACnD,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,iBAAiB,EAAE,CAAC,QAAQ,EAAE,uBAAuB,KAAK,MAAM,IAAI,CAAC;CACtE;AAID,UAAU,iBAAiB;IACzB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CA8YpD,CAAC;AAEF,eAAO,MAAM,OAAO,QAAO,gBAM1B,CAAC"}
1
+ {"version":3,"file":"AuthContext.d.ts","sourceRoot":"","sources":["../../src/context/AuthContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8E,MAAM,OAAO,CAAC;AAKnG,OAAO,KAAK,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAElE,UAAU,gBAAgB;IACxB,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;IACxC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;IACxC,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3F,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACvC,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,UAAU,EAAE,CAAC,YAAY,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IACrE,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IACnD,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,iBAAiB,EAAE,CAAC,QAAQ,EAAE,uBAAuB,KAAK,MAAM,IAAI,CAAC;CACtE;AAID,UAAU,iBAAiB;IACzB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAgbpD,CAAC;AAEF,eAAO,MAAM,OAAO,QAAO,gBAM1B,CAAC"}
package/dist/index.esm.js CHANGED
@@ -11225,6 +11225,8 @@ const AuthProvider = ({ children, proxyMode = false, accountCacheTTL = 5 * 60 *
11225
11225
  const [accountInfo, setAccountInfo] = useState(null);
11226
11226
  const [isLoading, setIsLoading] = useState(true);
11227
11227
  const callbacksRef = useRef(new Set());
11228
+ // Initialization guard to prevent concurrent runs (NOT persisted across remounts)
11229
+ const initializingRef = useRef(false);
11228
11230
  // Notify all subscribers of auth state changes
11229
11231
  const notifyAuthStateChange = useCallback((type, currentUser, currentToken, currentAccountData, currentAccountInfo) => {
11230
11232
  callbacksRef.current.forEach(callback => {
@@ -11244,6 +11246,13 @@ const AuthProvider = ({ children, proxyMode = false, accountCacheTTL = 5 * 60 *
11244
11246
  }, []);
11245
11247
  // Initialize auth state - different behavior for proxy mode vs standalone mode
11246
11248
  useEffect(() => {
11249
+ // Prevent concurrent initialization only
11250
+ if (initializingRef.current) {
11251
+ console.log('[AuthContext] Skipping initialization - already in progress');
11252
+ return;
11253
+ }
11254
+ let isMounted = true;
11255
+ initializingRef.current = true;
11247
11256
  const initializeAuth = async () => {
11248
11257
  try {
11249
11258
  if (proxyMode) {
@@ -11255,7 +11264,7 @@ const AuthProvider = ({ children, proxyMode = false, accountCacheTTL = 5 * 60 *
11255
11264
  // empty/undefined if no user is logged in
11256
11265
  const accountAny = accountResponse;
11257
11266
  const hasValidSession = accountAny?.uid && accountAny.uid.length > 0;
11258
- if (hasValidSession) {
11267
+ if (hasValidSession && isMounted) {
11259
11268
  // User is logged in with valid account
11260
11269
  const userFromAccount = {
11261
11270
  uid: accountAny.uid,
@@ -11269,14 +11278,17 @@ const AuthProvider = ({ children, proxyMode = false, accountCacheTTL = 5 * 60 *
11269
11278
  console.log('[AuthContext] Proxy mode: initialized from parent account, uid:', accountAny.uid);
11270
11279
  notifyAuthStateChange('LOGIN', userFromAccount, null, accountResponse, accountResponse);
11271
11280
  }
11272
- else {
11281
+ else if (isMounted) {
11273
11282
  console.log('[AuthContext] Proxy mode: no valid session (no uid), awaiting login');
11274
11283
  }
11275
11284
  }
11276
11285
  catch (error) {
11277
11286
  console.log('[AuthContext] Proxy mode: auth.getAccount() failed, awaiting login:', error);
11278
11287
  }
11279
- setIsLoading(false);
11288
+ if (isMounted) {
11289
+ setIsLoading(false);
11290
+ initializingRef.current = false;
11291
+ }
11280
11292
  return;
11281
11293
  }
11282
11294
  // STANDALONE MODE: Load from persistent storage
@@ -11284,28 +11296,47 @@ const AuthProvider = ({ children, proxyMode = false, accountCacheTTL = 5 * 60 *
11284
11296
  const storedUser = await tokenStorage.getUser();
11285
11297
  const storedAccountData = await tokenStorage.getAccountData();
11286
11298
  if (storedToken && storedUser) {
11287
- setToken(storedToken.token);
11288
- setUser(storedUser);
11289
- setAccountData(storedAccountData);
11290
- // Set bearer token in global Smartlinks SDK via auth.verifyToken
11291
- smartlinks.auth.verifyToken(storedToken.token).catch(err => {
11292
- console.warn('Failed to restore bearer token on init:', err);
11293
- });
11299
+ // Verify token FIRST before setting state
11300
+ try {
11301
+ console.log('[AuthContext] Verifying stored token...');
11302
+ await smartlinks.auth.verifyToken(storedToken.token);
11303
+ // Only set state if verification succeeded and component still mounted
11304
+ if (isMounted) {
11305
+ setToken(storedToken.token);
11306
+ setUser(storedUser);
11307
+ setAccountData(storedAccountData);
11308
+ console.log('[AuthContext] Session restored successfully');
11309
+ }
11310
+ }
11311
+ catch (err) {
11312
+ console.warn('[AuthContext] Token verification failed, clearing stored credentials:', err);
11313
+ await tokenStorage.clearAll();
11314
+ // Don't set user state - leave as logged out
11315
+ }
11294
11316
  }
11295
11317
  // Load cached account info if available
11296
- const cachedAccountInfo = await tokenStorage.getAccountInfo();
11297
- if (cachedAccountInfo && !cachedAccountInfo.isStale) {
11298
- setAccountInfo(cachedAccountInfo.data);
11318
+ if (isMounted) {
11319
+ const cachedAccountInfo = await tokenStorage.getAccountInfo();
11320
+ if (cachedAccountInfo && !cachedAccountInfo.isStale) {
11321
+ setAccountInfo(cachedAccountInfo.data);
11322
+ }
11299
11323
  }
11300
11324
  }
11301
11325
  catch (error) {
11302
- console.error('Failed to initialize auth from storage:', error);
11326
+ console.error('[AuthContext] Failed to initialize auth from storage:', error);
11303
11327
  }
11304
11328
  finally {
11305
- setIsLoading(false);
11329
+ if (isMounted) {
11330
+ setIsLoading(false);
11331
+ initializingRef.current = false;
11332
+ }
11306
11333
  }
11307
11334
  };
11308
11335
  initializeAuth();
11336
+ // Cleanup for hot reload
11337
+ return () => {
11338
+ isMounted = false;
11339
+ };
11309
11340
  }, [proxyMode, notifyAuthStateChange]);
11310
11341
  // Listen for parent auth state changes (proxy mode only)
11311
11342
  useEffect(() => {