@oxyhq/services 22.4.2 → 22.5.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.
Files changed (29) hide show
  1. package/LICENSE +661 -21
  2. package/README.md +1 -1
  3. package/lib/commonjs/index.js +19 -0
  4. package/lib/commonjs/index.js.map +1 -1
  5. package/lib/commonjs/ui/hooks/queries/useAccountQueries.js +4 -1
  6. package/lib/commonjs/ui/hooks/queries/useAccountQueries.js.map +1 -1
  7. package/lib/commonjs/ui/hooks/queries/userCache.js +262 -0
  8. package/lib/commonjs/ui/hooks/queries/userCache.js.map +1 -0
  9. package/lib/module/index.js +6 -0
  10. package/lib/module/index.js.map +1 -1
  11. package/lib/module/ui/hooks/queries/useAccountQueries.js +4 -1
  12. package/lib/module/ui/hooks/queries/useAccountQueries.js.map +1 -1
  13. package/lib/module/ui/hooks/queries/userCache.js +258 -0
  14. package/lib/module/ui/hooks/queries/userCache.js.map +1 -0
  15. package/lib/typescript/commonjs/index.d.ts +2 -0
  16. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  17. package/lib/typescript/commonjs/ui/hooks/queries/useAccountQueries.d.ts.map +1 -1
  18. package/lib/typescript/commonjs/ui/hooks/queries/userCache.d.ts +93 -0
  19. package/lib/typescript/commonjs/ui/hooks/queries/userCache.d.ts.map +1 -0
  20. package/lib/typescript/module/index.d.ts +2 -0
  21. package/lib/typescript/module/index.d.ts.map +1 -1
  22. package/lib/typescript/module/ui/hooks/queries/useAccountQueries.d.ts.map +1 -1
  23. package/lib/typescript/module/ui/hooks/queries/userCache.d.ts +93 -0
  24. package/lib/typescript/module/ui/hooks/queries/userCache.d.ts.map +1 -0
  25. package/package.json +3 -3
  26. package/src/index.ts +8 -0
  27. package/src/ui/hooks/queries/__tests__/userCache.test.ts +332 -0
  28. package/src/ui/hooks/queries/useAccountQueries.ts +4 -1
  29. package/src/ui/hooks/queries/userCache.ts +285 -0
@@ -0,0 +1,258 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Canonical user-cache UPSERT for the Oxy React Query cache.
5
+ *
6
+ * The problem this solves: many places across an app write a user object into
7
+ * the React Query cache and REPLACE the existing entry — profile fetch, feed /
8
+ * post hydration, search, notifications, lists. Each of those sources carries a
9
+ * DIFFERENT (often sparse) slice of the user: a feed author has no viewer
10
+ * `relationship`, a search hit has no `createdAt`, a notification actor has no
11
+ * `_count`. A plain `setQueryData(key, sparseUser)` therefore STRIPS whatever
12
+ * fields the authoritative single-profile fetch had already stored — the
13
+ * "Follows you tag vanishes when the feed loads" / "counts flash to zero" class
14
+ * of bug.
15
+ *
16
+ * The fix (owned here, in the SDK): ONE canonical upsert that MERGES. It writes
17
+ * under BOTH keys the SDK's user hooks read from:
18
+ * - by-id: `queryKeys.users.detail(id)` (read by `useUserById`)
19
+ * - by-username: `queryKeys.users.byUsername(username, viewerId)` (viewer-scoped;
20
+ * read by `useUserByUsername`, carries the viewer `relationship`)
21
+ *
22
+ * Merge semantics (per key):
23
+ * - No existing entry -> seed the (normalized) incoming object and mark it
24
+ * STALE (`updatedAt: 0`) so react-query refetches the full authoritative
25
+ * profile (viewer-relative `relationship`, counts, `createdAt`, …). Instant
26
+ * first paint, then the real fetch.
27
+ * - Existing entry -> `{ ...existing, ...pickMeaningful(incoming) }`: only
28
+ * the DEFINED, non-empty fields of `incoming` win; every other field is kept
29
+ * from `existing`. A sparse source can never NULL-out or STRIP a field the
30
+ * authoritative fetch set. The entry's freshness is left untouched (never
31
+ * marked stale — it is already managed).
32
+ * - Nested objects (`name`, `_count`, `relationship`) merge field-by-field, so
33
+ * a partial `name`/`_count`/`relationship` never replaces a fuller one.
34
+ * - Anti-degradation: a good `username` / `name.displayName` / `avatar` is
35
+ * never overwritten by a degraded/empty one (empty username, the
36
+ * `'Unknown user'` ghost-author sentinel, `null` avatar).
37
+ *
38
+ * It is a cache write only — zero network, one `setQueryData` per key.
39
+ */
40
+
41
+ import { queryKeys } from "./queryKeys.js";
42
+ import { useAuthStore } from "../../stores/authStore.js";
43
+
44
+ /**
45
+ * A user-shaped object that can be upserted into the cache. Intentionally
46
+ * permissive: it covers the SDK `User` PLUS the looser actor objects embedded on
47
+ * posts / notifications / lists, where `name` may be a plain string and the id
48
+ * may arrive as Mongo `_id`. Every field is optional — a sparse feed author is a
49
+ * valid `CacheableUser`. The index signature lets any additional `User` field
50
+ * pass through untouched (so the upsert never has to know the full DTO shape).
51
+ */
52
+
53
+ /** The degraded display-name sentinel (ghost-author rule). */
54
+ const DEGRADED_DISPLAY_NAME = 'Unknown user';
55
+
56
+ /** A cache entry always carries a resolved string `id`. */
57
+
58
+ /**
59
+ * Whether a value is "meaningful" — i.e. it should override an existing field.
60
+ * Drops `undefined` / `null` / empty-or-whitespace strings so a sparse source
61
+ * can never strip a field. `false`, `0` and other falsy-but-defined values ARE
62
+ * meaningful (a real `verified: false` or `_count.followers: 0`).
63
+ */
64
+ function isMeaningful(value) {
65
+ if (value === undefined || value === null) return false;
66
+ if (typeof value === 'string') return value.trim() !== '';
67
+ return true;
68
+ }
69
+
70
+ /** A display name is meaningful only when non-empty AND not the degraded sentinel. */
71
+ function isMeaningfulDisplayName(value) {
72
+ return typeof value === 'string' && value.trim() !== '' && value !== DEGRADED_DISPLAY_NAME;
73
+ }
74
+ function isPlainObject(value) {
75
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
76
+ }
77
+
78
+ /** Normalize the polymorphic `name` (string | object | nullish) to the canonical object shape. */
79
+ function normalizeName(name) {
80
+ if (name === undefined || name === null) return undefined;
81
+ if (typeof name === 'string') {
82
+ const trimmed = name.trim();
83
+ return trimmed ? {
84
+ displayName: trimmed
85
+ } : undefined;
86
+ }
87
+ return name;
88
+ }
89
+
90
+ /**
91
+ * Coerce a user-shaped object to a cache entry: resolve the id from
92
+ * `id ?? _id ?? fallbackId` and normalize `name` to the canonical object shape
93
+ * (the polymorphic `string` name is dropped from the spread and re-set as an
94
+ * object so the cache never holds a bare-string name).
95
+ */
96
+ function toCachedUser(user, fallbackId) {
97
+ const {
98
+ name: rawName,
99
+ ...rest
100
+ } = user;
101
+ const id = String(user.id ?? user._id ?? fallbackId);
102
+ const name = normalizeName(rawName);
103
+ const normalized = {
104
+ ...rest,
105
+ id
106
+ };
107
+ if (name !== undefined) normalized.name = name;
108
+ return normalized;
109
+ }
110
+
111
+ /**
112
+ * Normalize an incoming (possibly partial) user to a cache entry. Returns `null`
113
+ * when no id can be resolved (nothing to key on).
114
+ */
115
+ function normalizeIncoming(user) {
116
+ const cached = toCachedUser(user, '');
117
+ return cached.id ? cached : null;
118
+ }
119
+
120
+ /** Merge two `name` objects field-by-field, with anti-degradation on `displayName`. */
121
+ function mergeName(existing, incoming) {
122
+ if (incoming === undefined) return existing;
123
+ if (existing === undefined) return incoming;
124
+ const merged = {
125
+ ...existing
126
+ };
127
+ for (const [key, value] of Object.entries(incoming)) {
128
+ if (key === 'displayName') continue;
129
+ if (isMeaningful(value)) merged[key] = value;
130
+ }
131
+ // Never let an empty / `'Unknown user'` displayName overwrite a real one.
132
+ if (isMeaningfulDisplayName(incoming.displayName)) {
133
+ merged.displayName = incoming.displayName;
134
+ }
135
+ return merged;
136
+ }
137
+
138
+ /** Merge `_count` field-by-field so a partial count never replaces a fuller one. */
139
+ function mergeCount(existing, incoming) {
140
+ if (!isPlainObject(incoming)) return existing;
141
+ const merged = {
142
+ ...(isPlainObject(existing) ? existing : {})
143
+ };
144
+ if (typeof incoming.followers === 'number') merged.followers = incoming.followers;
145
+ if (typeof incoming.following === 'number') merged.following = incoming.following;
146
+ return merged;
147
+ }
148
+
149
+ /**
150
+ * Merge `relationship`. A source without a relationship (feed/list/notification,
151
+ * or an anon/self/bulk `null`) must NEVER strip an existing viewer relationship.
152
+ */
153
+ function mergeRelationship(existing, incoming) {
154
+ if (!isPlainObject(incoming)) return existing;
155
+ const merged = {
156
+ ...(isPlainObject(existing) ? existing : {})
157
+ };
158
+ if (typeof incoming.isFollowing === 'boolean') merged.isFollowing = incoming.isFollowing;
159
+ if (typeof incoming.followsYou === 'boolean') merged.followsYou = incoming.followsYou;
160
+ return merged;
161
+ }
162
+
163
+ /**
164
+ * Merge a (normalized) incoming user over an existing cache entry: keep every
165
+ * existing field, override only with the meaningful fields of `incoming`.
166
+ */
167
+ function mergeUsers(existing, incoming) {
168
+ const merged = {
169
+ ...existing
170
+ };
171
+ for (const [key, value] of Object.entries(incoming)) {
172
+ if (key === 'name' || key === '_count' || key === 'relationship') continue;
173
+ if (key === 'id') {
174
+ merged.id = incoming.id;
175
+ continue;
176
+ }
177
+ if (isMeaningful(value)) merged[key] = value;
178
+ }
179
+ const name = mergeName(existing.name, incoming.name);
180
+ if (name !== undefined) merged.name = name;
181
+ const count = mergeCount(existing._count, incoming._count);
182
+ if (count !== undefined) merged._count = count;
183
+ const relationship = mergeRelationship(existing.relationship, incoming.relationship);
184
+ if (relationship !== undefined) merged.relationship = relationship;
185
+ return merged;
186
+ }
187
+
188
+ /** Merge-upsert a normalized user into one cache key (see module docs for semantics). */
189
+ function upsertOneKey(queryClient, key, incoming) {
190
+ const existing = queryClient.getQueryData(key);
191
+ if (existing === undefined) {
192
+ // Cold slot: seed the full incoming object, STALE, so react-query refetches
193
+ // the full authoritative profile (relationship, counts, createdAt, …).
194
+ queryClient.setQueryData(key, incoming, {
195
+ updatedAt: 0
196
+ });
197
+ return;
198
+ }
199
+ // Existing entry: merge and leave its freshness lifecycle untouched. The
200
+ // existing entry is keyed by `incoming.id`, so use it as the fallback id.
201
+ const merged = mergeUsers(toCachedUser(existing, incoming.id), incoming);
202
+ const dataUpdatedAt = queryClient.getQueryState(key)?.dataUpdatedAt ?? 0;
203
+ queryClient.setQueryData(key, merged, {
204
+ updatedAt: dataUpdatedAt
205
+ });
206
+ }
207
+
208
+ /**
209
+ * Resolve the active viewer id. The by-username cache key is viewer-scoped; the
210
+ * seed must land on the exact key `useUserByUsername` reads. When a caller does
211
+ * not pass `viewerId`, read it from the auth store — the same store behind the
212
+ * hook's `useOxy().user?.id`, so seed and read stay in lockstep. An explicit
213
+ * empty string is honoured (anonymous scope).
214
+ */
215
+ function resolveViewerId(viewerId) {
216
+ return viewerId ?? useAuthStore.getState().user?.id ?? '';
217
+ }
218
+
219
+ /**
220
+ * Merge-upsert a (possibly partial) user into the SDK's user query cache under
221
+ * both the by-id key and, when a username is present, the viewer-scoped
222
+ * by-username key.
223
+ *
224
+ * @param queryClient The app's React Query client.
225
+ * @param user A `User`-shaped object (may be sparse).
226
+ * @param viewerId The active viewer id for the by-username key. Defaults to
227
+ * the current auth-store user id.
228
+ */
229
+ export function upsertCachedUser(queryClient, user, viewerId) {
230
+ const incoming = normalizeIncoming(user);
231
+ if (!incoming) return;
232
+
233
+ // By-id identity entry (read by `useUserById`). Not viewer-scoped.
234
+ upsertOneKey(queryClient, queryKeys.users.detail(incoming.id), incoming);
235
+ const username = incoming.username;
236
+ if (typeof username === 'string' && username.trim() !== '') {
237
+ // By-username entry (read by `useUserByUsername`). Viewer-scoped because the
238
+ // authenticated single-profile fetch embeds the viewer `relationship`. Build
239
+ // the key through the SAME helper the hook uses so username normalization
240
+ // (`trim().toLowerCase()`) matches byte-for-byte.
241
+ const key = queryKeys.users.byUsername(username, resolveViewerId(viewerId));
242
+ upsertOneKey(queryClient, key, incoming);
243
+ }
244
+ }
245
+
246
+ /**
247
+ * Batch merge-upsert many users at once (for a feed / list / search response).
248
+ * Resolves the viewer id once and upserts each user cumulatively — a user that
249
+ * appears twice merges both slices into the single cache entry.
250
+ */
251
+ export function upsertCachedUsers(queryClient, users, viewerId) {
252
+ if (!Array.isArray(users) || users.length === 0) return;
253
+ const resolvedViewerId = resolveViewerId(viewerId);
254
+ for (const user of users) {
255
+ if (user) upsertCachedUser(queryClient, user, resolvedViewerId);
256
+ }
257
+ }
258
+ //# sourceMappingURL=userCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["queryKeys","useAuthStore","DEGRADED_DISPLAY_NAME","isMeaningful","value","undefined","trim","isMeaningfulDisplayName","isPlainObject","Array","isArray","normalizeName","name","trimmed","displayName","toCachedUser","user","fallbackId","rawName","rest","id","String","_id","normalized","normalizeIncoming","cached","mergeName","existing","incoming","merged","key","Object","entries","mergeCount","followers","following","mergeRelationship","isFollowing","followsYou","mergeUsers","count","_count","relationship","upsertOneKey","queryClient","getQueryData","setQueryData","updatedAt","dataUpdatedAt","getQueryState","resolveViewerId","viewerId","getState","upsertCachedUser","users","detail","username","byUsername","upsertCachedUsers","length","resolvedViewerId"],"sourceRoot":"../../../../../src","sources":["ui/hooks/queries/userCache.ts"],"mappings":"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","ignoreList":[]}
@@ -46,6 +46,8 @@ export { createProfileMutation, createGenericMutation, } from './ui/hooks/mutati
46
46
  export type { ProfileMutationConfig, GenericMutationConfig, } from './ui/hooks/mutations/mutationFactory';
47
47
  export { mutationKeys } from './ui/hooks/mutations/mutationKeys';
48
48
  export { queryKeys, invalidateAccountQueries, invalidateUserQueries, invalidateSessionQueries, invalidateDeviceQueries, invalidatePrivacyQueries, invalidateSecurityQueries, invalidateStorageQueries, invalidatePaymentsQueries, invalidateConnectedAppsQueries, invalidateAuthMethodsQueries, } from './ui/hooks/queries/queryKeys';
49
+ export { upsertCachedUser, upsertCachedUsers } from './ui/hooks/queries/userCache';
50
+ export type { CacheableUser } from './ui/hooks/queries/userCache';
49
51
  export { useMutationStatus } from './ui/hooks/useMutationStatus';
50
52
  export type { MutationStatus } from './ui/hooks/useMutationStatus';
51
53
  export { useOnlineStatus } from './ui/hooks/useOnlineStatus';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAccountQueries.d.ts","sourceRoot":"","sources":["../../../../../../src/ui/hooks/queries/useAccountQueries.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAMtD;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,WAAW,MAAM,GAAG,IAAI,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,yEAevF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,YAAY,MAAM,EAAE,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,yEAepF,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,cAAc,GAAI,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,yEA8D7D,CAAC;AAsBF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,GAAG,IAAI,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,yEAejF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,GAAG,IAAI,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,yEA0BzF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,YAAY,MAAM,EAAE,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE;;;YAevF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,mFAgB/D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,SAAS,MAAM,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,0GAwBlF,CAAC"}
1
+ {"version":3,"file":"useAccountQueries.d.ts","sourceRoot":"","sources":["../../../../../../src/ui/hooks/queries/useAccountQueries.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAMtD;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,WAAW,MAAM,GAAG,IAAI,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,yEAevF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,YAAY,MAAM,EAAE,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,yEAepF,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,cAAc,GAAI,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,yEA8D7D,CAAC;AAsBF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,GAAG,IAAI,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,yEAejF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,GAAG,IAAI,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,yEA6BzF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,YAAY,MAAM,EAAE,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE;;;YAevF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,mFAgB/D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,SAAS,MAAM,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,0GAwBlF,CAAC"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Canonical user-cache UPSERT for the Oxy React Query cache.
3
+ *
4
+ * The problem this solves: many places across an app write a user object into
5
+ * the React Query cache and REPLACE the existing entry — profile fetch, feed /
6
+ * post hydration, search, notifications, lists. Each of those sources carries a
7
+ * DIFFERENT (often sparse) slice of the user: a feed author has no viewer
8
+ * `relationship`, a search hit has no `createdAt`, a notification actor has no
9
+ * `_count`. A plain `setQueryData(key, sparseUser)` therefore STRIPS whatever
10
+ * fields the authoritative single-profile fetch had already stored — the
11
+ * "Follows you tag vanishes when the feed loads" / "counts flash to zero" class
12
+ * of bug.
13
+ *
14
+ * The fix (owned here, in the SDK): ONE canonical upsert that MERGES. It writes
15
+ * under BOTH keys the SDK's user hooks read from:
16
+ * - by-id: `queryKeys.users.detail(id)` (read by `useUserById`)
17
+ * - by-username: `queryKeys.users.byUsername(username, viewerId)` (viewer-scoped;
18
+ * read by `useUserByUsername`, carries the viewer `relationship`)
19
+ *
20
+ * Merge semantics (per key):
21
+ * - No existing entry -> seed the (normalized) incoming object and mark it
22
+ * STALE (`updatedAt: 0`) so react-query refetches the full authoritative
23
+ * profile (viewer-relative `relationship`, counts, `createdAt`, …). Instant
24
+ * first paint, then the real fetch.
25
+ * - Existing entry -> `{ ...existing, ...pickMeaningful(incoming) }`: only
26
+ * the DEFINED, non-empty fields of `incoming` win; every other field is kept
27
+ * from `existing`. A sparse source can never NULL-out or STRIP a field the
28
+ * authoritative fetch set. The entry's freshness is left untouched (never
29
+ * marked stale — it is already managed).
30
+ * - Nested objects (`name`, `_count`, `relationship`) merge field-by-field, so
31
+ * a partial `name`/`_count`/`relationship` never replaces a fuller one.
32
+ * - Anti-degradation: a good `username` / `name.displayName` / `avatar` is
33
+ * never overwritten by a degraded/empty one (empty username, the
34
+ * `'Unknown user'` ghost-author sentinel, `null` avatar).
35
+ *
36
+ * It is a cache write only — zero network, one `setQueryData` per key.
37
+ */
38
+ import type { QueryClient } from '@tanstack/react-query';
39
+ import type { UserNameResponse } from '@oxyhq/contracts';
40
+ /**
41
+ * A user-shaped object that can be upserted into the cache. Intentionally
42
+ * permissive: it covers the SDK `User` PLUS the looser actor objects embedded on
43
+ * posts / notifications / lists, where `name` may be a plain string and the id
44
+ * may arrive as Mongo `_id`. Every field is optional — a sparse feed author is a
45
+ * valid `CacheableUser`. The index signature lets any additional `User` field
46
+ * pass through untouched (so the upsert never has to know the full DTO shape).
47
+ */
48
+ export interface CacheableUser {
49
+ id?: string;
50
+ /** Some sources (post/notification actors) carry the id as Mongo `_id`. */
51
+ _id?: string;
52
+ username?: string;
53
+ /**
54
+ * Canonical structured name (`UserNameResponse`) OR a plain display string on
55
+ * the looser actor objects. Normalized to the object shape on write.
56
+ */
57
+ name?: string | UserNameResponse;
58
+ /** Avatar file id. `null`/`''` are treated as "no avatar" (never degrade). */
59
+ avatar?: string | null;
60
+ /** Social counts. A partial `_count` never replaces a fuller one. */
61
+ _count?: {
62
+ followers?: number;
63
+ following?: number;
64
+ } | null;
65
+ /**
66
+ * Viewer-relative follow relationship. Present ONLY on an authenticated
67
+ * single-profile fetch; `null`/absent for anon/self/bulk/feed. Never stripped
68
+ * from an existing entry by a source that lacks it.
69
+ */
70
+ relationship?: {
71
+ isFollowing?: boolean;
72
+ followsYou?: boolean;
73
+ } | null;
74
+ [key: string]: unknown;
75
+ }
76
+ /**
77
+ * Merge-upsert a (possibly partial) user into the SDK's user query cache under
78
+ * both the by-id key and, when a username is present, the viewer-scoped
79
+ * by-username key.
80
+ *
81
+ * @param queryClient The app's React Query client.
82
+ * @param user A `User`-shaped object (may be sparse).
83
+ * @param viewerId The active viewer id for the by-username key. Defaults to
84
+ * the current auth-store user id.
85
+ */
86
+ export declare function upsertCachedUser(queryClient: QueryClient, user: CacheableUser, viewerId?: string): void;
87
+ /**
88
+ * Batch merge-upsert many users at once (for a feed / list / search response).
89
+ * Resolves the viewer id once and upserts each user cumulatively — a user that
90
+ * appears twice merges both slices into the single cache entry.
91
+ */
92
+ export declare function upsertCachedUsers(queryClient: QueryClient, users: readonly CacheableUser[] | null | undefined, viewerId?: string): void;
93
+ //# sourceMappingURL=userCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userCache.d.ts","sourceRoot":"","sources":["../../../../../../src/ui/hooks/queries/userCache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAIzD;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,2EAA2E;IAC3E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACjC,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,qEAAqE;IACrE,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC3D;;;;OAIG;IACH,YAAY,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACtE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAqKD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,aAAa,EACnB,QAAQ,CAAC,EAAE,MAAM,GAChB,IAAI,CAgBN;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,SAAS,aAAa,EAAE,GAAG,IAAI,GAAG,SAAS,EAClD,QAAQ,CAAC,EAAE,MAAM,GAChB,IAAI,CAMN"}
@@ -46,6 +46,8 @@ export { createProfileMutation, createGenericMutation, } from './ui/hooks/mutati
46
46
  export type { ProfileMutationConfig, GenericMutationConfig, } from './ui/hooks/mutations/mutationFactory.js';
47
47
  export { mutationKeys } from './ui/hooks/mutations/mutationKeys.js';
48
48
  export { queryKeys, invalidateAccountQueries, invalidateUserQueries, invalidateSessionQueries, invalidateDeviceQueries, invalidatePrivacyQueries, invalidateSecurityQueries, invalidateStorageQueries, invalidatePaymentsQueries, invalidateConnectedAppsQueries, invalidateAuthMethodsQueries, } from './ui/hooks/queries/queryKeys.js';
49
+ export { upsertCachedUser, upsertCachedUsers } from './ui/hooks/queries/userCache.js';
50
+ export type { CacheableUser } from './ui/hooks/queries/userCache.js';
49
51
  export { useMutationStatus } from './ui/hooks/useMutationStatus.js';
50
52
  export type { MutationStatus } from './ui/hooks/useMutationStatus.js';
51
53
  export { useOnlineStatus } from './ui/hooks/useOnlineStatus.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAccountQueries.d.ts","sourceRoot":"","sources":["../../../../../../src/ui/hooks/queries/useAccountQueries.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAMtD;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,WAAW,MAAM,GAAG,IAAI,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,yEAevF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,YAAY,MAAM,EAAE,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,yEAepF,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,cAAc,GAAI,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,yEA8D7D,CAAC;AAsBF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,GAAG,IAAI,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,yEAejF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,GAAG,IAAI,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,yEA0BzF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,YAAY,MAAM,EAAE,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE;;;YAevF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,mFAgB/D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,SAAS,MAAM,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,0GAwBlF,CAAC"}
1
+ {"version":3,"file":"useAccountQueries.d.ts","sourceRoot":"","sources":["../../../../../../src/ui/hooks/queries/useAccountQueries.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAMtD;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,WAAW,MAAM,GAAG,IAAI,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,yEAevF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,YAAY,MAAM,EAAE,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,yEAepF,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,cAAc,GAAI,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,yEA8D7D,CAAC;AAsBF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,GAAG,IAAI,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,yEAejF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,GAAG,IAAI,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,yEA6BzF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,YAAY,MAAM,EAAE,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE;;;YAevF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,mFAgB/D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,SAAS,MAAM,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,0GAwBlF,CAAC"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Canonical user-cache UPSERT for the Oxy React Query cache.
3
+ *
4
+ * The problem this solves: many places across an app write a user object into
5
+ * the React Query cache and REPLACE the existing entry — profile fetch, feed /
6
+ * post hydration, search, notifications, lists. Each of those sources carries a
7
+ * DIFFERENT (often sparse) slice of the user: a feed author has no viewer
8
+ * `relationship`, a search hit has no `createdAt`, a notification actor has no
9
+ * `_count`. A plain `setQueryData(key, sparseUser)` therefore STRIPS whatever
10
+ * fields the authoritative single-profile fetch had already stored — the
11
+ * "Follows you tag vanishes when the feed loads" / "counts flash to zero" class
12
+ * of bug.
13
+ *
14
+ * The fix (owned here, in the SDK): ONE canonical upsert that MERGES. It writes
15
+ * under BOTH keys the SDK's user hooks read from:
16
+ * - by-id: `queryKeys.users.detail(id)` (read by `useUserById`)
17
+ * - by-username: `queryKeys.users.byUsername(username, viewerId)` (viewer-scoped;
18
+ * read by `useUserByUsername`, carries the viewer `relationship`)
19
+ *
20
+ * Merge semantics (per key):
21
+ * - No existing entry -> seed the (normalized) incoming object and mark it
22
+ * STALE (`updatedAt: 0`) so react-query refetches the full authoritative
23
+ * profile (viewer-relative `relationship`, counts, `createdAt`, …). Instant
24
+ * first paint, then the real fetch.
25
+ * - Existing entry -> `{ ...existing, ...pickMeaningful(incoming) }`: only
26
+ * the DEFINED, non-empty fields of `incoming` win; every other field is kept
27
+ * from `existing`. A sparse source can never NULL-out or STRIP a field the
28
+ * authoritative fetch set. The entry's freshness is left untouched (never
29
+ * marked stale — it is already managed).
30
+ * - Nested objects (`name`, `_count`, `relationship`) merge field-by-field, so
31
+ * a partial `name`/`_count`/`relationship` never replaces a fuller one.
32
+ * - Anti-degradation: a good `username` / `name.displayName` / `avatar` is
33
+ * never overwritten by a degraded/empty one (empty username, the
34
+ * `'Unknown user'` ghost-author sentinel, `null` avatar).
35
+ *
36
+ * It is a cache write only — zero network, one `setQueryData` per key.
37
+ */
38
+ import type { QueryClient } from '@tanstack/react-query';
39
+ import type { UserNameResponse } from '@oxyhq/contracts';
40
+ /**
41
+ * A user-shaped object that can be upserted into the cache. Intentionally
42
+ * permissive: it covers the SDK `User` PLUS the looser actor objects embedded on
43
+ * posts / notifications / lists, where `name` may be a plain string and the id
44
+ * may arrive as Mongo `_id`. Every field is optional — a sparse feed author is a
45
+ * valid `CacheableUser`. The index signature lets any additional `User` field
46
+ * pass through untouched (so the upsert never has to know the full DTO shape).
47
+ */
48
+ export interface CacheableUser {
49
+ id?: string;
50
+ /** Some sources (post/notification actors) carry the id as Mongo `_id`. */
51
+ _id?: string;
52
+ username?: string;
53
+ /**
54
+ * Canonical structured name (`UserNameResponse`) OR a plain display string on
55
+ * the looser actor objects. Normalized to the object shape on write.
56
+ */
57
+ name?: string | UserNameResponse;
58
+ /** Avatar file id. `null`/`''` are treated as "no avatar" (never degrade). */
59
+ avatar?: string | null;
60
+ /** Social counts. A partial `_count` never replaces a fuller one. */
61
+ _count?: {
62
+ followers?: number;
63
+ following?: number;
64
+ } | null;
65
+ /**
66
+ * Viewer-relative follow relationship. Present ONLY on an authenticated
67
+ * single-profile fetch; `null`/absent for anon/self/bulk/feed. Never stripped
68
+ * from an existing entry by a source that lacks it.
69
+ */
70
+ relationship?: {
71
+ isFollowing?: boolean;
72
+ followsYou?: boolean;
73
+ } | null;
74
+ [key: string]: unknown;
75
+ }
76
+ /**
77
+ * Merge-upsert a (possibly partial) user into the SDK's user query cache under
78
+ * both the by-id key and, when a username is present, the viewer-scoped
79
+ * by-username key.
80
+ *
81
+ * @param queryClient The app's React Query client.
82
+ * @param user A `User`-shaped object (may be sparse).
83
+ * @param viewerId The active viewer id for the by-username key. Defaults to
84
+ * the current auth-store user id.
85
+ */
86
+ export declare function upsertCachedUser(queryClient: QueryClient, user: CacheableUser, viewerId?: string): void;
87
+ /**
88
+ * Batch merge-upsert many users at once (for a feed / list / search response).
89
+ * Resolves the viewer id once and upserts each user cumulatively — a user that
90
+ * appears twice merges both slices into the single cache entry.
91
+ */
92
+ export declare function upsertCachedUsers(queryClient: QueryClient, users: readonly CacheableUser[] | null | undefined, viewerId?: string): void;
93
+ //# sourceMappingURL=userCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userCache.d.ts","sourceRoot":"","sources":["../../../../../../src/ui/hooks/queries/userCache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAIzD;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,2EAA2E;IAC3E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACjC,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,qEAAqE;IACrE,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC3D;;;;OAIG;IACH,YAAY,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACtE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAqKD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,aAAa,EACnB,QAAQ,CAAC,EAAE,MAAM,GAChB,IAAI,CAgBN;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,SAAS,aAAa,EAAE,GAAG,IAAI,GAAG,SAAS,EAClD,QAAQ,CAAC,EAAE,MAAM,GAChB,IAAI,CAMN"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oxyhq/services",
3
- "version": "22.4.2",
3
+ "version": "22.5.0",
4
4
  "description": "OxyHQ Expo/React Native SDK — UI components, screens, and native features",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
@@ -91,7 +91,7 @@
91
91
  "directory": "packages/services"
92
92
  },
93
93
  "author": "OxyHQ",
94
- "license": "MIT",
94
+ "license": "AGPL-3.0-only",
95
95
  "engines": {
96
96
  "node": ">=18.0.0"
97
97
  },
@@ -135,7 +135,7 @@
135
135
  "@biomejs/biome": "^1.9.4",
136
136
  "@commitlint/cli": "^17.6.5",
137
137
  "@commitlint/config-conventional": "^17.6.5",
138
- "@oxyhq/core": "12.5.1",
138
+ "@oxyhq/core": "12.5.4",
139
139
  "@react-native-async-storage/async-storage": "^2.0.0",
140
140
  "@react-native-community/netinfo": "^11.4.1",
141
141
  "@react-native/babel-preset": "^0.86.0",
package/src/index.ts CHANGED
@@ -170,6 +170,14 @@ export {
170
170
  invalidateAuthMethodsQueries,
171
171
  } from './ui/hooks/queries/queryKeys';
172
172
 
173
+ // Canonical user-cache upsert. MERGE-upserts a (possibly partial) user into the
174
+ // SDK's user query cache under both keys it owns (by-id + viewer-scoped
175
+ // by-username). Consumers route ALL cache seeds (feed / list / search / profile
176
+ // hydration) through this so a sparse source can never strip a field an
177
+ // authoritative fetch already stored.
178
+ export { upsertCachedUser, upsertCachedUsers } from './ui/hooks/queries/userCache';
179
+ export type { CacheableUser } from './ui/hooks/queries/userCache';
180
+
173
181
  // Mutation status aggregator (for "Syncing..." indicators)
174
182
  export { useMutationStatus } from './ui/hooks/useMutationStatus';
175
183
  export type { MutationStatus } from './ui/hooks/useMutationStatus';