import type { InfiniteData } from '@tanstack/react-query'; import type { Conversation } from '../contexts/ChatContext'; export interface ConversationsPage { items: Conversation[]; next_cursor: string | null; } export type ConversationsPagesData = InfiniteData; export const normalizeConversationsPage = (payload: unknown): ConversationsPage => { if (Array.isArray(payload)) { return { items: payload as Conversation[], next_cursor: null }; } if (!payload || typeof payload !== 'object') { return { items: [], next_cursor: null }; } const page = payload as { items?: unknown; next_cursor?: unknown }; return { items: Array.isArray(page.items) ? page.items as Conversation[] : [], next_cursor: typeof page.next_cursor === 'string' && page.next_cursor ? page.next_cursor : null, }; }; export const flattenConversationPages = (data?: ConversationsPagesData): Conversation[] => { if (!data) return []; const conversationsById = new Map(); for (const page of data.pages) { for (const conversation of page.items) { if (!conversationsById.has(conversation.conversation_id)) { conversationsById.set(conversation.conversation_id, conversation); } } } return Array.from(conversationsById.values()); }; export const createConversationsPagesData = (conversation: Conversation): ConversationsPagesData => ({ pages: [{ items: [conversation], next_cursor: null }], pageParams: [null], }); export const prependConversationToPages = ( data: ConversationsPagesData | undefined, conversation: Conversation, ): ConversationsPagesData => { if (!data || data.pages.length === 0) { return createConversationsPagesData(conversation); } return { ...data, pages: data.pages.map((page, index) => ({ ...page, items: index === 0 ? [ conversation, ...page.items.filter(item => item.conversation_id !== conversation.conversation_id), ] : page.items.filter(item => item.conversation_id !== conversation.conversation_id), })), }; }; export const updateConversationTitleInPages = ( data: ConversationsPagesData | undefined, conversationId: string, title: string, ): ConversationsPagesData | undefined => { if (!data) return data; return { ...data, pages: data.pages.map(page => ({ ...page, items: page.items.map(conversation => ( conversation.conversation_id === conversationId ? { ...conversation, title } : conversation )), })), }; }; export const removeConversationFromPages = ( data: ConversationsPagesData | undefined, conversationId: string, ): ConversationsPagesData | undefined => { if (!data) return data; return { ...data, pages: data.pages.map(page => ({ ...page, items: page.items.filter(conversation => conversation.conversation_id !== conversationId), })), }; };