@spidy092/auth-client 3.1.5 → 3.2.0

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
@@ -963,6 +963,29 @@ api.interceptors.request.use((config2) => {
963
963
  return config2;
964
964
  });
965
965
  var refreshPromise2 = null;
966
+ var SINGLE_ORG_DENIED_EVENT = "auth:single-org-denied";
967
+ function responseErrorCode(response) {
968
+ var _a;
969
+ const data = response == null ? void 0 : response.data;
970
+ return ((_a = data == null ? void 0 : data.errors) == null ? void 0 : _a.code) || (data == null ? void 0 : data.code) || null;
971
+ }
972
+ function isTenantAccessDenied(response) {
973
+ return (response == null ? void 0 : response.status) === 403 && responseErrorCode(response) === "TENANT_ACCESS_DENIED";
974
+ }
975
+ function isSingleOrganizationMode(response) {
976
+ return (response == null ? void 0 : response.status) === 409 && responseErrorCode(response) === "SINGLE_ORGANIZATION_MODE";
977
+ }
978
+ function dispatchSingleOrgDenied(response) {
979
+ var _a, _b;
980
+ if (typeof window === "undefined" || typeof window.dispatchEvent !== "function") return;
981
+ window.dispatchEvent(new CustomEvent(SINGLE_ORG_DENIED_EVENT, {
982
+ detail: {
983
+ code: responseErrorCode(response),
984
+ status: (response == null ? void 0 : response.status) || null,
985
+ currentOrgId: ((_b = (_a = response == null ? void 0 : response.data) == null ? void 0 : _a.errors) == null ? void 0 : _b.current_org_id) || null
986
+ }
987
+ }));
988
+ }
966
989
  api.interceptors.response.use(
967
990
  (response) => response,
968
991
  async (error) => {
@@ -970,6 +993,10 @@ api.interceptors.response.use(
970
993
  if (!response || !config2) {
971
994
  return Promise.reject(error);
972
995
  }
996
+ if (isTenantAccessDenied(response) || isSingleOrganizationMode(response)) {
997
+ dispatchSingleOrgDenied(response);
998
+ return Promise.reject(error);
999
+ }
973
1000
  if (response.status !== 401 || config2._retry) {
974
1001
  return Promise.reject(error);
975
1002
  }
@@ -1251,6 +1278,7 @@ function AuthProvider({ children, onSessionExpired, manageSessionSecurity = true
1251
1278
  const onSessionExpiredRef = useRef(onSessionExpired);
1252
1279
  const recoveryInFlightRef = useRef(null);
1253
1280
  const profileRecoveryTokensRef = useRef(/* @__PURE__ */ new Set());
1281
+ const profileLoadedRef = useRef(false);
1254
1282
  useEffect(() => {
1255
1283
  onSessionExpiredRef.current = onSessionExpired;
1256
1284
  }, [onSessionExpired]);
@@ -1260,8 +1288,9 @@ function AuthProvider({ children, onSessionExpired, manageSessionSecurity = true
1260
1288
  setTokenState(nextToken);
1261
1289
  if (nextToken) {
1262
1290
  setSessionValid(true);
1263
- setLoading(true);
1291
+ if (!profileLoadedRef.current) setLoading(true);
1264
1292
  } else {
1293
+ profileLoadedRef.current = false;
1265
1294
  setSessionValid(false);
1266
1295
  setUser(null);
1267
1296
  setLoading(false);
@@ -1273,6 +1302,7 @@ function AuthProvider({ children, onSessionExpired, manageSessionSecurity = true
1273
1302
  clearToken();
1274
1303
  setTokenState(null);
1275
1304
  setUser(null);
1305
+ profileLoadedRef.current = false;
1276
1306
  setSessionValid(false);
1277
1307
  setLoading(false);
1278
1308
  };
@@ -1288,7 +1318,7 @@ function AuthProvider({ children, onSessionExpired, manageSessionSecurity = true
1288
1318
  if (recoveredToken) {
1289
1319
  setTokenState(recoveredToken);
1290
1320
  setSessionValid(true);
1291
- setLoading(true);
1321
+ if (!profileLoadedRef.current) setLoading(true);
1292
1322
  return true;
1293
1323
  }
1294
1324
  } catch (error) {
@@ -1365,6 +1395,7 @@ function AuthProvider({ children, onSessionExpired, manageSessionSecurity = true
1365
1395
  const userData = (responseBody == null ? void 0 : responseBody.data) ?? responseBody;
1366
1396
  console.log("\u2705 Profile fetched successfully:", userData.email);
1367
1397
  setUser(userData);
1398
+ profileLoadedRef.current = true;
1368
1399
  setSessionValid(true);
1369
1400
  setLoading(false);
1370
1401
  } catch (error) {
@@ -1399,6 +1430,7 @@ function AuthProvider({ children, onSessionExpired, manageSessionSecurity = true
1399
1430
  if (cancelled) return;
1400
1431
  const userData = (responseBody == null ? void 0 : responseBody.data) ?? responseBody;
1401
1432
  setUser(userData);
1433
+ profileLoadedRef.current = true;
1402
1434
  setSessionValid(true);
1403
1435
  setLoading(false);
1404
1436
  return;
@@ -1445,7 +1477,7 @@ function AuthProvider({ children, onSessionExpired, manageSessionSecurity = true
1445
1477
  setToken(newToken);
1446
1478
  setTokenState(newToken);
1447
1479
  setSessionValid(true);
1448
- if (newToken) setLoading(true);
1480
+ if (newToken && !profileLoadedRef.current) setLoading(true);
1449
1481
  },
1450
1482
  clearToken: () => {
1451
1483
  stopSessionSecurity();
@@ -1453,6 +1485,7 @@ function AuthProvider({ children, onSessionExpired, manageSessionSecurity = true
1453
1485
  clearToken();
1454
1486
  setTokenState(null);
1455
1487
  setUser(null);
1488
+ profileLoadedRef.current = false;
1456
1489
  }
1457
1490
  };
1458
1491
  return /* @__PURE__ */ React.createElement(AuthContext.Provider, { value }, children);
@@ -1645,6 +1678,10 @@ var auth = {
1645
1678
  // 🌐 Authenticated API client
1646
1679
  api: api_default,
1647
1680
  preferences,
1681
+ // 🏢 Single-organization mode helpers
1682
+ SINGLE_ORG_DENIED_EVENT,
1683
+ isTenantAccessDenied,
1684
+ isSingleOrganizationMode,
1648
1685
  // 🔎 Safe authentication diagnostics
1649
1686
  getDiagnosticContext,
1650
1687
  emitAuthDiagnostic,
@@ -1696,12 +1733,15 @@ export {
1696
1733
  AuthProvider,
1697
1734
  PREFERENCE_DEFAULTS,
1698
1735
  PreferencesProvider,
1736
+ SINGLE_ORG_DENIED_EVENT,
1699
1737
  applyPreferences,
1700
1738
  auth,
1701
1739
  formatUserDate,
1702
1740
  formatUserNumber,
1703
1741
  formatUserRelativeTime,
1704
1742
  getPreferences,
1743
+ isSingleOrganizationMode,
1744
+ isTenantAccessDenied,
1705
1745
  normalizePreferences,
1706
1746
  resolveTheme,
1707
1747
  startPreferenceSync,