about summary refs log tree commit diff
path: root/src/state/queries/unstable-profile-cache.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/state/queries/unstable-profile-cache.ts')
-rw-r--r--src/state/queries/unstable-profile-cache.ts51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/state/queries/unstable-profile-cache.ts b/src/state/queries/unstable-profile-cache.ts
new file mode 100644
index 000000000..4ac5001b7
--- /dev/null
+++ b/src/state/queries/unstable-profile-cache.ts
@@ -0,0 +1,51 @@
+import {useCallback} from 'react'
+import {QueryClient, useQueryClient} from '@tanstack/react-query'
+
+import * as bsky from '#/types/bsky'
+
+const unstableProfileViewCacheQueryKeyRoot = 'unstableProfileViewCache'
+export const unstableProfileViewCacheQueryKey = (didOrHandle: string) => [
+  unstableProfileViewCacheQueryKeyRoot,
+  didOrHandle,
+]
+
+/**
+ * Used as a rough cache of profile views to make loading snappier. This method
+ * accepts and stores any profile view type by both handle and DID.
+ *
+ * Access the cache via {@link useUnstableProfileViewCache}.
+ */
+export function unstableCacheProfileView(
+  queryClient: QueryClient,
+  profile: bsky.profile.AnyProfileView,
+) {
+  queryClient.setQueryData(
+    unstableProfileViewCacheQueryKey(profile.handle),
+    profile,
+  )
+  queryClient.setQueryData(
+    unstableProfileViewCacheQueryKey(profile.did),
+    profile,
+  )
+}
+
+/**
+ * Hook to access the unstable profile view cache. This cache can return ANY
+ * profile view type, so if the object shape is important, you need to use the
+ * identity validators shipped in the atproto SDK e.g.
+ * `AppBskyActorDefs.isValidProfileViewBasic` to confirm before using.
+ *
+ * To cache a profile, use {@link unstableCacheProfileView}.
+ */
+export function useUnstableProfileViewCache() {
+  const qc = useQueryClient()
+  const getUnstableProfile = useCallback(
+    (didOrHandle: string) => {
+      return qc.getQueryData<bsky.profile.AnyProfileView>(
+        unstableProfileViewCacheQueryKey(didOrHandle),
+      )
+    },
+    [qc],
+  )
+  return {getUnstableProfile}
+}