@oxy.so/services 13.1.0 → 13.3.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/ui/client.js +13 -0
- package/lib/commonjs/ui/client.js.map +1 -1
- package/lib/commonjs/ui/context/OxyContext.js +17 -15
- package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
- package/lib/commonjs/ui/hooks/accountQueryPersistence.js +50 -15
- package/lib/commonjs/ui/hooks/accountQueryPersistence.js.map +1 -1
- package/lib/commonjs/ui/hooks/persistedQueryCache.js +10 -4
- package/lib/commonjs/ui/hooks/persistedQueryCache.js.map +1 -1
- package/lib/commonjs/ui/hooks/queryClient.js +9 -15
- package/lib/commonjs/ui/hooks/queryClient.js.map +1 -1
- package/lib/commonjs/ui/hooks/useAccountTheme.js +182 -0
- package/lib/commonjs/ui/hooks/useAccountTheme.js.map +1 -0
- package/lib/commonjs/ui/hooks/useFileDownloadUrl.js +64 -44
- package/lib/commonjs/ui/hooks/useFileDownloadUrl.js.map +1 -1
- package/lib/module/ui/client.js +1 -0
- package/lib/module/ui/client.js.map +1 -1
- package/lib/module/ui/context/OxyContext.js +17 -14
- package/lib/module/ui/context/OxyContext.js.map +1 -1
- package/lib/module/ui/hooks/accountQueryPersistence.js +50 -15
- package/lib/module/ui/hooks/accountQueryPersistence.js.map +1 -1
- package/lib/module/ui/hooks/persistedQueryCache.js +10 -4
- package/lib/module/ui/hooks/persistedQueryCache.js.map +1 -1
- package/lib/module/ui/hooks/queryClient.js +9 -15
- package/lib/module/ui/hooks/queryClient.js.map +1 -1
- package/lib/module/ui/hooks/useAccountTheme.js +178 -0
- package/lib/module/ui/hooks/useAccountTheme.js.map +1 -0
- package/lib/module/ui/hooks/useFileDownloadUrl.js +64 -44
- package/lib/module/ui/hooks/useFileDownloadUrl.js.map +1 -1
- package/lib/typescript/commonjs/index.d.ts +1 -1
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/client.d.ts +2 -0
- package/lib/typescript/commonjs/ui/client.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/accountQueryPersistence.d.ts +22 -4
- package/lib/typescript/commonjs/ui/hooks/accountQueryPersistence.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/persistedQueryCache.d.ts +5 -3
- package/lib/typescript/commonjs/ui/hooks/persistedQueryCache.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/queryClient.d.ts +5 -4
- package/lib/typescript/commonjs/ui/hooks/queryClient.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/useAccountTheme.d.ts +47 -0
- package/lib/typescript/commonjs/ui/hooks/useAccountTheme.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/hooks/useFileDownloadUrl.d.ts +10 -4
- package/lib/typescript/commonjs/ui/hooks/useFileDownloadUrl.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/icons/Ionicons.d.ts +1 -1
- package/lib/typescript/commonjs/ui/icons/MaterialCommunityIcons.d.ts +1 -1
- package/lib/typescript/commonjs/ui/index.d.ts +1 -1
- package/lib/typescript/commonjs/ui/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/types/navigation.d.ts +2 -0
- package/lib/typescript/commonjs/ui/types/navigation.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts +1 -1
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/ui/client.d.ts +2 -0
- package/lib/typescript/module/ui/client.d.ts.map +1 -1
- package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/accountQueryPersistence.d.ts +22 -4
- package/lib/typescript/module/ui/hooks/accountQueryPersistence.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/persistedQueryCache.d.ts +5 -3
- package/lib/typescript/module/ui/hooks/persistedQueryCache.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/queryClient.d.ts +5 -4
- package/lib/typescript/module/ui/hooks/queryClient.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/useAccountTheme.d.ts +47 -0
- package/lib/typescript/module/ui/hooks/useAccountTheme.d.ts.map +1 -0
- package/lib/typescript/module/ui/hooks/useFileDownloadUrl.d.ts +10 -4
- package/lib/typescript/module/ui/hooks/useFileDownloadUrl.d.ts.map +1 -1
- package/lib/typescript/module/ui/icons/Ionicons.d.ts +1 -1
- package/lib/typescript/module/ui/icons/MaterialCommunityIcons.d.ts +1 -1
- package/lib/typescript/module/ui/index.d.ts +1 -1
- package/lib/typescript/module/ui/index.d.ts.map +1 -1
- package/lib/typescript/module/ui/types/navigation.d.ts +2 -0
- package/lib/typescript/module/ui/types/navigation.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/index.ts +1 -1
- package/src/ui/client.ts +2 -0
- package/src/ui/context/OxyContext.tsx +27 -19
- package/src/ui/hooks/accountQueryPersistence.ts +61 -16
- package/src/ui/hooks/persistedQueryCache.ts +13 -5
- package/src/ui/hooks/queryClient.ts +12 -18
- package/src/ui/hooks/useAccountTheme.ts +177 -0
- package/src/ui/hooks/useFileDownloadUrl.ts +59 -49
- package/src/ui/index.ts +1 -1
- package/src/ui/types/navigation.ts +2 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactQuery","require","_buildId","PERSISTED_QUERY_PREFIXES","exports","SDK_MEMORY_ONLY_ROOTS","rootOf","query","head","queryKey","snapshot","queryClient","filters","blob","buster","getOxyBuildId","timestamp","Date","now","clientState","dehydrate","JSON","stringify","hydrateSnapshot","raw","maxAge","parse","sameBuild","hydrate","queries","mutations","subscribeSnapshots","throttleMs","write","timer","flush","clearTimeout","schedule","setTimeout","offQueries","getQueryCache","subscribe","offMutations","getMutationCache","unsubscribe"],"sourceRoot":"../../../../src","sources":["ui/hooks/persistedQueryCache.ts"],"mappings":";;;;;;;;;;AAeA,IAAAA,WAAA,GAAAC,OAAA;AAQA,IAAAC,QAAA,GAAAD,OAAA;AAvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAYA;AACO,MAAME,wBAA+C,GAAAC,OAAA,CAAAD,wBAAA,GAAG,CAC7D,UAAU,EACV,OAAO,EACP,UAAU,EACV,SAAS,EACT,SAAS,CACV;;AAED;AACA;AACA;AACA;AACO,MAAME,qBAA4C,GAAAD,OAAA,CAAAC,qBAAA,GAAG,CAC1D,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,0BAA0B,CAC3B;
|
|
1
|
+
{"version":3,"names":["_reactQuery","require","_buildId","PERSISTED_QUERY_PREFIXES","exports","SDK_MEMORY_ONLY_ROOTS","rootOf","query","head","queryKey","snapshot","queryClient","filters","blob","buster","getOxyBuildId","timestamp","Date","now","clientState","dehydrate","shouldDehydrateQuery","state","status","persistsQuery","shouldDehydrateMutation","JSON","stringify","hydrateSnapshot","raw","maxAge","parse","sameBuild","hydrate","queries","mutations","subscribeSnapshots","throttleMs","write","timer","flush","clearTimeout","schedule","setTimeout","offQueries","getQueryCache","subscribe","event","offMutations","getMutationCache","unsubscribe"],"sourceRoot":"../../../../src","sources":["ui/hooks/persistedQueryCache.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -50,15 +50,8 @@ function shouldRetryQuery(failureCount, error) {
|
|
|
50
50
|
return status === 408 || status === 425 || status === 429 || status >= 500;
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
/**
|
|
54
|
-
* Whether a query belongs in the account-agnostic cache: successful (a
|
|
55
|
-
* `pending`/`error` state is not worth keeping, and an error would leak
|
|
56
|
-
* failure objects across restarts) and under one of the SDK's own prefixes.
|
|
57
|
-
*/
|
|
53
|
+
/** Whether a query is under one of the SDK's own account-agnostic prefixes. */
|
|
58
54
|
function isSharedQuery(query) {
|
|
59
|
-
if (query.state.status !== 'success') {
|
|
60
|
-
return false;
|
|
61
|
-
}
|
|
62
55
|
const head = query.queryKey[0];
|
|
63
56
|
return typeof head === 'string' && _persistedQueryCache.PERSISTED_QUERY_PREFIXES.includes(head);
|
|
64
57
|
}
|
|
@@ -123,10 +116,11 @@ exports.createQueryClient = createQueryClient;
|
|
|
123
116
|
* Restore, then keep writing, the account-agnostic cache.
|
|
124
117
|
*
|
|
125
118
|
* Queries written by another build are dropped; queued mutations are kept
|
|
126
|
-
* (`persistedQueryCache.ts`). Whatever
|
|
127
|
-
*
|
|
128
|
-
* one of the SDK's prefixes, so
|
|
129
|
-
*
|
|
119
|
+
* (`persistedQueryCache.ts`). Whatever belongs to the account (`accountQueries`,
|
|
120
|
+
* or a query marked `meta: { persist: 'account' }`) is left to
|
|
121
|
+
* `createAccountQueryPersistence`, even under one of the SDK's prefixes, so
|
|
122
|
+
* private rows never land in the shared blob and a paused mutation cannot
|
|
123
|
+
* replay twice or under another account.
|
|
130
124
|
*
|
|
131
125
|
* Safe to no-op if `storage` is null/undefined (e.g. server-side render
|
|
132
126
|
* with no host storage).
|
|
@@ -138,12 +132,12 @@ const attachQueryPersistence = (queryClient, storage, accountQueries) => {
|
|
|
138
132
|
unsubscribe: () => {}
|
|
139
133
|
};
|
|
140
134
|
}
|
|
141
|
-
const account =
|
|
135
|
+
const account = (0, _accountQueryPersistence.accountQueryOwnership)(accountQueries);
|
|
142
136
|
const filters = {
|
|
143
|
-
|
|
137
|
+
persistsQuery: query => isSharedQuery(query) && !account.ownsQuery(query),
|
|
144
138
|
// Every other mutation, whatever its status: paused ones are exactly the
|
|
145
139
|
// ones that must survive a restart to replay when online.
|
|
146
|
-
shouldDehydrateMutation: mutation => !
|
|
140
|
+
shouldDehydrateMutation: mutation => !account.ownsMutation(mutation)
|
|
147
141
|
};
|
|
148
142
|
let stopped = false;
|
|
149
143
|
let writer = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactQuery","require","_core","_accountQueryPersistence","_persistedQueryCache","QUERY_CACHE_KEY","QUERY_CACHE_MAX_AGE","QUERY_PERSIST_THROTTLE_MS","MAX_QUERY_RETRIES","statusOf","error","value","status","response","shouldRetryQuery","failureCount","isSharedQuery","query","
|
|
1
|
+
{"version":3,"names":["_reactQuery","require","_core","_accountQueryPersistence","_persistedQueryCache","QUERY_CACHE_KEY","QUERY_CACHE_MAX_AGE","QUERY_PERSIST_THROTTLE_MS","MAX_QUERY_RETRIES","statusOf","error","value","status","response","shouldRetryQuery","failureCount","isSharedQuery","query","head","queryKey","PERSISTED_QUERY_PREFIXES","includes","createQueryClient","client","QueryClient","defaultOptions","queries","staleTime","gcTime","retry","retryDelay","attemptIndex","Math","min","refetchOnReconnect","refetchOnWindowFocus","networkMode","mutations","unsubscribe","onlineManager","subscribe","isOnline","getMutationCache","resumePausedMutations","Object","defineProperty","enumerable","configurable","writable","exports","attachQueryPersistence","queryClient","storage","accountQueries","restored","Promise","resolve","account","accountQueryOwnership","filters","persistsQuery","ownsQuery","shouldDehydrateMutation","mutation","ownsMutation","stopped","writer","raw","getItem","hydrateSnapshot","removeItem","catch","isDev","console","warn","then","subscribeSnapshots","serialized","setItem","undefined","clearQueryCache"],"sourceRoot":"../../../../src","sources":["ui/hooks/queryClient.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useAccountTheme = useAccountTheme;
|
|
7
|
+
exports.useAccountThemeControls = useAccountThemeControls;
|
|
8
|
+
var _react = require("react");
|
|
9
|
+
var _zustand = require("zustand");
|
|
10
|
+
var _core = require("@oxy.so/core");
|
|
11
|
+
var _theme = require("@oxy.so/bloom/theme");
|
|
12
|
+
var _storageHelpers = require("../utils/storageHelpers.js");
|
|
13
|
+
var _useAccountColor = require("./useAccountColor.js");
|
|
14
|
+
var _useAuth = require("./useAuth.js");
|
|
15
|
+
var _useAccountMutations = require("./mutations/useAccountMutations.js");
|
|
16
|
+
/**
|
|
17
|
+
* useAccountTheme / useAccountThemeControls
|
|
18
|
+
*
|
|
19
|
+
* The Oxy account carries a portable theme (`user.themePreference`: a mode and
|
|
20
|
+
* a colour preset) that every Oxy app can wear. The COLOUR is the account
|
|
21
|
+
* colour and always applies (`useAccountColor`). Whether an app also follows
|
|
22
|
+
* the account's MODE is the viewer's choice per device: the theme SOURCE.
|
|
23
|
+
*
|
|
24
|
+
* - `account` (the default): the account's mode is applied to Bloom, and a mode
|
|
25
|
+
* chosen here is written back to the account for the other Oxy apps.
|
|
26
|
+
* - `app`: the mode stays on this device; nothing is written to the account.
|
|
27
|
+
*
|
|
28
|
+
* The source is a local preference, never sent anywhere. On web it is read
|
|
29
|
+
* synchronously, so the first paint already knows it; on native it resolves
|
|
30
|
+
* from AsyncStorage right after mount. Bloom's own persistence still paints the
|
|
31
|
+
* last theme instantly on cold boot, so the account theme lands without a flash
|
|
32
|
+
* once the session resolves.
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
/** Where the app's theme MODE comes from on this device. */
|
|
36
|
+
|
|
37
|
+
const THEME_SOURCE_KEY = 'oxy.theme.source';
|
|
38
|
+
function normalizeSource(stored) {
|
|
39
|
+
return stored === 'app' ? 'app' : 'account';
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Bloom's richer mode set onto the portable subset the account stores
|
|
44
|
+
* (`adaptive` has no cross-app meaning, so it is `system`).
|
|
45
|
+
*/
|
|
46
|
+
function toPortableMode(mode) {
|
|
47
|
+
return mode === 'light' || mode === 'dark' ? mode : 'system';
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Web reads `localStorage` synchronously; native resolves in `hydrate`. */
|
|
51
|
+
function readInitialSource() {
|
|
52
|
+
if ((0, _storageHelpers.isReactNative)() || typeof window === 'undefined') {
|
|
53
|
+
return {
|
|
54
|
+
source: 'account',
|
|
55
|
+
hydrated: false
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
return {
|
|
60
|
+
source: normalizeSource(window.localStorage?.getItem(THEME_SOURCE_KEY)),
|
|
61
|
+
hydrated: true
|
|
62
|
+
};
|
|
63
|
+
} catch {
|
|
64
|
+
// A sandboxed document's storage getter throws: no stored choice.
|
|
65
|
+
return {
|
|
66
|
+
source: 'account',
|
|
67
|
+
hydrated: true
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const useThemeSourceStore = (0, _zustand.create)((set, get) => ({
|
|
72
|
+
...readInitialSource(),
|
|
73
|
+
setSource(source) {
|
|
74
|
+
set({
|
|
75
|
+
source,
|
|
76
|
+
hydrated: true
|
|
77
|
+
});
|
|
78
|
+
void (0, _storageHelpers.createPlatformStorage)().then(storage => storage.setItem(THEME_SOURCE_KEY, source)).catch(() => undefined);
|
|
79
|
+
},
|
|
80
|
+
async hydrate() {
|
|
81
|
+
if (get().hydrated) return;
|
|
82
|
+
const stored = await (0, _storageHelpers.createPlatformStorage)().then(storage => storage.getItem(THEME_SOURCE_KEY)).catch(() => null);
|
|
83
|
+
// A choice made while storage was being read wins over the stored one.
|
|
84
|
+
if (!get().hydrated) set({
|
|
85
|
+
source: normalizeSource(stored),
|
|
86
|
+
hydrated: true
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}));
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Apply the account theme to Bloom: the colour always (through
|
|
93
|
+
* `useAccountColor`, which `canUse` can narrow), the mode while this device's
|
|
94
|
+
* source is `account`. Mount ONCE, inside `OxyProvider` and Bloom's theme
|
|
95
|
+
* provider.
|
|
96
|
+
*/
|
|
97
|
+
function useAccountTheme({
|
|
98
|
+
canUse
|
|
99
|
+
} = {}) {
|
|
100
|
+
const {
|
|
101
|
+
isAuthenticated,
|
|
102
|
+
user
|
|
103
|
+
} = (0, _useAuth.useAuth)();
|
|
104
|
+
const source = useThemeSourceStore(state => state.source);
|
|
105
|
+
const hydrated = useThemeSourceStore(state => state.hydrated);
|
|
106
|
+
const hydrate = useThemeSourceStore(state => state.hydrate);
|
|
107
|
+
const {
|
|
108
|
+
setMode
|
|
109
|
+
} = (0, _theme.useBloomTheme)();
|
|
110
|
+
(0, _useAccountColor.useAccountColor)({
|
|
111
|
+
canUse
|
|
112
|
+
});
|
|
113
|
+
(0, _react.useEffect)(() => {
|
|
114
|
+
void hydrate();
|
|
115
|
+
}, [hydrate]);
|
|
116
|
+
const accountMode = user?.themePreference?.mode;
|
|
117
|
+
(0, _react.useEffect)(() => {
|
|
118
|
+
if (!hydrated || !isAuthenticated || source !== 'account' || !accountMode) return;
|
|
119
|
+
setMode(accountMode);
|
|
120
|
+
}, [hydrated, isAuthenticated, source, accountMode, setMode]);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Source-aware theme mode changes for a settings screen. Bloom changes at once;
|
|
124
|
+
* on the `account` source the account's portable theme follows. Without a
|
|
125
|
+
* usable session the effective source is `app`, so changes stay local, and the
|
|
126
|
+
* stored choice applies again once signed in. The colour is chosen with
|
|
127
|
+
* `useAccountColorSave`.
|
|
128
|
+
*/
|
|
129
|
+
function useAccountThemeControls() {
|
|
130
|
+
const {
|
|
131
|
+
user,
|
|
132
|
+
canUsePrivateApi
|
|
133
|
+
} = (0, _useAuth.useAuth)();
|
|
134
|
+
const {
|
|
135
|
+
mode,
|
|
136
|
+
colorPreset,
|
|
137
|
+
setMode
|
|
138
|
+
} = (0, _theme.useBloomTheme)();
|
|
139
|
+
const {
|
|
140
|
+
mutateAsync
|
|
141
|
+
} = (0, _useAccountMutations.useUpdateProfile)();
|
|
142
|
+
const storedSource = useThemeSourceStore(state => state.source);
|
|
143
|
+
const setSource = useThemeSourceStore(state => state.setSource);
|
|
144
|
+
const source = canUsePrivateApi ? storedSource : 'app';
|
|
145
|
+
const persist = (0, _react.useCallback)(async next => {
|
|
146
|
+
await mutateAsync({
|
|
147
|
+
themePreference: {
|
|
148
|
+
mode: toPortableMode(next.mode),
|
|
149
|
+
colorPreset: next.colorPreset
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}, [mutateAsync]);
|
|
153
|
+
const changeThemeMode = (0, _react.useCallback)(async nextMode => {
|
|
154
|
+
setMode(nextMode);
|
|
155
|
+
if (source === 'account') await persist({
|
|
156
|
+
mode: nextMode,
|
|
157
|
+
colorPreset
|
|
158
|
+
});
|
|
159
|
+
}, [setMode, source, persist, colorPreset]);
|
|
160
|
+
const accountTheme = user?.themePreference;
|
|
161
|
+
const hasAccountTheme = !!accountTheme && (0, _useAccountColor.resolveAccountColor)({
|
|
162
|
+
themePreference: accountTheme
|
|
163
|
+
}) !== null;
|
|
164
|
+
const changeThemeSource = (0, _react.useCallback)(nextSource => {
|
|
165
|
+
setSource(nextSource);
|
|
166
|
+
// An existing account theme is applied by `useAccountTheme`; only an
|
|
167
|
+
// account without one is seeded, from what the viewer sees now.
|
|
168
|
+
if (nextSource !== 'account' || !canUsePrivateApi || hasAccountTheme) return;
|
|
169
|
+
persist({
|
|
170
|
+
mode,
|
|
171
|
+
colorPreset
|
|
172
|
+
}).catch(error => {
|
|
173
|
+
_core.logger.error('Failed to seed the account theme', error);
|
|
174
|
+
});
|
|
175
|
+
}, [setSource, canUsePrivateApi, hasAccountTheme, persist, mode, colorPreset]);
|
|
176
|
+
return {
|
|
177
|
+
source,
|
|
178
|
+
changeThemeSource,
|
|
179
|
+
changeThemeMode
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=useAccountTheme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_react","require","_zustand","_core","_theme","_storageHelpers","_useAccountColor","_useAuth","_useAccountMutations","THEME_SOURCE_KEY","normalizeSource","stored","toPortableMode","mode","readInitialSource","isReactNative","window","source","hydrated","localStorage","getItem","useThemeSourceStore","create","set","get","setSource","createPlatformStorage","then","storage","setItem","catch","undefined","hydrate","useAccountTheme","canUse","isAuthenticated","user","useAuth","state","setMode","useBloomTheme","useAccountColor","useEffect","accountMode","themePreference","useAccountThemeControls","canUsePrivateApi","colorPreset","mutateAsync","useUpdateProfile","storedSource","persist","useCallback","next","changeThemeMode","nextMode","accountTheme","hasAccountTheme","resolveAccountColor","changeThemeSource","nextSource","error","logger"],"sourceRoot":"../../../../src","sources":["ui/hooks/useAccountTheme.ts"],"mappings":";;;;;;;AAmBA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,QAAA,GAAAD,OAAA;AACA,IAAAE,KAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AACA,IAAAI,eAAA,GAAAJ,OAAA;AACA,IAAAK,gBAAA,GAAAL,OAAA;AACA,IAAAM,QAAA,GAAAN,OAAA;AACA,IAAAO,oBAAA,GAAAP,OAAA;AA1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAWA;;AAKA,MAAMQ,gBAAgB,GAAG,kBAAkB;AAE3C,SAASC,eAAeA,CAACC,MAAiC,EAAe;EACvE,OAAOA,MAAM,KAAK,KAAK,GAAG,KAAK,GAAG,SAAS;AAC7C;;AAEA;AACA;AACA;AACA;AACA,SAASC,cAAcA,CAACC,IAAe,EAAqB;EAC1D,OAAOA,IAAI,KAAK,OAAO,IAAIA,IAAI,KAAK,MAAM,GAAGA,IAAI,GAAG,QAAQ;AAC9D;;AAEA;AACA,SAASC,iBAAiBA,CAAA,EAA+C;EACvE,IAAI,IAAAC,6BAAa,EAAC,CAAC,IAAI,OAAOC,MAAM,KAAK,WAAW,EAAE;IACpD,OAAO;MAAEC,MAAM,EAAE,SAAS;MAAEC,QAAQ,EAAE;IAAM,CAAC;EAC/C;EACA,IAAI;IACF,OAAO;MACLD,MAAM,EAAEP,eAAe,CAACM,MAAM,CAACG,YAAY,EAAEC,OAAO,CAACX,gBAAgB,CAAC,CAAC;MACvES,QAAQ,EAAE;IACZ,CAAC;EACH,CAAC,CAAC,MAAM;IACN;IACA,OAAO;MAAED,MAAM,EAAE,SAAS;MAAEC,QAAQ,EAAE;IAAK,CAAC;EAC9C;AACF;AAUA,MAAMG,mBAAmB,GAAG,IAAAC,eAAM,EAAmB,CAACC,GAAG,EAAEC,GAAG,MAAM;EAClE,GAAGV,iBAAiB,CAAC,CAAC;EACtBW,SAASA,CAACR,MAAM,EAAE;IAChBM,GAAG,CAAC;MAAEN,MAAM;MAAEC,QAAQ,EAAE;IAAK,CAAC,CAAC;IAC/B,KAAK,IAAAQ,qCAAqB,EAAC,CAAC,CACzBC,IAAI,CAAEC,OAAO,IAAKA,OAAO,CAACC,OAAO,CAACpB,gBAAgB,EAAEQ,MAAM,CAAC,CAAC,CAC5Da,KAAK,CAAC,MAAMC,SAAS,CAAC;EAC3B,CAAC;EACD,MAAMC,OAAOA,CAAA,EAAG;IACd,IAAIR,GAAG,CAAC,CAAC,CAACN,QAAQ,EAAE;IACpB,MAAMP,MAAM,GAAG,MAAM,IAAAe,qCAAqB,EAAC,CAAC,CACzCC,IAAI,CAAEC,OAAO,IAAKA,OAAO,CAACR,OAAO,CAACX,gBAAgB,CAAC,CAAC,CACpDqB,KAAK,CAAC,MAAM,IAAI,CAAC;IACpB;IACA,IAAI,CAACN,GAAG,CAAC,CAAC,CAACN,QAAQ,EAAEK,GAAG,CAAC;MAAEN,MAAM,EAAEP,eAAe,CAACC,MAAM,CAAC;MAAEO,QAAQ,EAAE;IAAK,CAAC,CAAC;EAC/E;AACF,CAAC,CAAC,CAAC;;AAEH;AACA;AACA;AACA;AACA;AACA;AACO,SAASe,eAAeA,CAAC;EAC9BC;AAGF,CAAC,GAAG,CAAC,CAAC,EAAQ;EACZ,MAAM;IAAEC,eAAe;IAAEC;EAAK,CAAC,GAAG,IAAAC,gBAAO,EAAC,CAAC;EAC3C,MAAMpB,MAAM,GAAGI,mBAAmB,CAAEiB,KAAK,IAAKA,KAAK,CAACrB,MAAM,CAAC;EAC3D,MAAMC,QAAQ,GAAGG,mBAAmB,CAAEiB,KAAK,IAAKA,KAAK,CAACpB,QAAQ,CAAC;EAC/D,MAAMc,OAAO,GAAGX,mBAAmB,CAAEiB,KAAK,IAAKA,KAAK,CAACN,OAAO,CAAC;EAC7D,MAAM;IAAEO;EAAQ,CAAC,GAAG,IAAAC,oBAAa,EAAC,CAAC;EACnC,IAAAC,gCAAe,EAAC;IAAEP;EAAO,CAAC,CAAC;EAE3B,IAAAQ,gBAAS,EAAC,MAAM;IACd,KAAKV,OAAO,CAAC,CAAC;EAChB,CAAC,EAAE,CAACA,OAAO,CAAC,CAAC;EAEb,MAAMW,WAAW,GAAGP,IAAI,EAAEQ,eAAe,EAAE/B,IAAI;EAC/C,IAAA6B,gBAAS,EAAC,MAAM;IACd,IAAI,CAACxB,QAAQ,IAAI,CAACiB,eAAe,IAAIlB,MAAM,KAAK,SAAS,IAAI,CAAC0B,WAAW,EAAE;IAC3EJ,OAAO,CAACI,WAAW,CAAC;EACtB,CAAC,EAAE,CAACzB,QAAQ,EAAEiB,eAAe,EAAElB,MAAM,EAAE0B,WAAW,EAAEJ,OAAO,CAAC,CAAC;AAC/D;AAWA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASM,uBAAuBA,CAAA,EAAyB;EAC9D,MAAM;IAAET,IAAI;IAAEU;EAAiB,CAAC,GAAG,IAAAT,gBAAO,EAAC,CAAC;EAC5C,MAAM;IAAExB,IAAI;IAAEkC,WAAW;IAAER;EAAQ,CAAC,GAAG,IAAAC,oBAAa,EAAC,CAAC;EACtD,MAAM;IAAEQ;EAAY,CAAC,GAAG,IAAAC,qCAAgB,EAAC,CAAC;EAC1C,MAAMC,YAAY,GAAG7B,mBAAmB,CAAEiB,KAAK,IAAKA,KAAK,CAACrB,MAAM,CAAC;EACjE,MAAMQ,SAAS,GAAGJ,mBAAmB,CAAEiB,KAAK,IAAKA,KAAK,CAACb,SAAS,CAAC;EACjE,MAAMR,MAAmB,GAAG6B,gBAAgB,GAAGI,YAAY,GAAG,KAAK;EAEnE,MAAMC,OAAO,GAAG,IAAAC,kBAAW,EACzB,MAAOC,IAAoD,IAAK;IAC9D,MAAML,WAAW,CAAC;MAChBJ,eAAe,EAAE;QAAE/B,IAAI,EAAED,cAAc,CAACyC,IAAI,CAACxC,IAAI,CAAC;QAAEkC,WAAW,EAAEM,IAAI,CAACN;MAAY;IACpF,CAAC,CAAC;EACJ,CAAC,EACD,CAACC,WAAW,CACd,CAAC;EAED,MAAMM,eAAe,GAAG,IAAAF,kBAAW,EACjC,MAAOG,QAAmB,IAAK;IAC7BhB,OAAO,CAACgB,QAAQ,CAAC;IACjB,IAAItC,MAAM,KAAK,SAAS,EAAE,MAAMkC,OAAO,CAAC;MAAEtC,IAAI,EAAE0C,QAAQ;MAAER;IAAY,CAAC,CAAC;EAC1E,CAAC,EACD,CAACR,OAAO,EAAEtB,MAAM,EAAEkC,OAAO,EAAEJ,WAAW,CACxC,CAAC;EAED,MAAMS,YAAY,GAAGpB,IAAI,EAAEQ,eAAe;EAC1C,MAAMa,eAAe,GACnB,CAAC,CAACD,YAAY,IAAI,IAAAE,oCAAmB,EAAC;IAAEd,eAAe,EAAEY;EAAa,CAAC,CAAC,KAAK,IAAI;EACnF,MAAMG,iBAAiB,GAAG,IAAAP,kBAAW,EAClCQ,UAAuB,IAAK;IAC3BnC,SAAS,CAACmC,UAAU,CAAC;IACrB;IACA;IACA,IAAIA,UAAU,KAAK,SAAS,IAAI,CAACd,gBAAgB,IAAIW,eAAe,EAAE;IACtEN,OAAO,CAAC;MAAEtC,IAAI;MAAEkC;IAAY,CAAC,CAAC,CAACjB,KAAK,CAAE+B,KAAc,IAAK;MACvDC,YAAM,CAACD,KAAK,CAAC,kCAAkC,EAAEA,KAAK,CAAC;IACzD,CAAC,CAAC;EACJ,CAAC,EACD,CAACpC,SAAS,EAAEqB,gBAAgB,EAAEW,eAAe,EAAEN,OAAO,EAAEtC,IAAI,EAAEkC,WAAW,CAC3E,CAAC;EAED,OAAO;IAAE9B,MAAM;IAAE0C,iBAAiB;IAAEL;EAAgB,CAAC;AACvD","ignoreList":[]}
|
|
@@ -5,63 +5,83 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.useFileDownloadUrl = void 0;
|
|
7
7
|
var _react = require("react");
|
|
8
|
+
var _oxyRuntimeContext = require("../context/oxyRuntimeContext.js");
|
|
9
|
+
function isAbsoluteUrl(ref) {
|
|
10
|
+
return ref.startsWith('http://') || ref.startsWith('https://');
|
|
11
|
+
}
|
|
12
|
+
|
|
8
13
|
/**
|
|
9
|
-
*
|
|
14
|
+
* Resolve a file's download URL for the current caller.
|
|
15
|
+
*
|
|
16
|
+
* A URL `assets.url` already resolved is answered in the FIRST render from
|
|
17
|
+
* core's identity-scoped cache (`assets.cachedUrl`): no request, no loading
|
|
18
|
+
* frame. Only a miss resolves asynchronously, through `assets.url`, which
|
|
19
|
+
* returns a scoped media-token stream URL for a private asset. There is no
|
|
20
|
+
* public-CDN fallback: `assets.publicUrl` 404s for private uploads. A
|
|
21
|
+
* reference that is already an absolute `http(s)` URL is returned unchanged.
|
|
10
22
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* `getFileDownloadUrl` is public-CDN-only and 404s for private uploads.
|
|
23
|
+
* For a synchronous, render-only answer (an image resolver, a list row) use
|
|
24
|
+
* `oxyServices.assets.renderUrl`, which reads the same cache.
|
|
14
25
|
*/
|
|
15
26
|
const useFileDownloadUrl = (oxyServices, fileId, options) => {
|
|
16
|
-
const [url, setUrl] = (0, _react.useState)(null);
|
|
17
|
-
const [loading, setLoading] = (0, _react.useState)(false);
|
|
18
|
-
const [error, setError] = (0, _react.useState)(null);
|
|
19
27
|
const variant = options?.variant;
|
|
20
28
|
const expiresIn = options?.expiresIn;
|
|
29
|
+
// A resolved URL can carry the viewer's scoped media token, so the viewer is
|
|
30
|
+
// part of what was asked: an account switch never shows the previous one's.
|
|
31
|
+
const viewerId = (0, _oxyRuntimeContext.useOptionalOxy)()?.user?.id ?? '';
|
|
32
|
+
const request = fileId ? `${viewerId}|${fileId}|${variant ?? ''}|${expiresIn ?? ''}` : null;
|
|
33
|
+
const immediate = !fileId ? null : isAbsoluteUrl(fileId) ? fileId : oxyServices?.assets.cachedUrl(fileId, variant, expiresIn) ?? null;
|
|
34
|
+
const needsResolve = !!fileId && !!oxyServices && immediate === null;
|
|
35
|
+
const [settled, setSettled] = (0, _react.useState)(null);
|
|
21
36
|
(0, _react.useEffect)(() => {
|
|
22
|
-
if (!fileId)
|
|
23
|
-
setUrl(null);
|
|
24
|
-
setLoading(false);
|
|
25
|
-
setError(null);
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
if (!oxyServices) {
|
|
29
|
-
setUrl(null);
|
|
30
|
-
setLoading(false);
|
|
31
|
-
setError(new Error('OxyServices instance not configured for useFileDownloadUrl'));
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
37
|
+
if (!needsResolve || !fileId || !oxyServices || !request) return;
|
|
34
38
|
let cancelled = false;
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
setError(err instanceof Error ? err : new Error(String(err)));
|
|
49
|
-
}
|
|
50
|
-
} finally {
|
|
51
|
-
if (!cancelled) {
|
|
52
|
-
setLoading(false);
|
|
53
|
-
}
|
|
39
|
+
oxyServices.assets.url(fileId, variant, expiresIn).then(url => {
|
|
40
|
+
if (!cancelled) setSettled({
|
|
41
|
+
request,
|
|
42
|
+
url: url || null,
|
|
43
|
+
error: null
|
|
44
|
+
});
|
|
45
|
+
}, err => {
|
|
46
|
+
if (!cancelled) {
|
|
47
|
+
setSettled({
|
|
48
|
+
request,
|
|
49
|
+
url: null,
|
|
50
|
+
error: err instanceof Error ? err : new Error(String(err))
|
|
51
|
+
});
|
|
54
52
|
}
|
|
55
|
-
};
|
|
56
|
-
load();
|
|
53
|
+
});
|
|
57
54
|
return () => {
|
|
58
55
|
cancelled = true;
|
|
59
56
|
};
|
|
60
|
-
}, [fileId, oxyServices, variant, expiresIn]);
|
|
57
|
+
}, [needsResolve, fileId, oxyServices, variant, expiresIn, request]);
|
|
58
|
+
if (!fileId) return {
|
|
59
|
+
url: null,
|
|
60
|
+
loading: false,
|
|
61
|
+
error: null
|
|
62
|
+
};
|
|
63
|
+
if (immediate !== null) return {
|
|
64
|
+
url: immediate,
|
|
65
|
+
loading: false,
|
|
66
|
+
error: null
|
|
67
|
+
};
|
|
68
|
+
if (!oxyServices) {
|
|
69
|
+
return {
|
|
70
|
+
url: null,
|
|
71
|
+
loading: false,
|
|
72
|
+
error: new Error('OxyServices instance not configured for useFileDownloadUrl')
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
// A result settled for another file, variant or expiry is never shown.
|
|
76
|
+
if (settled?.request !== request) return {
|
|
77
|
+
url: null,
|
|
78
|
+
loading: true,
|
|
79
|
+
error: null
|
|
80
|
+
};
|
|
61
81
|
return {
|
|
62
|
-
url,
|
|
63
|
-
loading,
|
|
64
|
-
error
|
|
82
|
+
url: settled.url,
|
|
83
|
+
loading: false,
|
|
84
|
+
error: settled.error
|
|
65
85
|
};
|
|
66
86
|
};
|
|
67
87
|
exports.useFileDownloadUrl = useFileDownloadUrl;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","require","useFileDownloadUrl","oxyServices","fileId","options","
|
|
1
|
+
{"version":3,"names":["_react","require","_oxyRuntimeContext","isAbsoluteUrl","ref","startsWith","useFileDownloadUrl","oxyServices","fileId","options","variant","expiresIn","viewerId","useOptionalOxy","user","id","request","immediate","assets","cachedUrl","needsResolve","settled","setSettled","useState","useEffect","cancelled","url","then","error","err","Error","String","loading","exports"],"sourceRoot":"../../../../src","sources":["ui/hooks/useFileDownloadUrl.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/module/ui/client.js
CHANGED
|
@@ -38,6 +38,7 @@ export { useOxy, useOptionalOxy, OxyProviderMissingError } from "./context/OxyCo
|
|
|
38
38
|
// Hooks
|
|
39
39
|
export { useAuth } from "./hooks/useAuth.js";
|
|
40
40
|
export { useAccountColor, useAccountColorSave, resolveAccountColor, entitledAccountColors } from "./hooks/useAccountColor.js";
|
|
41
|
+
export { useAccountTheme, useAccountThemeControls } from "./hooks/useAccountTheme.js";
|
|
41
42
|
// This app's Oxy-signed assertion of which app it is (ADR 0045), for an SDK
|
|
42
43
|
// that attaches it to its own requests without pulling in the account screens.
|
|
43
44
|
export { useAppAssertion, AppAssertionProviderMissingError } from "./appAssertion/AppAssertionContext.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["default","OxyProvider","OxySignInButton","OxyAuthPrompt","LogoIcon","LogoText","FollowButton","FollowTargetButton","useFollowErrorMessage","ProfileButton","PeableButton","OxyPayButton","useOxy","useOptionalOxy","OxyProviderMissingError","useAuth","useAccountColor","useAccountColorSave","resolveAccountColor","entitledAccountColors","useAppAssertion","AppAssertionProviderMissingError","createDeferredProductAnalytics","useFollow","useFollowerCounts","useSeedFollowStatuses","useFollowTarget","useSupervision","supervisionQueryKeys","useUserProfile","useUserProfiles","useCurrentUser","useUserById","useUserByUsername","useStorage","useOxyEvent","useUpdateProfile","useUploadAvatar","useUploadFile","useFileDownloadUrl","useMutationStatus","useOnlineStatus","useDisplayCurrency","useDisplayPrice","DisplayCurrencySelector","buildFollowMenuItems","resolveFollowPrimaryAction","FOLLOW_ACTION_LEAVES_ACTIVE","queryKeys","invalidateAccountQueries","invalidateUserQueries","invalidateSessionQueries","invalidateDeviceQueries","invalidatePrivacyQueries","invalidateSecurityQueries","invalidateStorageQueries","invalidatePaymentsQueries","invalidateConnectedAppsQueries","invalidateAuthMethodsQueries","upsertCachedUser","upsertCachedUsers","CLEARABLE_USER_FIELDS","clearedFieldsFromProfileUpdate","clearedFieldsFromAccountUpdate","useAuthStore","handleAuthError","isInvalidSessionError","isTimeoutOrNetworkError","extractErrorMessage"],"sourceRoot":"../../../src","sources":["ui/client.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO,wBAAqB;;AAE5B;AACA,SAASA,OAAO,IAAIC,WAAW,QAAQ,6BAA0B;AACjE,SAASD,OAAO,IAAIE,eAAe,QAAQ,iCAA8B;AACzE,SAASF,OAAO,IAAIG,aAAa,QAAQ,+BAA4B;AAErE,SAASC,QAAQ,QAAQ,+BAA4B;AACrD,SAASC,QAAQ,QAAQ,+BAA4B;AACrD,SAASL,OAAO,IAAIM,YAAY,QAAQ,8BAA2B;AAMnE,SAASC,kBAAkB,QAAQ,oCAAiC;AAGpE,SAASC,qBAAqB,QAAQ,8BAA2B;AAEjE,SAASR,OAAO,IAAIS,aAAa,QAAQ,+BAA4B;AAErE,SAAST,OAAO,IAAIU,YAAY,QAAQ,8BAA2B;AAEnE;AACA,SAASV,OAAO,IAAIW,YAAY,QAAQ,8BAA2B;AACnE;;AAGA;AACA,SAASC,MAAM,EAAEC,cAAc,EAAEC,uBAAuB,QAAQ,yBAAsB;;AAEtF;AACA,SAASC,OAAO,QAAQ,oBAAiB;AACzC,SACEC,eAAe,EACfC,mBAAmB,EACnBC,mBAAmB,EACnBC,qBAAqB,QAChB,4BAAyB;AAChC;AACA;AACA,SACEC,eAAe,EACfC,gCAAgC,QAC3B,uCAAoC;AAI3C,SAASC,8BAA8B,QAAQ,iCAA8B;AAE7E,SAASC,SAAS,EAAEC,iBAAiB,EAAEC,qBAAqB,QAAQ,sBAAmB;AACvF,SAASC,eAAe,QAAQ,4BAAyB;AACzD,SAASC,cAAc,EAAEC,oBAAoB,QAAQ,mCAAgC;AAErF,SACEC,cAAc,EACdC,eAAe,EACfC,cAAc,EACdC,WAAW,EACXC,iBAAiB,QACZ,sCAAmC;AAC1C,SAASC,UAAU,QAAQ,uBAAoB;AAC/C;AACA;AACA,SAASC,WAAW,QAAQ,wBAAqB;AACjD;AACA;AACA;AACA;AACA,SACEC,gBAAgB,EAChBC,eAAe,EACfC,aAAa,QACR,0CAAuC;AAC9C,SAASC,kBAAkB,QAAQ,+BAA4B;AAC/D,SAASC,iBAAiB,QAAQ,8BAA2B;AAE7D,SAASC,eAAe,QAAQ,4BAAyB;AACzD,SAASC,kBAAkB,QAAQ,+BAA4B;AAC/D,SAASC,eAAe,QAAQ,4BAAyB;AACzD,SAASC,uBAAuB,QAAQ,yCAAsC;AAG9E;AACA;;AAEA;AACA,SACEC,oBAAoB,EACpBC,0BAA0B,EAC1BC,2BAA2B,QACtB,6BAA0B;AAGjC;AACA,SACEC,SAAS,EACTC,wBAAwB,EACxBC,qBAAqB,EACrBC,wBAAwB,EACxBC,uBAAuB,EACvBC,wBAAwB,EACxBC,yBAAyB,EACzBC,wBAAwB,EACxBC,yBAAyB,EACzBC,8BAA8B,EAC9BC,4BAA4B,QACvB,8BAA2B;AAClC,SACEC,gBAAgB,EAChBC,iBAAiB,EACjBC,qBAAqB,EACrBC,8BAA8B,EAC9BC,8BAA8B,QACzB,8BAA2B;AAOlC;AACA,SAASC,YAAY,QAAQ,uBAAoB;;AAEjD;AACA,SACEC,eAAe,EACfC,qBAAqB,EACrBC,uBAAuB,EACvBC,mBAAmB,QACd,0BAAuB","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["default","OxyProvider","OxySignInButton","OxyAuthPrompt","LogoIcon","LogoText","FollowButton","FollowTargetButton","useFollowErrorMessage","ProfileButton","PeableButton","OxyPayButton","useOxy","useOptionalOxy","OxyProviderMissingError","useAuth","useAccountColor","useAccountColorSave","resolveAccountColor","entitledAccountColors","useAccountTheme","useAccountThemeControls","useAppAssertion","AppAssertionProviderMissingError","createDeferredProductAnalytics","useFollow","useFollowerCounts","useSeedFollowStatuses","useFollowTarget","useSupervision","supervisionQueryKeys","useUserProfile","useUserProfiles","useCurrentUser","useUserById","useUserByUsername","useStorage","useOxyEvent","useUpdateProfile","useUploadAvatar","useUploadFile","useFileDownloadUrl","useMutationStatus","useOnlineStatus","useDisplayCurrency","useDisplayPrice","DisplayCurrencySelector","buildFollowMenuItems","resolveFollowPrimaryAction","FOLLOW_ACTION_LEAVES_ACTIVE","queryKeys","invalidateAccountQueries","invalidateUserQueries","invalidateSessionQueries","invalidateDeviceQueries","invalidatePrivacyQueries","invalidateSecurityQueries","invalidateStorageQueries","invalidatePaymentsQueries","invalidateConnectedAppsQueries","invalidateAuthMethodsQueries","upsertCachedUser","upsertCachedUsers","CLEARABLE_USER_FIELDS","clearedFieldsFromProfileUpdate","clearedFieldsFromAccountUpdate","useAuthStore","handleAuthError","isInvalidSessionError","isTimeoutOrNetworkError","extractErrorMessage"],"sourceRoot":"../../../src","sources":["ui/client.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO,wBAAqB;;AAE5B;AACA,SAASA,OAAO,IAAIC,WAAW,QAAQ,6BAA0B;AACjE,SAASD,OAAO,IAAIE,eAAe,QAAQ,iCAA8B;AACzE,SAASF,OAAO,IAAIG,aAAa,QAAQ,+BAA4B;AAErE,SAASC,QAAQ,QAAQ,+BAA4B;AACrD,SAASC,QAAQ,QAAQ,+BAA4B;AACrD,SAASL,OAAO,IAAIM,YAAY,QAAQ,8BAA2B;AAMnE,SAASC,kBAAkB,QAAQ,oCAAiC;AAGpE,SAASC,qBAAqB,QAAQ,8BAA2B;AAEjE,SAASR,OAAO,IAAIS,aAAa,QAAQ,+BAA4B;AAErE,SAAST,OAAO,IAAIU,YAAY,QAAQ,8BAA2B;AAEnE;AACA,SAASV,OAAO,IAAIW,YAAY,QAAQ,8BAA2B;AACnE;;AAGA;AACA,SAASC,MAAM,EAAEC,cAAc,EAAEC,uBAAuB,QAAQ,yBAAsB;;AAEtF;AACA,SAASC,OAAO,QAAQ,oBAAiB;AACzC,SACEC,eAAe,EACfC,mBAAmB,EACnBC,mBAAmB,EACnBC,qBAAqB,QAChB,4BAAyB;AAChC,SAASC,eAAe,EAAEC,uBAAuB,QAAQ,4BAAyB;AAElF;AACA;AACA,SACEC,eAAe,EACfC,gCAAgC,QAC3B,uCAAoC;AAI3C,SAASC,8BAA8B,QAAQ,iCAA8B;AAE7E,SAASC,SAAS,EAAEC,iBAAiB,EAAEC,qBAAqB,QAAQ,sBAAmB;AACvF,SAASC,eAAe,QAAQ,4BAAyB;AACzD,SAASC,cAAc,EAAEC,oBAAoB,QAAQ,mCAAgC;AAErF,SACEC,cAAc,EACdC,eAAe,EACfC,cAAc,EACdC,WAAW,EACXC,iBAAiB,QACZ,sCAAmC;AAC1C,SAASC,UAAU,QAAQ,uBAAoB;AAC/C;AACA;AACA,SAASC,WAAW,QAAQ,wBAAqB;AACjD;AACA;AACA;AACA;AACA,SACEC,gBAAgB,EAChBC,eAAe,EACfC,aAAa,QACR,0CAAuC;AAC9C,SAASC,kBAAkB,QAAQ,+BAA4B;AAC/D,SAASC,iBAAiB,QAAQ,8BAA2B;AAE7D,SAASC,eAAe,QAAQ,4BAAyB;AACzD,SAASC,kBAAkB,QAAQ,+BAA4B;AAC/D,SAASC,eAAe,QAAQ,4BAAyB;AACzD,SAASC,uBAAuB,QAAQ,yCAAsC;AAG9E;AACA;;AAEA;AACA,SACEC,oBAAoB,EACpBC,0BAA0B,EAC1BC,2BAA2B,QACtB,6BAA0B;AAGjC;AACA,SACEC,SAAS,EACTC,wBAAwB,EACxBC,qBAAqB,EACrBC,wBAAwB,EACxBC,uBAAuB,EACvBC,wBAAwB,EACxBC,yBAAyB,EACzBC,wBAAwB,EACxBC,yBAAyB,EACzBC,8BAA8B,EAC9BC,4BAA4B,QACvB,8BAA2B;AAClC,SACEC,gBAAgB,EAChBC,iBAAiB,EACjBC,qBAAqB,EACrBC,8BAA8B,EAC9BC,8BAA8B,QACzB,8BAA2B;AAOlC;AACA,SAASC,YAAY,QAAQ,uBAAoB;;AAEjD;AACA,SACEC,eAAe,EACfC,qBAAqB,EACrBC,uBAAuB,EACvBC,mBAAmB,QACd,0BAAuB","ignoreList":[]}
|
|
@@ -48,7 +48,6 @@ import { AppAssertionProvider } from "../appAssertion/AppAssertionContext.js";
|
|
|
48
48
|
import { OxyRuntimeContext, OxyAuthActionsContext } from "./oxyRuntimeContext.js";
|
|
49
49
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
50
50
|
export { useOxyAuthActions, useOxy, useOptionalOxy, OxyProviderMissingError } from "./oxyRuntimeContext.js";
|
|
51
|
-
const subscribeNever = () => () => undefined;
|
|
52
51
|
|
|
53
52
|
/**
|
|
54
53
|
* The SDK's internal runtime provider — the session/account state machine that
|
|
@@ -245,19 +244,20 @@ export const OxyRuntimeProvider = ({
|
|
|
245
244
|
// a persistence write is never dropped because it raced storage init.
|
|
246
245
|
const queryClient = useQueryClient();
|
|
247
246
|
|
|
248
|
-
// The
|
|
249
|
-
//
|
|
250
|
-
//
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
247
|
+
// The account's offline cache: the app's `accountQueries` roots and every
|
|
248
|
+
// query marked `meta: { persist: 'account' }`. Built once, like the runtime.
|
|
249
|
+
// `handleSubjectChange` activates it BEFORE anyone is woken, so a consumer of
|
|
250
|
+
// the new account never reads the previous account's rows.
|
|
251
|
+
const accountQueryPersistenceRef = useRef(null);
|
|
252
|
+
if (accountQueryPersistenceRef.current === null) {
|
|
253
|
+
accountQueryPersistenceRef.current = createAccountQueryPersistence(queryClient, accountQueries);
|
|
254
254
|
}
|
|
255
255
|
const accountQueryPersistence = accountQueryPersistenceRef.current;
|
|
256
256
|
useEffect(() => {
|
|
257
|
-
accountQueryPersistence
|
|
258
|
-
return () => accountQueryPersistence
|
|
257
|
+
accountQueryPersistence.attach();
|
|
258
|
+
return () => accountQueryPersistence.detach();
|
|
259
259
|
}, [accountQueryPersistence]);
|
|
260
|
-
const isAccountCacheReady = useSyncExternalStore(accountQueryPersistence
|
|
260
|
+
const isAccountCacheReady = useSyncExternalStore(accountQueryPersistence.subscribe, accountQueryPersistence.isReady, accountQueryPersistence.isReady);
|
|
261
261
|
const storageRef = useRef(null);
|
|
262
262
|
const [storage, setStorage] = useState(null);
|
|
263
263
|
const buildStorageDeferred = () => {
|
|
@@ -293,7 +293,7 @@ export const OxyRuntimeProvider = ({
|
|
|
293
293
|
storagePromise.then(storageInstance => {
|
|
294
294
|
storageRef.current = storageInstance;
|
|
295
295
|
storageReady.resolve(storageInstance);
|
|
296
|
-
accountQueryPersistence
|
|
296
|
+
accountQueryPersistence.setStorage(storageInstance);
|
|
297
297
|
if (mounted) {
|
|
298
298
|
setStorage(storageInstance);
|
|
299
299
|
runtime.setStorageReady(true);
|
|
@@ -301,7 +301,7 @@ export const OxyRuntimeProvider = ({
|
|
|
301
301
|
}).catch(err => {
|
|
302
302
|
// Nothing persisted can be restored; the account cache still has to
|
|
303
303
|
// become ready, or RequireOxyAuth would wait forever.
|
|
304
|
-
accountQueryPersistence
|
|
304
|
+
accountQueryPersistence.setStorage(createMemoryStorage());
|
|
305
305
|
if (mounted) {
|
|
306
306
|
logger('Failed to initialize storage', err);
|
|
307
307
|
onError?.({
|
|
@@ -1148,9 +1148,12 @@ export const OxyRuntimeProvider = ({
|
|
|
1148
1148
|
runtime.setAccount(cached.user);
|
|
1149
1149
|
});
|
|
1150
1150
|
onAuthStateChangeRef.current?.(cached.user);
|
|
1151
|
+
// The account's cached queries are part of this paint: one local read,
|
|
1152
|
+
// started by the subject change above, so nothing renders without them.
|
|
1153
|
+
await accountQueryPersistence.whenReady();
|
|
1151
1154
|
markAuthResolvedRef.current();
|
|
1152
1155
|
return true;
|
|
1153
|
-
}, [identity, clientIdProp, authStore, oxyServices, runtime, syncDeviceCredentialToHost]);
|
|
1156
|
+
}, [identity, clientIdProp, authStore, oxyServices, runtime, syncDeviceCredentialToHost, accountQueryPersistence]);
|
|
1154
1157
|
|
|
1155
1158
|
// A painted session the server could not be asked about yet stays on screen
|
|
1156
1159
|
// and is asked again: on the lost-token backoff, and at once when the device
|
|
@@ -1403,7 +1406,7 @@ export const OxyRuntimeProvider = ({
|
|
|
1403
1406
|
}) => {
|
|
1404
1407
|
// Every transition, the first sign-in included: the account cache is
|
|
1405
1408
|
// keyed by the subject, and a sign-out deletes the signed-out one's.
|
|
1406
|
-
accountQueryPersistence
|
|
1409
|
+
accountQueryPersistence.activate(next);
|
|
1407
1410
|
if (previous === null) {
|
|
1408
1411
|
return;
|
|
1409
1412
|
}
|