@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/api.cjs +37 -1
- package/dist/api.cjs.map +1 -1
- package/dist/api.js +31 -1
- package/dist/api.js.map +1 -1
- package/dist/index.cjs +46 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +43 -3
- package/dist/index.js.map +1 -1
- package/dist/preferences.cjs +27 -0
- package/dist/preferences.cjs.map +1 -1
- package/dist/preferences.js +27 -0
- package/dist/preferences.js.map +1 -1
- package/dist/react/AuthProvider.cjs +9 -3
- package/dist/react/AuthProvider.cjs.map +1 -1
- package/dist/react/AuthProvider.js +9 -3
- package/dist/react/AuthProvider.js.map +1 -1
- package/dist/react/PreferencesProvider.cjs +27 -0
- package/dist/react/PreferencesProvider.cjs.map +1 -1
- package/dist/react/PreferencesProvider.js +27 -0
- package/dist/react/PreferencesProvider.js.map +1 -1
- package/dist/react/useAuth.cjs.map +1 -1
- package/dist/react/useAuth.js.map +1 -1
- package/dist/react/useSessionMonitor.cjs +31 -0
- package/dist/react/useSessionMonitor.cjs.map +1 -1
- package/dist/react/useSessionMonitor.js +31 -0
- package/dist/react/useSessionMonitor.js.map +1 -1
- package/package.json +1 -1
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,
|