diff --git a/packages/pl-fe/src/queries/conversations/use-conversations.ts b/packages/pl-fe/src/queries/conversations/use-conversations.ts index 11a4c85e1..3650a1c47 100644 --- a/packages/pl-fe/src/queries/conversations/use-conversations.ts +++ b/packages/pl-fe/src/queries/conversations/use-conversations.ts @@ -14,28 +14,15 @@ import { store } from '@/store'; import { compareDate } from '@/utils/comparators'; import { queryClient } from '../client'; +import { + minifyConversation, + minifyConversationList, + type MinifiedConversation, +} from '../utils/minify-list'; import { updatePaginatedResponse } from '../utils/update-paginated-response'; import type { Conversation, PaginatedResponse } from 'pl-api'; -type MinifiedConversation = { - id: string; - unread: boolean; - account_ids: string[]; - last_status: string | null; - last_status_created_at: string | null; -}; - -type MinifiedConversationPage = PaginatedResponse; - -const minifyConversation = (conversation: Conversation): MinifiedConversation => ({ - id: conversation.id, - unread: conversation.unread, - account_ids: conversation.accounts.map((account) => account.id), - last_status: conversation.last_status?.id ?? null, - last_status_created_at: conversation.last_status?.created_at ?? null, -}); - const sortConversations = (items: MinifiedConversation[]) => items.toSorted((a, b) => { if (a.last_status_created_at === null || b.last_status_created_at === null) { @@ -54,48 +41,34 @@ const importConversationEntities = (conversations: Conversation[]) => { ); }; -const minifyConversationPage = ( - response: PaginatedResponse, -): MinifiedConversationPage => { - importConversationEntities(response.items); - - return { - ...response, - previous: response.previous - ? () => response.previous!().then((page) => minifyConversationPage(page)) - : null, - next: response.next - ? () => response.next!().then((page) => minifyConversationPage(page)) - : null, - items: response.items.map(minifyConversation), - }; -}; - const updateConversations = (conversation: Conversation) => { importConversationEntities([conversation]); - queryClient.setQueryData>(['conversations'], (data) => { - if (!data || !data.pages.length) return data; + queryClient.setQueryData>>( + ['conversations'], + (data) => { + if (!data || !data.pages.length) return data; - return create(data, (draft) => { - const updatedConversation = minifyConversation(conversation); + return create(data, (draft) => { + const updatedConversation = minifyConversation(conversation); - let found = false; + let found = false; - for (const page of draft.pages) { - const index = page.items.findIndex((item) => item.id === updatedConversation.id); - if (index !== -1) { - page.items[index] = updatedConversation; - found = true; - break; + for (const page of draft.pages) { + const index = page.items.findIndex((item) => item.id === updatedConversation.id); + if (index !== -1) { + page.items[index] = updatedConversation; + found = true; + break; + } } - } - if (!found) { - draft.pages[0].items.unshift(updatedConversation); - } - }); - }); + if (!found) { + draft.pages[0].items.unshift(updatedConversation); + } + }); + }, + ); }; const useConversations = () => { @@ -110,14 +83,11 @@ const useConversations = () => { } const response = await client.timelines.getConversations(); - return minifyConversationPage(response); + return minifyConversationList(response); }, initialPageParam: { - previous: null, - next: null, - items: [], - partial: false, - } as MinifiedConversationPage, + next: null as (() => Promise>) | null, + } as PaginatedResponse, getNextPageParam: (page) => (page.next ? page : undefined), enabled: isLoggedIn, }); @@ -140,9 +110,9 @@ const useMarkConversationRead = (conversationId: string) => { onMutate: async () => { await queryClient.cancelQueries({ queryKey: ['conversations'] }); - const previous = queryClient.getQueryData>([ - 'conversations', - ]); + const previous = queryClient.getQueryData< + InfiniteData> + >(['conversations']); updatePaginatedResponse(['conversations'], (items) => items.map((item) => (item.id === conversationId ? { ...item, unread: false } : item)), diff --git a/packages/pl-fe/src/queries/utils/minify-list.ts b/packages/pl-fe/src/queries/utils/minify-list.ts index 2c9462b9f..8b1407100 100644 --- a/packages/pl-fe/src/queries/utils/minify-list.ts +++ b/packages/pl-fe/src/queries/utils/minify-list.ts @@ -8,6 +8,7 @@ import type { AdminAccount, AdminReport, BlockedAccount, + Conversation, Group, MutedAccount, PaginatedResponse, @@ -82,6 +83,32 @@ const minifyGroupList = (response: PaginatedResponse): PaginatedResponse< }, ); +type MinifiedConversation = { + id: string; + unread: boolean; + account_ids: string[]; + last_status: string | null; + last_status_created_at: string | null; +}; + +const minifyConversation = (conversation: Conversation): MinifiedConversation => ({ + id: conversation.id, + unread: conversation.unread, + account_ids: conversation.accounts.map((account) => account.id), + last_status: conversation.last_status?.id ?? null, + last_status_created_at: conversation.last_status?.created_at ?? null, +}); + +const minifyConversationList = (response: PaginatedResponse) => + minifyList(response, minifyConversation, (conversations) => { + store.dispatch( + importEntities({ + accounts: conversations.flatMap((conversation) => conversation.accounts), + statuses: conversations.map((conversation) => conversation.last_status), + }) as any, + ); + }); + const minifyAdminAccount = ({ account, ...adminAccount }: AdminAccount) => { store.dispatch(importEntities({ accounts: [account] }) as any); queryClient.setQueryData(['admin', 'accounts', adminAccount.id], adminAccount); @@ -159,8 +186,11 @@ export { minifyMutedAccountList, minifyStatusList, minifyGroupList, + minifyConversation, + minifyConversationList, minifyAdminAccount, minifyAdminAccountList, minifyAdminReport, minifyAdminReportList, + type MinifiedConversation, };