@oxyhq/services 13.3.0 → 14.0.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/lib/commonjs/index.js +11 -17
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/ui/components/AccountMenu.js +103 -65
- package/lib/commonjs/ui/components/AccountMenu.js.map +1 -1
- package/lib/commonjs/ui/components/AccountSwitcher.js +84 -126
- package/lib/commonjs/ui/components/AccountSwitcher.js.map +1 -1
- package/lib/commonjs/ui/components/ProfileMenu.js +140 -153
- package/lib/commonjs/ui/components/ProfileMenu.js.map +1 -1
- package/lib/commonjs/ui/components/SignInModal.js +4 -4
- package/lib/commonjs/ui/components/SignInModal.js.map +1 -1
- package/lib/commonjs/ui/context/OxyContext.js +506 -466
- package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
- package/lib/commonjs/ui/context/hooks/useAuthOperations.js +59 -57
- package/lib/commonjs/ui/context/hooks/useAuthOperations.js.map +1 -1
- package/lib/commonjs/ui/context/inSessionTokenRefresh.js +23 -42
- package/lib/commonjs/ui/context/inSessionTokenRefresh.js.map +1 -1
- package/lib/commonjs/ui/context/silentSessionRestore.js +12 -21
- package/lib/commonjs/ui/context/silentSessionRestore.js.map +1 -1
- package/lib/commonjs/ui/hooks/useAuth.js +4 -3
- package/lib/commonjs/ui/hooks/useAuth.js.map +1 -1
- package/lib/commonjs/ui/hooks/useOxyAuthSession.js +12 -7
- package/lib/commonjs/ui/hooks/useOxyAuthSession.js.map +1 -1
- package/lib/commonjs/ui/hooks/useSessionManagement.js +17 -65
- package/lib/commonjs/ui/hooks/useSessionManagement.js.map +1 -1
- package/lib/commonjs/ui/hooks/useSwitchableAccounts.js +288 -0
- package/lib/commonjs/ui/hooks/useSwitchableAccounts.js.map +1 -0
- package/lib/commonjs/ui/hooks/useWebSSO.js +12 -191
- package/lib/commonjs/ui/hooks/useWebSSO.js.map +1 -1
- package/lib/commonjs/ui/index.js.map +1 -1
- package/lib/commonjs/ui/screens/OxyAuthScreen.js +2 -2
- package/lib/commonjs/ui/screens/OxyAuthScreen.js.map +1 -1
- package/lib/commonjs/ui/session/createSessionClient.js +28 -0
- package/lib/commonjs/ui/session/createSessionClient.js.map +1 -0
- package/lib/commonjs/ui/session/index.js +52 -0
- package/lib/commonjs/ui/session/index.js.map +1 -0
- package/lib/commonjs/ui/session/projectSessionState.js +86 -0
- package/lib/commonjs/ui/session/projectSessionState.js.map +1 -0
- package/lib/commonjs/ui/session/sessionClientHost.js +30 -0
- package/lib/commonjs/ui/session/sessionClientHost.js.map +1 -0
- package/lib/commonjs/ui/session/tokenTransport.js +77 -0
- package/lib/commonjs/ui/session/tokenTransport.js.map +1 -0
- package/lib/commonjs/ui/utils/activeAuthuser.js +35 -79
- package/lib/commonjs/ui/utils/activeAuthuser.js.map +1 -1
- package/lib/commonjs/ui/utils/sessionHelpers.js +1 -51
- package/lib/commonjs/ui/utils/sessionHelpers.js.map +1 -1
- package/lib/commonjs/utils/deviceFlowSignIn.js +70 -15
- package/lib/commonjs/utils/deviceFlowSignIn.js.map +1 -1
- package/lib/module/index.js +5 -5
- package/lib/module/index.js.map +1 -1
- package/lib/module/ui/components/AccountMenu.js +103 -65
- package/lib/module/ui/components/AccountMenu.js.map +1 -1
- package/lib/module/ui/components/AccountSwitcher.js +85 -127
- package/lib/module/ui/components/AccountSwitcher.js.map +1 -1
- package/lib/module/ui/components/ProfileMenu.js +143 -156
- package/lib/module/ui/components/ProfileMenu.js.map +1 -1
- package/lib/module/ui/components/SignInModal.js +4 -4
- package/lib/module/ui/components/SignInModal.js.map +1 -1
- package/lib/module/ui/context/OxyContext.js +510 -470
- package/lib/module/ui/context/OxyContext.js.map +1 -1
- package/lib/module/ui/context/hooks/useAuthOperations.js +61 -60
- package/lib/module/ui/context/hooks/useAuthOperations.js.map +1 -1
- package/lib/module/ui/context/inSessionTokenRefresh.js +24 -43
- package/lib/module/ui/context/inSessionTokenRefresh.js.map +1 -1
- package/lib/module/ui/context/silentSessionRestore.js +12 -20
- package/lib/module/ui/context/silentSessionRestore.js.map +1 -1
- package/lib/module/ui/hooks/useAuth.js +4 -3
- package/lib/module/ui/hooks/useAuth.js.map +1 -1
- package/lib/module/ui/hooks/useOxyAuthSession.js +12 -7
- package/lib/module/ui/hooks/useOxyAuthSession.js.map +1 -1
- package/lib/module/ui/hooks/useSessionManagement.js +18 -66
- package/lib/module/ui/hooks/useSessionManagement.js.map +1 -1
- package/lib/module/ui/hooks/useSwitchableAccounts.js +283 -0
- package/lib/module/ui/hooks/useSwitchableAccounts.js.map +1 -0
- package/lib/module/ui/hooks/useWebSSO.js +13 -192
- package/lib/module/ui/hooks/useWebSSO.js.map +1 -1
- package/lib/module/ui/index.js +0 -1
- package/lib/module/ui/index.js.map +1 -1
- package/lib/module/ui/screens/OxyAuthScreen.js +2 -2
- package/lib/module/ui/screens/OxyAuthScreen.js.map +1 -1
- package/lib/module/ui/session/createSessionClient.js +25 -0
- package/lib/module/ui/session/createSessionClient.js.map +1 -0
- package/lib/module/ui/session/index.js +17 -0
- package/lib/module/ui/session/index.js.map +1 -0
- package/lib/module/ui/session/projectSessionState.js +79 -0
- package/lib/module/ui/session/projectSessionState.js.map +1 -0
- package/lib/module/ui/session/sessionClientHost.js +26 -0
- package/lib/module/ui/session/sessionClientHost.js.map +1 -0
- package/lib/module/ui/session/tokenTransport.js +74 -0
- package/lib/module/ui/session/tokenTransport.js.map +1 -0
- package/lib/module/ui/utils/activeAuthuser.js +34 -76
- package/lib/module/ui/utils/activeAuthuser.js.map +1 -1
- package/lib/module/ui/utils/sessionHelpers.js +0 -49
- package/lib/module/ui/utils/sessionHelpers.js.map +1 -1
- package/lib/module/utils/deviceFlowSignIn.js +71 -16
- package/lib/module/utils/deviceFlowSignIn.js.map +1 -1
- package/lib/typescript/commonjs/index.d.ts +2 -3
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/AccountMenu.d.ts +4 -2
- package/lib/typescript/commonjs/ui/components/AccountMenu.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/AccountSwitcher.d.ts +7 -8
- package/lib/typescript/commonjs/ui/components/AccountSwitcher.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/ProfileMenu.d.ts +12 -9
- package/lib/typescript/commonjs/ui/components/ProfileMenu.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/context/OxyContext.d.ts +16 -13
- package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/context/hooks/useAuthOperations.d.ts +27 -3
- package/lib/typescript/commonjs/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/context/inSessionTokenRefresh.d.ts +22 -17
- package/lib/typescript/commonjs/ui/context/inSessionTokenRefresh.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/context/silentSessionRestore.d.ts +12 -18
- package/lib/typescript/commonjs/ui/context/silentSessionRestore.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/mutations/useAccountMutations.d.ts +1 -0
- package/lib/typescript/commonjs/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/useAuth.d.ts +1 -1
- package/lib/typescript/commonjs/ui/hooks/useAuth.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/useOxyAuthSession.d.ts +2 -2
- package/lib/typescript/commonjs/ui/hooks/useOxyAuthSession.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/useSessionManagement.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/useSwitchableAccounts.d.ts +162 -0
- package/lib/typescript/commonjs/ui/hooks/useSwitchableAccounts.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/hooks/useWebSSO.d.ts +13 -52
- package/lib/typescript/commonjs/ui/hooks/useWebSSO.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/session/createSessionClient.d.ts +15 -0
- package/lib/typescript/commonjs/ui/session/createSessionClient.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/session/index.d.ts +15 -0
- package/lib/typescript/commonjs/ui/session/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/session/projectSessionState.d.ts +45 -0
- package/lib/typescript/commonjs/ui/session/projectSessionState.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/session/sessionClientHost.d.ts +14 -0
- package/lib/typescript/commonjs/ui/session/sessionClientHost.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/session/tokenTransport.d.ts +24 -0
- package/lib/typescript/commonjs/ui/session/tokenTransport.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/utils/activeAuthuser.d.ts +21 -29
- package/lib/typescript/commonjs/ui/utils/activeAuthuser.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/utils/sessionHelpers.d.ts +0 -19
- package/lib/typescript/commonjs/ui/utils/sessionHelpers.d.ts.map +1 -1
- package/lib/typescript/commonjs/utils/deviceFlowSignIn.d.ts +51 -19
- package/lib/typescript/commonjs/utils/deviceFlowSignIn.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts +2 -3
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/AccountMenu.d.ts +4 -2
- package/lib/typescript/module/ui/components/AccountMenu.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/AccountSwitcher.d.ts +7 -8
- package/lib/typescript/module/ui/components/AccountSwitcher.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/ProfileMenu.d.ts +12 -9
- package/lib/typescript/module/ui/components/ProfileMenu.d.ts.map +1 -1
- package/lib/typescript/module/ui/context/OxyContext.d.ts +16 -13
- package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/module/ui/context/hooks/useAuthOperations.d.ts +27 -3
- package/lib/typescript/module/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
- package/lib/typescript/module/ui/context/inSessionTokenRefresh.d.ts +22 -17
- package/lib/typescript/module/ui/context/inSessionTokenRefresh.d.ts.map +1 -1
- package/lib/typescript/module/ui/context/silentSessionRestore.d.ts +12 -18
- package/lib/typescript/module/ui/context/silentSessionRestore.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/mutations/useAccountMutations.d.ts +1 -0
- package/lib/typescript/module/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/useAuth.d.ts +1 -1
- package/lib/typescript/module/ui/hooks/useAuth.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/useOxyAuthSession.d.ts +2 -2
- package/lib/typescript/module/ui/hooks/useOxyAuthSession.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/useSessionManagement.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/useSwitchableAccounts.d.ts +162 -0
- package/lib/typescript/module/ui/hooks/useSwitchableAccounts.d.ts.map +1 -0
- package/lib/typescript/module/ui/hooks/useWebSSO.d.ts +13 -52
- package/lib/typescript/module/ui/hooks/useWebSSO.d.ts.map +1 -1
- package/lib/typescript/module/ui/index.d.ts.map +1 -1
- package/lib/typescript/module/ui/session/createSessionClient.d.ts +15 -0
- package/lib/typescript/module/ui/session/createSessionClient.d.ts.map +1 -0
- package/lib/typescript/module/ui/session/index.d.ts +15 -0
- package/lib/typescript/module/ui/session/index.d.ts.map +1 -0
- package/lib/typescript/module/ui/session/projectSessionState.d.ts +45 -0
- package/lib/typescript/module/ui/session/projectSessionState.d.ts.map +1 -0
- package/lib/typescript/module/ui/session/sessionClientHost.d.ts +14 -0
- package/lib/typescript/module/ui/session/sessionClientHost.d.ts.map +1 -0
- package/lib/typescript/module/ui/session/tokenTransport.d.ts +24 -0
- package/lib/typescript/module/ui/session/tokenTransport.d.ts.map +1 -0
- package/lib/typescript/module/ui/utils/activeAuthuser.d.ts +21 -29
- package/lib/typescript/module/ui/utils/activeAuthuser.d.ts.map +1 -1
- package/lib/typescript/module/ui/utils/sessionHelpers.d.ts +0 -19
- package/lib/typescript/module/ui/utils/sessionHelpers.d.ts.map +1 -1
- package/lib/typescript/module/utils/deviceFlowSignIn.d.ts +51 -19
- package/lib/typescript/module/utils/deviceFlowSignIn.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/index.ts +9 -9
- package/src/ui/components/AccountMenu.tsx +117 -70
- package/src/ui/components/AccountSwitcher.tsx +88 -134
- package/src/ui/components/ProfileMenu.tsx +158 -162
- package/src/ui/components/SignInModal.tsx +5 -5
- package/src/ui/context/OxyContext.tsx +560 -475
- package/src/ui/context/hooks/useAuthOperations.ts +72 -63
- package/src/ui/context/inSessionTokenRefresh.ts +23 -42
- package/src/ui/context/silentSessionRestore.ts +12 -26
- package/src/ui/hooks/useAuth.ts +4 -3
- package/src/ui/hooks/useOxyAuthSession.ts +13 -8
- package/src/ui/hooks/useSessionManagement.ts +16 -87
- package/src/ui/hooks/useSwitchableAccounts.ts +397 -0
- package/src/ui/hooks/useWebSSO.ts +13 -227
- package/src/ui/index.ts +0 -1
- package/src/ui/screens/OxyAuthScreen.tsx +2 -2
- package/src/ui/session/__tests__/createSessionClient.test.ts +41 -0
- package/src/ui/session/__tests__/projectSessionState.test.ts +114 -0
- package/src/ui/session/__tests__/sessionClientHost.test.ts +43 -0
- package/src/ui/session/__tests__/tokenTransport.test.ts +142 -0
- package/src/ui/session/createSessionClient.ts +21 -0
- package/src/ui/session/index.ts +19 -0
- package/src/ui/session/projectSessionState.ts +85 -0
- package/src/ui/session/sessionClientHost.ts +27 -0
- package/src/ui/session/tokenTransport.ts +76 -0
- package/src/ui/utils/activeAuthuser.ts +34 -76
- package/src/ui/utils/sessionHelpers.ts +0 -66
- package/src/utils/__tests__/deviceFlowSignIn.test.ts +243 -34
- package/src/utils/deviceFlowSignIn.ts +98 -21
- package/lib/commonjs/ui/components/accountMenuRows.js +0 -33
- package/lib/commonjs/ui/components/accountMenuRows.js.map +0 -1
- package/lib/commonjs/ui/hooks/useDeviceAccounts.js +0 -280
- package/lib/commonjs/ui/hooks/useDeviceAccounts.js.map +0 -1
- package/lib/commonjs/ui/hooks/useSessionSocket.js +0 -203
- package/lib/commonjs/ui/hooks/useSessionSocket.js.map +0 -1
- package/lib/commonjs/utils/silentGuardKey.js +0 -54
- package/lib/commonjs/utils/silentGuardKey.js.map +0 -1
- package/lib/module/ui/components/accountMenuRows.js +0 -29
- package/lib/module/ui/components/accountMenuRows.js.map +0 -1
- package/lib/module/ui/hooks/useDeviceAccounts.js +0 -276
- package/lib/module/ui/hooks/useDeviceAccounts.js.map +0 -1
- package/lib/module/ui/hooks/useSessionSocket.js +0 -199
- package/lib/module/ui/hooks/useSessionSocket.js.map +0 -1
- package/lib/module/utils/silentGuardKey.js +0 -49
- package/lib/module/utils/silentGuardKey.js.map +0 -1
- package/lib/typescript/commonjs/ui/components/accountMenuRows.d.ts +0 -34
- package/lib/typescript/commonjs/ui/components/accountMenuRows.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/hooks/useDeviceAccounts.d.ts +0 -133
- package/lib/typescript/commonjs/ui/hooks/useDeviceAccounts.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/hooks/useSessionSocket.d.ts +0 -14
- package/lib/typescript/commonjs/ui/hooks/useSessionSocket.d.ts.map +0 -1
- package/lib/typescript/commonjs/utils/silentGuardKey.d.ts +0 -31
- package/lib/typescript/commonjs/utils/silentGuardKey.d.ts.map +0 -1
- package/lib/typescript/module/ui/components/accountMenuRows.d.ts +0 -34
- package/lib/typescript/module/ui/components/accountMenuRows.d.ts.map +0 -1
- package/lib/typescript/module/ui/hooks/useDeviceAccounts.d.ts +0 -133
- package/lib/typescript/module/ui/hooks/useDeviceAccounts.d.ts.map +0 -1
- package/lib/typescript/module/ui/hooks/useSessionSocket.d.ts +0 -14
- package/lib/typescript/module/ui/hooks/useSessionSocket.d.ts.map +0 -1
- package/lib/typescript/module/utils/silentGuardKey.d.ts +0 -31
- package/lib/typescript/module/utils/silentGuardKey.d.ts.map +0 -1
- package/src/ui/components/accountMenuRows.ts +0 -48
- package/src/ui/hooks/useDeviceAccounts.ts +0 -344
- package/src/ui/hooks/useSessionSocket.ts +0 -233
- package/src/ui/utils/__tests__/activeAuthuser.test.ts +0 -75
- package/src/utils/__tests__/silentGuardKey.test.ts +0 -82
- package/src/utils/silentGuardKey.ts +0 -46
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.buildSwitchableAccounts = buildSwitchableAccounts;
|
|
7
|
+
exports.markCurrentAccount = markCurrentAccount;
|
|
8
|
+
exports.useSwitchableAccounts = useSwitchableAccounts;
|
|
9
|
+
var _react = require("react");
|
|
10
|
+
var _reactQuery = require("@tanstack/react-query");
|
|
11
|
+
var _core = require("@oxyhq/core");
|
|
12
|
+
var _OxyContext = require("../context/OxyContext.js");
|
|
13
|
+
var _useI18n = require("./useI18n.js");
|
|
14
|
+
var _queryKeys = require("./queries/queryKeys.js");
|
|
15
|
+
/**
|
|
16
|
+
* The per-account user shape carried by a {@link SwitchableAccount}. The SDK's
|
|
17
|
+
* canonical {@link User} document — either the freshest `useOxy().user` (the
|
|
18
|
+
* active row), a profile resolved via `oxyServices.getUsersByIds()` (every other
|
|
19
|
+
* device row), or the `account` document embedded in an account-graph node.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* One account the signed-in user can switch INTO, in the uniform switch model.
|
|
24
|
+
*
|
|
25
|
+
* A switchable account is either a device sign-in, an account-graph node (owned
|
|
26
|
+
* org / shared-with-you), or BOTH (an account that has been switched into
|
|
27
|
+
* becomes a device session while still being a graph node — the two are deduped
|
|
28
|
+
* into a single row). Every row carries a canonical `accountId` (the uniform
|
|
29
|
+
* switch key passed to `switchToAccount`); `sessionId` is present IFF the
|
|
30
|
+
* account is currently signed in on THIS device.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
/** The minimal device-session shape {@link buildSwitchableAccounts} reads. */
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Resolve which entries are the current account, robustly.
|
|
37
|
+
*
|
|
38
|
+
* Primary signal: `entry.sessionId === activeSessionId` — both are projected
|
|
39
|
+
* from the same `SessionClient` state, so this normally matches exactly.
|
|
40
|
+
* Fallbacks exist only to bridge the brief window between the two sequential
|
|
41
|
+
* `updateSessions` / `setActiveSessionId` calls in `OxyContext.syncFromClient`,
|
|
42
|
+
* applied only when the `sessionId` match found nothing AND the user is
|
|
43
|
+
* authenticated:
|
|
44
|
+
* 1. Match the live `user.id` against each entry's per-account user id.
|
|
45
|
+
* 2. If still nothing and there is exactly one account, mark that one current.
|
|
46
|
+
*
|
|
47
|
+
* At most ONE entry is ever marked current. Runs over DEVICE rows only (graph
|
|
48
|
+
* rows are never active — the active account is always a device session), so the
|
|
49
|
+
* single-account fallback counts device rows.
|
|
50
|
+
*
|
|
51
|
+
* Pure & side-effect free so it is unit-testable without rendering React.
|
|
52
|
+
*/
|
|
53
|
+
function markCurrentAccount(accounts, activeSessionId, liveUserId, isAuthenticated) {
|
|
54
|
+
const bySession = accounts.map(account => ({
|
|
55
|
+
...account,
|
|
56
|
+
isCurrent: Boolean(activeSessionId) && account.sessionId === activeSessionId
|
|
57
|
+
}));
|
|
58
|
+
if (bySession.some(account => account.isCurrent) || !isAuthenticated) {
|
|
59
|
+
return bySession;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// No row matched by session id: fall back to the live user's id, marking at
|
|
63
|
+
// most the FIRST matching entry current (never more than one).
|
|
64
|
+
if (liveUserId) {
|
|
65
|
+
let matched = false;
|
|
66
|
+
const byUser = bySession.map(account => {
|
|
67
|
+
if (!matched && account.user.id === liveUserId) {
|
|
68
|
+
matched = true;
|
|
69
|
+
return {
|
|
70
|
+
...account,
|
|
71
|
+
isCurrent: true
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
return account;
|
|
75
|
+
});
|
|
76
|
+
if (matched) {
|
|
77
|
+
return byUser;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Authenticated, nothing matched, but there is exactly one account → it must
|
|
82
|
+
// be the current one.
|
|
83
|
+
if (bySession.length === 1) {
|
|
84
|
+
return [{
|
|
85
|
+
...bySession[0],
|
|
86
|
+
isCurrent: true
|
|
87
|
+
}];
|
|
88
|
+
}
|
|
89
|
+
return bySession;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Pure union of device sign-ins and account-graph nodes into the flat
|
|
94
|
+
* {@link SwitchableAccount}[] the switchers render. Extracted so the merge /
|
|
95
|
+
* dedup semantics are unit-testable without rendering React.
|
|
96
|
+
*
|
|
97
|
+
* Order: device rows first (in session order, current flagged), then graph-only
|
|
98
|
+
* rows (in graph order). An account present as BOTH a device session and a graph
|
|
99
|
+
* node is deduped into ONE device row enriched with the graph metadata
|
|
100
|
+
* (relationship / kind / parent / membership).
|
|
101
|
+
*/
|
|
102
|
+
function buildSwitchableAccounts(input) {
|
|
103
|
+
const {
|
|
104
|
+
sessions,
|
|
105
|
+
activeSessionId,
|
|
106
|
+
liveUser,
|
|
107
|
+
isAuthenticated,
|
|
108
|
+
graph,
|
|
109
|
+
profilesById,
|
|
110
|
+
locale,
|
|
111
|
+
resolveAvatarUrl
|
|
112
|
+
} = input;
|
|
113
|
+
|
|
114
|
+
// Nothing is switchable when signed out — never surface a lingering device
|
|
115
|
+
// session or graph node once the user is unauthenticated.
|
|
116
|
+
if (!isAuthenticated) {
|
|
117
|
+
return [];
|
|
118
|
+
}
|
|
119
|
+
const toRow = (accountUser, opts) => {
|
|
120
|
+
const displayName = (0, _core.getAccountDisplayName)(accountUser, locale);
|
|
121
|
+
const handle = (0, _core.getAccountFallbackHandle)(accountUser);
|
|
122
|
+
const secondaryHandle = handle ? `@${handle}` : null;
|
|
123
|
+
return {
|
|
124
|
+
accountId: accountUser.id?.toString() ?? '',
|
|
125
|
+
sessionId: opts.sessionId,
|
|
126
|
+
authuser: opts.authuser,
|
|
127
|
+
isCurrent: Boolean(opts.sessionId) && opts.sessionId === activeSessionId,
|
|
128
|
+
onDevice: Boolean(opts.sessionId),
|
|
129
|
+
relationship: opts.relationship,
|
|
130
|
+
kind: opts.kind,
|
|
131
|
+
parentAccountId: opts.parentAccountId,
|
|
132
|
+
callerMembership: opts.callerMembership,
|
|
133
|
+
displayName,
|
|
134
|
+
// Real email, or the `@handle` fallback (NEVER synthesized).
|
|
135
|
+
email: accountUser.email ?? secondaryHandle,
|
|
136
|
+
avatarUrl: resolveAvatarUrl(accountUser.avatar),
|
|
137
|
+
color: accountUser.color ?? null,
|
|
138
|
+
user: accountUser
|
|
139
|
+
};
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
// --- Device rows ---
|
|
143
|
+
const built = sessions.flatMap(session => {
|
|
144
|
+
const isCurrent = session.sessionId === activeSessionId;
|
|
145
|
+
// The active row always uses the live `user` — freshest available —
|
|
146
|
+
// regardless of whether the batch profile fetch has resolved yet.
|
|
147
|
+
const accountUser = isCurrent && liveUser ? liveUser : session.userId ? profilesById.get(session.userId) : undefined;
|
|
148
|
+
if (!accountUser) {
|
|
149
|
+
return [];
|
|
150
|
+
}
|
|
151
|
+
return [toRow(accountUser, {
|
|
152
|
+
sessionId: session.sessionId,
|
|
153
|
+
authuser: session.authuser
|
|
154
|
+
})];
|
|
155
|
+
});
|
|
156
|
+
const flagged = markCurrentAccount(built, activeSessionId, liveUser?.id ?? null, isAuthenticated);
|
|
157
|
+
|
|
158
|
+
// The signed-in user must ALWAYS be represented, even before the device
|
|
159
|
+
// session set has synced (e.g. immediately after cold boot). Synthesize a
|
|
160
|
+
// single current row from the live `useOxy().user` in that case.
|
|
161
|
+
const deviceRows = flagged.length === 0 && isAuthenticated && liveUser && activeSessionId ? [toRow(liveUser, {
|
|
162
|
+
sessionId: activeSessionId
|
|
163
|
+
})] : flagged;
|
|
164
|
+
|
|
165
|
+
// --- Merge graph nodes, deduping by account id ---
|
|
166
|
+
const byAccountId = new Map();
|
|
167
|
+
const order = [];
|
|
168
|
+
const remember = row => {
|
|
169
|
+
if (!row.accountId || byAccountId.has(row.accountId)) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
byAccountId.set(row.accountId, row);
|
|
173
|
+
order.push(row.accountId);
|
|
174
|
+
};
|
|
175
|
+
for (const row of deviceRows) {
|
|
176
|
+
remember(row);
|
|
177
|
+
}
|
|
178
|
+
for (const node of graph) {
|
|
179
|
+
const existing = byAccountId.get(node.accountId);
|
|
180
|
+
if (existing) {
|
|
181
|
+
// On-device account that is ALSO in the graph: enrich the device row
|
|
182
|
+
// with graph metadata; keep its (freshest) profile + sessionId.
|
|
183
|
+
byAccountId.set(node.accountId, {
|
|
184
|
+
...existing,
|
|
185
|
+
relationship: node.relationship,
|
|
186
|
+
kind: node.kind,
|
|
187
|
+
parentAccountId: node.parentAccountId,
|
|
188
|
+
callerMembership: node.callerMembership
|
|
189
|
+
});
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
// Graph-only account (owned org / shared, not yet a device session).
|
|
193
|
+
remember(toRow(node.account, {
|
|
194
|
+
relationship: node.relationship,
|
|
195
|
+
kind: node.kind,
|
|
196
|
+
parentAccountId: node.parentAccountId,
|
|
197
|
+
callerMembership: node.callerMembership
|
|
198
|
+
}));
|
|
199
|
+
}
|
|
200
|
+
return order.flatMap(id => {
|
|
201
|
+
const row = byAccountId.get(id);
|
|
202
|
+
return row ? [row] : [];
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Resolve every account the signed-in user can switch into — device sign-ins
|
|
208
|
+
* AND linked graph accounts (owned orgs + shared-with-you) — as one flat list
|
|
209
|
+
* with real per-account name / email / avatar / color, deduped by account id.
|
|
210
|
+
*
|
|
211
|
+
* ## Data sources
|
|
212
|
+
*
|
|
213
|
+
* - Device sign-ins: `useOxy().sessions` — a `ClientSession[]` projected by
|
|
214
|
+
* `OxyContext.syncFromClient` from the server-authoritative `SessionClient`.
|
|
215
|
+
* Each session carries only `sessionId` + `userId`, so this hook additionally
|
|
216
|
+
* fetches every device account's profile via `oxyServices.getUsersByIds()`.
|
|
217
|
+
* The ACTIVE row always uses `useOxy().user` directly (the freshest copy).
|
|
218
|
+
* - Linked accounts: `useOxy().accounts` — the `AccountNode[]` graph the context
|
|
219
|
+
* loads from `GET /accounts`. Each node already embeds its `account` `User`
|
|
220
|
+
* document, so graph-only rows need no extra fetch.
|
|
221
|
+
*
|
|
222
|
+
* An account present as BOTH a device session and a graph node is deduped into
|
|
223
|
+
* ONE row (see {@link buildSwitchableAccounts}). EVERY row switches the same
|
|
224
|
+
* way — through `useOxy().switchToAccount(row.accountId)`.
|
|
225
|
+
*
|
|
226
|
+
* ## Error handling
|
|
227
|
+
*
|
|
228
|
+
* `getUsersByIds()` resolves to `[]` on a failed chunk (logged internally)
|
|
229
|
+
* rather than throwing. Device accounts whose profile could not be resolved are
|
|
230
|
+
* omitted until a subsequent fetch succeeds (except the active one, which never
|
|
231
|
+
* depends on this fetch); graph accounts are unaffected.
|
|
232
|
+
*/
|
|
233
|
+
function useSwitchableAccounts() {
|
|
234
|
+
const {
|
|
235
|
+
oxyServices,
|
|
236
|
+
sessions,
|
|
237
|
+
activeSessionId,
|
|
238
|
+
user,
|
|
239
|
+
isAuthenticated,
|
|
240
|
+
accounts: graph
|
|
241
|
+
} = (0, _OxyContext.useOxy)();
|
|
242
|
+
const {
|
|
243
|
+
locale
|
|
244
|
+
} = (0, _useI18n.useI18n)();
|
|
245
|
+
|
|
246
|
+
// Every distinct account id carried by the device's session set, sorted for
|
|
247
|
+
// a stable query key regardless of session ordering.
|
|
248
|
+
const accountIds = (0, _react.useMemo)(() => {
|
|
249
|
+
const ids = new Set();
|
|
250
|
+
for (const session of sessions ?? []) {
|
|
251
|
+
if (session.userId) {
|
|
252
|
+
ids.add(session.userId);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return Array.from(ids).sort();
|
|
256
|
+
}, [sessions]);
|
|
257
|
+
const profilesQuery = (0, _reactQuery.useQuery)({
|
|
258
|
+
queryKey: _queryKeys.queryKeys.users.list(accountIds),
|
|
259
|
+
queryFn: () => oxyServices.getUsersByIds(accountIds),
|
|
260
|
+
enabled: isAuthenticated && accountIds.length > 0,
|
|
261
|
+
staleTime: 5 * 60 * 1000,
|
|
262
|
+
// 5 minutes — matches useUserProfile's convention
|
|
263
|
+
gcTime: 30 * 60 * 1000 // 30 minutes
|
|
264
|
+
});
|
|
265
|
+
const profilesById = (0, _react.useMemo)(() => {
|
|
266
|
+
const map = new Map();
|
|
267
|
+
for (const profile of profilesQuery.data ?? []) {
|
|
268
|
+
map.set(profile.id, profile);
|
|
269
|
+
}
|
|
270
|
+
return map;
|
|
271
|
+
}, [profilesQuery.data]);
|
|
272
|
+
const accounts = (0, _react.useMemo)(() => buildSwitchableAccounts({
|
|
273
|
+
sessions: sessions ?? [],
|
|
274
|
+
activeSessionId: activeSessionId ?? null,
|
|
275
|
+
liveUser: user ?? null,
|
|
276
|
+
isAuthenticated,
|
|
277
|
+
graph: graph ?? [],
|
|
278
|
+
profilesById,
|
|
279
|
+
locale,
|
|
280
|
+
resolveAvatarUrl: avatar => avatar ? oxyServices.getFileDownloadUrl(avatar, 'thumb') : undefined
|
|
281
|
+
}), [sessions, activeSessionId, user, isAuthenticated, graph, profilesById, locale, oxyServices]);
|
|
282
|
+
return {
|
|
283
|
+
accounts,
|
|
284
|
+
isLoading: isAuthenticated && accountIds.length > 0 && profilesQuery.isLoading,
|
|
285
|
+
currentSessionId: activeSessionId ?? null
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=useSwitchableAccounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_react","require","_reactQuery","_core","_OxyContext","_useI18n","_queryKeys","markCurrentAccount","accounts","activeSessionId","liveUserId","isAuthenticated","bySession","map","account","isCurrent","Boolean","sessionId","some","matched","byUser","user","id","length","buildSwitchableAccounts","input","sessions","liveUser","graph","profilesById","locale","resolveAvatarUrl","toRow","accountUser","opts","displayName","getAccountDisplayName","handle","getAccountFallbackHandle","secondaryHandle","accountId","toString","authuser","onDevice","relationship","kind","parentAccountId","callerMembership","email","avatarUrl","avatar","color","built","flatMap","session","userId","get","undefined","flagged","deviceRows","byAccountId","Map","order","remember","row","has","set","push","node","existing","useSwitchableAccounts","oxyServices","useOxy","useI18n","accountIds","useMemo","ids","Set","add","Array","from","sort","profilesQuery","useQuery","queryKey","queryKeys","users","list","queryFn","getUsersByIds","enabled","staleTime","gcTime","profile","data","getFileDownloadUrl","isLoading","currentSessionId"],"sourceRoot":"../../../../src","sources":["ui/hooks/useSwitchableAccounts.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -4,204 +4,25 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.isWebBrowser = isWebBrowser;
|
|
7
|
-
exports.useWebSSO = useWebSSO;
|
|
8
|
-
var _react = require("react");
|
|
9
|
-
var _silentGuardKey = require("../../utils/silentGuardKey.js");
|
|
10
7
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* @see https://developer.mozilla.org/en-US/docs/Web/API/FedCM_API
|
|
8
|
+
* Platform detection helper for the web auth/session-sync surfaces.
|
|
9
|
+
*
|
|
10
|
+
* This module previously hosted a FedCM-based `useWebSSO` hook (Federated
|
|
11
|
+
* Credential Management — Chrome-only). It was removed: FedCM is no longer
|
|
12
|
+
* used anywhere in the client sign-in/cold-boot path (see `CrossDomainAuth`'s
|
|
13
|
+
* doc comment in `@oxyhq/core` for the production sign-in loop that motivated
|
|
14
|
+
* the removal). Cross-domain silent SSO is owned entirely by the
|
|
15
|
+
* `silent-iframe` cold-boot step (per-apex `/auth/silent`) plus the terminal
|
|
16
|
+
* `/sso` bounce in `OxyContext`.
|
|
17
|
+
*
|
|
18
|
+
* `isWebBrowser` is kept here (rather than moved) so every existing consumer
|
|
19
|
+
* import path stays valid.
|
|
25
20
|
*/
|
|
26
21
|
|
|
27
|
-
/**
|
|
28
|
-
* Module-level guard tracking which (origin + API) signatures have already
|
|
29
|
-
* had a silent SSO attempt this page load.
|
|
30
|
-
*
|
|
31
|
-
* A per-component `useRef` guard resets whenever the provider remounts (route
|
|
32
|
-
* churn, StrictMode double-invoke, error-boundary recovery), which previously
|
|
33
|
-
* allowed silent SSO to re-fire and — combined with a routing redirect loop —
|
|
34
|
-
* produced an accelerating `navigator.credentials.get` retry storm. Keying the
|
|
35
|
-
* guard on a stable signature instead of the component instance makes silent
|
|
36
|
-
* SSO fire EXACTLY ONCE per page load regardless of how many times the
|
|
37
|
-
* provider mounts. The set is intentionally never cleared: a fresh page load
|
|
38
|
-
* (the only thing that can change the answer) starts a fresh module scope.
|
|
39
|
-
*/
|
|
40
|
-
const silentSSOAttempted = new Set();
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Build a stable signature for the silent-SSO run-once guard. Two providers
|
|
44
|
-
* pointed at the same API from the same origin share one attempt.
|
|
45
|
-
*/
|
|
46
|
-
function ssoSignature(oxyServices) {
|
|
47
|
-
// Shared with `OxyContext.silentColdBootKey`. `buildSilentGuardKey` reads
|
|
48
|
-
// `window.location.origin` behind a guard that also verifies
|
|
49
|
-
// `window.location` exists — React Native aliases a global `window` with NO
|
|
50
|
-
// `window.location`, so a `typeof window`-only check would throw
|
|
51
|
-
// `Cannot read property 'origin' of undefined` off-browser.
|
|
52
|
-
return (0, _silentGuardKey.buildSilentGuardKey)(() => oxyServices.getBaseURL?.());
|
|
53
|
-
}
|
|
54
|
-
|
|
55
22
|
/**
|
|
56
23
|
* Check if we're running in a web browser environment (not React Native)
|
|
57
24
|
*/
|
|
58
25
|
function isWebBrowser() {
|
|
59
26
|
return typeof window !== 'undefined' && typeof document !== 'undefined' && typeof document.documentElement !== 'undefined';
|
|
60
27
|
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Check if we're on the identity provider domain (where FedCM would authenticate against itself)
|
|
64
|
-
* Compares against config.authWebUrl if set, otherwise defaults to auth.oxy.so
|
|
65
|
-
*/
|
|
66
|
-
function isIdentityProvider(authWebUrl) {
|
|
67
|
-
if (!isWebBrowser()) return false;
|
|
68
|
-
const hostname = window.location.hostname;
|
|
69
|
-
let idpHostname = 'auth.oxy.so';
|
|
70
|
-
if (authWebUrl) {
|
|
71
|
-
try {
|
|
72
|
-
idpHostname = new URL(authWebUrl).hostname;
|
|
73
|
-
} catch {/* malformed URL, use default */}
|
|
74
|
-
}
|
|
75
|
-
return hostname === idpHostname;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Hook for automatic cross-domain web SSO
|
|
80
|
-
*
|
|
81
|
-
* Uses FedCM (Federated Credential Management) - the modern browser-native
|
|
82
|
-
* identity federation API. This is the same technology that powers
|
|
83
|
-
* Google's cross-domain SSO (YouTube, Gmail, Maps, etc.).
|
|
84
|
-
*
|
|
85
|
-
* Key benefits:
|
|
86
|
-
* - Works across different TLDs (alia.onl ↔ mention.earth ↔ homiio.com)
|
|
87
|
-
* - No third-party cookies required
|
|
88
|
-
* - Privacy-preserving (browser mediates identity, IdP can't track)
|
|
89
|
-
* - Automatic silent sign-in after initial authentication
|
|
90
|
-
*
|
|
91
|
-
* For browsers without FedCM (Firefox, older browsers), automatic SSO
|
|
92
|
-
* is not possible. Users will see a sign-in button instead.
|
|
93
|
-
*/
|
|
94
|
-
function useWebSSO({
|
|
95
|
-
oxyServices,
|
|
96
|
-
onSessionFound,
|
|
97
|
-
onSSOUnavailable,
|
|
98
|
-
onError,
|
|
99
|
-
enabled = true
|
|
100
|
-
}) {
|
|
101
|
-
const isCheckingRef = (0, _react.useRef)(false);
|
|
102
|
-
const hasCheckedRef = (0, _react.useRef)(false);
|
|
103
|
-
|
|
104
|
-
// Check FedCM support once
|
|
105
|
-
const fedCMSupported = isWebBrowser() && oxyServices.isFedCMSupported?.();
|
|
106
|
-
const authWebUrl = oxyServices.config?.authWebUrl;
|
|
107
|
-
const checkSSO = (0, _react.useCallback)(async () => {
|
|
108
|
-
if (!isWebBrowser() || isCheckingRef.current) {
|
|
109
|
-
return null;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// Don't use FedCM on the auth domain itself - it would authenticate against itself
|
|
113
|
-
if (isIdentityProvider(authWebUrl)) {
|
|
114
|
-
onSSOUnavailable?.();
|
|
115
|
-
return null;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// FedCM is the only reliable cross-domain SSO mechanism
|
|
119
|
-
if (!fedCMSupported) {
|
|
120
|
-
onSSOUnavailable?.();
|
|
121
|
-
return null;
|
|
122
|
-
}
|
|
123
|
-
isCheckingRef.current = true;
|
|
124
|
-
try {
|
|
125
|
-
const session = await oxyServices.silentSignInWithFedCM?.();
|
|
126
|
-
if (session) {
|
|
127
|
-
await onSessionFound(session);
|
|
128
|
-
return session;
|
|
129
|
-
}
|
|
130
|
-
onSSOUnavailable?.();
|
|
131
|
-
return null;
|
|
132
|
-
} catch (error) {
|
|
133
|
-
onSSOUnavailable?.();
|
|
134
|
-
onError?.(error instanceof Error ? error : new Error(String(error)));
|
|
135
|
-
return null;
|
|
136
|
-
} finally {
|
|
137
|
-
isCheckingRef.current = false;
|
|
138
|
-
}
|
|
139
|
-
}, [oxyServices, onSessionFound, onSSOUnavailable, onError, fedCMSupported, authWebUrl]);
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Trigger interactive FedCM sign-in
|
|
143
|
-
* This shows the browser's native "Sign in with Oxy" prompt.
|
|
144
|
-
* Use this when silent mediation fails (user hasn't previously consented).
|
|
145
|
-
*/
|
|
146
|
-
const signInWithFedCM = (0, _react.useCallback)(async () => {
|
|
147
|
-
if (!isWebBrowser() || isCheckingRef.current) {
|
|
148
|
-
return null;
|
|
149
|
-
}
|
|
150
|
-
if (!fedCMSupported) {
|
|
151
|
-
onError?.(new Error('FedCM is not supported in this browser'));
|
|
152
|
-
return null;
|
|
153
|
-
}
|
|
154
|
-
isCheckingRef.current = true;
|
|
155
|
-
try {
|
|
156
|
-
const session = await oxyServices.signInWithFedCM?.();
|
|
157
|
-
if (session) {
|
|
158
|
-
await onSessionFound(session);
|
|
159
|
-
return session;
|
|
160
|
-
}
|
|
161
|
-
return null;
|
|
162
|
-
} catch (error) {
|
|
163
|
-
onError?.(error instanceof Error ? error : new Error(String(error)));
|
|
164
|
-
return null;
|
|
165
|
-
} finally {
|
|
166
|
-
isCheckingRef.current = false;
|
|
167
|
-
}
|
|
168
|
-
}, [oxyServices, onSessionFound, onError, fedCMSupported]);
|
|
169
|
-
|
|
170
|
-
// Auto-check SSO on mount (web only, FedCM only, not on auth domain).
|
|
171
|
-
//
|
|
172
|
-
// Run-once is enforced by TWO guards:
|
|
173
|
-
// 1. `hasCheckedRef` — cheap per-instance fast-path so effect re-runs
|
|
174
|
-
// (from changing deps) within one mount never re-fire.
|
|
175
|
-
// 2. `silentSSOAttempted` — module-level, survives remounts/StrictMode so
|
|
176
|
-
// silent SSO fires exactly once per page load even if the provider
|
|
177
|
-
// unmounts and remounts.
|
|
178
|
-
(0, _react.useEffect)(() => {
|
|
179
|
-
if (!enabled || !isWebBrowser() || hasCheckedRef.current || isIdentityProvider(authWebUrl)) {
|
|
180
|
-
if (isIdentityProvider(authWebUrl)) {
|
|
181
|
-
onSSOUnavailable?.();
|
|
182
|
-
}
|
|
183
|
-
return;
|
|
184
|
-
}
|
|
185
|
-
const signature = ssoSignature(oxyServices);
|
|
186
|
-
if (silentSSOAttempted.has(signature)) {
|
|
187
|
-
// Already attempted this page load (e.g. before a remount) — do not
|
|
188
|
-
// re-fire. Mark the local fast-path too so subsequent re-renders skip.
|
|
189
|
-
hasCheckedRef.current = true;
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
|
-
hasCheckedRef.current = true;
|
|
193
|
-
silentSSOAttempted.add(signature);
|
|
194
|
-
if (fedCMSupported) {
|
|
195
|
-
checkSSO();
|
|
196
|
-
} else {
|
|
197
|
-
onSSOUnavailable?.();
|
|
198
|
-
}
|
|
199
|
-
}, [enabled, checkSSO, fedCMSupported, onSSOUnavailable, oxyServices, authWebUrl]);
|
|
200
|
-
return {
|
|
201
|
-
checkSSO,
|
|
202
|
-
signInWithFedCM,
|
|
203
|
-
isChecking: isCheckingRef.current,
|
|
204
|
-
isFedCMSupported: fedCMSupported
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
28
|
//# sourceMappingURL=useWebSSO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["isWebBrowser","window","document","documentElement"],"sourceRoot":"../../../../src","sources":["ui/hooks/useWebSSO.ts"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACO,SAASA,YAAYA,CAAA,EAAY;EACtC,OAAO,OAAOC,MAAM,KAAK,WAAW,IAC7B,OAAOC,QAAQ,KAAK,WAAW,IAC/B,OAAOA,QAAQ,CAACC,eAAe,KAAK,WAAW;AACxD","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_OxyProvider","_interopRequireDefault","require","_OxySignInButton","_OxyAuthPrompt","_OxyLogo","_Avatar","_FollowButton","_OxyPayButton","_FontLoader","_OxyIcon","_AccountMenu","_AccountMenuButton","_ProfileButton","_ProfileMenu","_AccountSwitcher","_interopRequireWildcard","_OxyContext","_useAuth","_useFollow","_useStorage","_ProfileScreen","_ManageAccountScreen","_AccountSwitcherScreen","_CreateAccountScreen","_AccountMembersScreen","_AccountSettingsScreen","_authStore","_accountStore","_errorHandlers","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor"],"sourceRoot":"../../../src","sources":["ui/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"names":["_OxyProvider","_interopRequireDefault","require","_OxySignInButton","_OxyAuthPrompt","_OxyLogo","_Avatar","_FollowButton","_OxyPayButton","_FontLoader","_OxyIcon","_AccountMenu","_AccountMenuButton","_ProfileButton","_ProfileMenu","_AccountSwitcher","_interopRequireWildcard","_OxyContext","_useAuth","_useFollow","_useStorage","_ProfileScreen","_ManageAccountScreen","_AccountSwitcherScreen","_CreateAccountScreen","_AccountMembersScreen","_AccountSettingsScreen","_authStore","_accountStore","_errorHandlers","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor"],"sourceRoot":"../../../src","sources":["ui/index.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -44,7 +44,7 @@ const OxyAuthScreen = ({
|
|
|
44
44
|
const bloomTheme = (0, _theme.useTheme)();
|
|
45
45
|
const {
|
|
46
46
|
oxyServices,
|
|
47
|
-
|
|
47
|
+
handleWebSession,
|
|
48
48
|
clientId
|
|
49
49
|
} = (0, _OxyContext.useOxy)();
|
|
50
50
|
const {
|
|
@@ -56,7 +56,7 @@ const OxyAuthScreen = ({
|
|
|
56
56
|
openAuthApproval,
|
|
57
57
|
openSameDeviceApproval,
|
|
58
58
|
retry
|
|
59
|
-
} = (0, _useOxyAuthSession.useOxyAuthSession)(oxyServices, clientId,
|
|
59
|
+
} = (0, _useOxyAuthSession.useOxyAuthSession)(oxyServices, clientId, handleWebSession, {
|
|
60
60
|
onSignedIn: onAuthenticated
|
|
61
61
|
});
|
|
62
62
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_theme","_button","_loading","_typography","_iconCircle","Icons","_interopRequireWildcard","_OxyContext","_OxyLogo","_interopRequireDefault","_AnotherDeviceQR","_LoadingState","_useOxyAuthSession","_crossApex","_jsxRuntime","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","OxyAuthScreen","goBack","onAuthenticated","bloomTheme","useTheme","oxyServices","
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_theme","_button","_loading","_typography","_iconCircle","Icons","_interopRequireWildcard","_OxyContext","_OxyLogo","_interopRequireDefault","_AnotherDeviceQR","_LoadingState","_useOxyAuthSession","_crossApex","_jsxRuntime","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","OxyAuthScreen","goBack","onAuthenticated","bloomTheme","useTheme","oxyServices","handleWebSession","clientId","useOxy","qrData","qrPayload","isLoading","error","isWaiting","openAuthApproval","openSameDeviceApproval","retry","useOxyAuthSession","onSignedIn","crossApexWeb","isCrossApexWeb","jsx","View","className","children","size","color","colors","primary","message","jsxs","IconCircle","icon","Warning_Stroke2_Corner0_Rounded","Text","Button","variant","fullWidth","onPress","ArrowRotateClockwise_Stroke2_Corner0_Rounded","style","primaryForeground","H4","fillColor","text","Loading","Linking","openURL","OXY_ACCOUNTS_WEB_URL","accessibilityLabel","_default","exports"],"sourceRoot":"../../../../src","sources":["ui/screens/OxyAuthScreen.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createSessionClient = createSessionClient;
|
|
7
|
+
var _core = require("@oxyhq/core");
|
|
8
|
+
var _sessionClientHost = require("./sessionClientHost.js");
|
|
9
|
+
var _tokenTransport = require("./tokenTransport.js");
|
|
10
|
+
/**
|
|
11
|
+
* Wires a `SessionClient` for `@oxyhq/services`: builds the `SessionClientHost`
|
|
12
|
+
* adapter (Task 1) and the platform `TokenTransport` (Task 3) over the given
|
|
13
|
+
* `OxyServices` instance, and returns both the client and the host — the host
|
|
14
|
+
* is returned (not just the client) so `OxyContext` (Fase 3-B) can call
|
|
15
|
+
* `host.setCurrentAccountId(...)` as the active account changes.
|
|
16
|
+
*/
|
|
17
|
+
function createSessionClient(oxyServices) {
|
|
18
|
+
const host = (0, _sessionClientHost.createSessionClientHost)(oxyServices);
|
|
19
|
+
const transport = (0, _tokenTransport.createTokenTransport)(oxyServices);
|
|
20
|
+
const client = new _core.SessionClient(host, {
|
|
21
|
+
transport
|
|
22
|
+
});
|
|
23
|
+
return {
|
|
24
|
+
client,
|
|
25
|
+
host
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=createSessionClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_core","require","_sessionClientHost","_tokenTransport","createSessionClient","oxyServices","host","createSessionClientHost","transport","createTokenTransport","client","SessionClient"],"sourceRoot":"../../../../src","sources":["ui/session/createSessionClient.ts"],"mappings":";;;;;;AACA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,kBAAA,GAAAD,OAAA;AACA,IAAAE,eAAA,GAAAF,OAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASG,mBAAmBA,CAACC,WAAwB,EAG1D;EACA,MAAMC,IAAI,GAAG,IAAAC,0CAAuB,EAACF,WAAW,CAAC;EACjD,MAAMG,SAAS,GAAG,IAAAC,oCAAoB,EAACJ,WAAW,CAAC;EACnD,MAAMK,MAAM,GAAG,IAAIC,mBAAa,CAACL,IAAI,EAAE;IAAEE;EAAU,CAAC,CAAC;EACrD,OAAO;IAAEE,MAAM;IAAEJ;EAAK,CAAC;AACzB","ignoreList":[]}
|