@proveanything/smartlinks-auth-ui 0.1.16 → 0.1.18

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,CAmbpD,CAAC;AAEF,eAAO,MAAM,OAAO,QAAO,gBAM1B,CAAC"}
package/dist/index.esm.js CHANGED
@@ -11225,6 +11225,9 @@ 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 guards to prevent race conditions on hot reload
11229
+ const initializingRef = useRef(false);
11230
+ const initializedRef = useRef(false);
11228
11231
  // Notify all subscribers of auth state changes
11229
11232
  const notifyAuthStateChange = useCallback((type, currentUser, currentToken, currentAccountData, currentAccountInfo) => {
11230
11233
  callbacksRef.current.forEach(callback => {
@@ -11244,6 +11247,13 @@ const AuthProvider = ({ children, proxyMode = false, accountCacheTTL = 5 * 60 *
11244
11247
  }, []);
11245
11248
  // Initialize auth state - different behavior for proxy mode vs standalone mode
11246
11249
  useEffect(() => {
11250
+ // Prevent concurrent initialization (race condition fix)
11251
+ if (initializingRef.current || initializedRef.current) {
11252
+ console.log('[AuthContext] Skipping initialization - already in progress or completed');
11253
+ return;
11254
+ }
11255
+ let isMounted = true;
11256
+ initializingRef.current = true;
11247
11257
  const initializeAuth = async () => {
11248
11258
  try {
11249
11259
  if (proxyMode) {
@@ -11255,7 +11265,7 @@ const AuthProvider = ({ children, proxyMode = false, accountCacheTTL = 5 * 60 *
11255
11265
  // empty/undefined if no user is logged in
11256
11266
  const accountAny = accountResponse;
11257
11267
  const hasValidSession = accountAny?.uid && accountAny.uid.length > 0;
11258
- if (hasValidSession) {
11268
+ if (hasValidSession && isMounted) {
11259
11269
  // User is logged in with valid account
11260
11270
  const userFromAccount = {
11261
11271
  uid: accountAny.uid,
@@ -11269,14 +11279,18 @@ const AuthProvider = ({ children, proxyMode = false, accountCacheTTL = 5 * 60 *
11269
11279
  console.log('[AuthContext] Proxy mode: initialized from parent account, uid:', accountAny.uid);
11270
11280
  notifyAuthStateChange('LOGIN', userFromAccount, null, accountResponse, accountResponse);
11271
11281
  }
11272
- else {
11282
+ else if (isMounted) {
11273
11283
  console.log('[AuthContext] Proxy mode: no valid session (no uid), awaiting login');
11274
11284
  }
11275
11285
  }
11276
11286
  catch (error) {
11277
11287
  console.log('[AuthContext] Proxy mode: auth.getAccount() failed, awaiting login:', error);
11278
11288
  }
11279
- setIsLoading(false);
11289
+ if (isMounted) {
11290
+ setIsLoading(false);
11291
+ initializedRef.current = true;
11292
+ initializingRef.current = false;
11293
+ }
11280
11294
  return;
11281
11295
  }
11282
11296
  // STANDALONE MODE: Load from persistent storage
@@ -11284,28 +11298,48 @@ const AuthProvider = ({ children, proxyMode = false, accountCacheTTL = 5 * 60 *
11284
11298
  const storedUser = await tokenStorage.getUser();
11285
11299
  const storedAccountData = await tokenStorage.getAccountData();
11286
11300
  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
- });
11301
+ // Verify token FIRST before setting state
11302
+ try {
11303
+ console.log('[AuthContext] Verifying stored token...');
11304
+ await smartlinks.auth.verifyToken(storedToken.token);
11305
+ // Only set state if verification succeeded and component still mounted
11306
+ if (isMounted) {
11307
+ setToken(storedToken.token);
11308
+ setUser(storedUser);
11309
+ setAccountData(storedAccountData);
11310
+ console.log('[AuthContext] Session restored successfully');
11311
+ }
11312
+ }
11313
+ catch (err) {
11314
+ console.warn('[AuthContext] Token verification failed, clearing stored credentials:', err);
11315
+ await tokenStorage.clearAll();
11316
+ // Don't set user state - leave as logged out
11317
+ }
11294
11318
  }
11295
11319
  // Load cached account info if available
11296
- const cachedAccountInfo = await tokenStorage.getAccountInfo();
11297
- if (cachedAccountInfo && !cachedAccountInfo.isStale) {
11298
- setAccountInfo(cachedAccountInfo.data);
11320
+ if (isMounted) {
11321
+ const cachedAccountInfo = await tokenStorage.getAccountInfo();
11322
+ if (cachedAccountInfo && !cachedAccountInfo.isStale) {
11323
+ setAccountInfo(cachedAccountInfo.data);
11324
+ }
11299
11325
  }
11300
11326
  }
11301
11327
  catch (error) {
11302
- console.error('Failed to initialize auth from storage:', error);
11328
+ console.error('[AuthContext] Failed to initialize auth from storage:', error);
11303
11329
  }
11304
11330
  finally {
11305
- setIsLoading(false);
11331
+ if (isMounted) {
11332
+ setIsLoading(false);
11333
+ initializedRef.current = true;
11334
+ initializingRef.current = false;
11335
+ }
11306
11336
  }
11307
11337
  };
11308
11338
  initializeAuth();
11339
+ // Cleanup for hot reload
11340
+ return () => {
11341
+ isMounted = false;
11342
+ };
11309
11343
  }, [proxyMode, notifyAuthStateChange]);
11310
11344
  // Listen for parent auth state changes (proxy mode only)
11311
11345
  useEffect(() => {