import { useQueryClient } from '@tanstack/react-query' import { CurrentPersonResource } from '../types' import { ApiResource } from '../types/api_primitives' import { FIVE_MINUTES, THIRTY_MINUTES } from '../utils/time' import { getRequestQueryKey, useSuspenseGet } from './use_suspense_api' export const currentPersonRequestArgs = { url: '/me', data: { fields: { Person: [ 'id', 'name', 'avatar', 'can_chat', 'unread_count', 'pco_chat_enabled', 'age_qualification_status', 'direct_messages_disabled', 'direct_messages_eligible', 'can_browse_archived_conversations', 'under_18', ], }, }, } export const currentPersonQueryKey = getRequestQueryKey(currentPersonRequestArgs) export const useCurrentPerson = () => { const { data: person } = useSuspenseGet(currentPersonRequestArgs, { staleTime: FIVE_MINUTES, gcTime: THIRTY_MINUTES, }) return person } type ProcessRecord = (record: T, update: Partial) => T export const useCurrentPersonCache = () => { const queryClient = useQueryClient() const handleUpdate = ( update: Partial, processRecord: ProcessRecord = (r, u) => ({ ...r, ...u }) ) => { queryClient.setQueryData>(currentPersonQueryKey, data => { if (!data) return data return { ...data, data: processRecord(data.data, update) } }) } const handleInvalidate = () => { queryClient.invalidateQueries({ queryKey: currentPersonQueryKey }) } return { update: handleUpdate, invalidate: handleInvalidate } }