import { TicketMessage } from "@root/model/ticket"; import { create } from "zustand"; import { createJSONStorage, devtools, persist } from "zustand/middleware"; interface UnauthTicketStore { sessionData: { ticketId: string; sessionId: string; } | null; messages: TicketMessage[]; fetchState: "idle" | "fetching" | "all fetched"; apiPage: number; messagesPerPage: number; lastMessageId: string | undefined; isPreventAutoscroll: boolean; } export const useUnauthTicketStore = create()( persist( devtools( (set, get) => ({ sessionData: null, messages: [], fetchState: "idle", apiPage: 0, messagesPerPage: 10, lastMessageId: undefined, isPreventAutoscroll: false, }), { name: "Unauth ticket store" } ), { version: 0, name: "unauth-ticket", storage: createJSONStorage(() => localStorage), partialize: state => ({ sessionData: state.sessionData, }) } ) ); export const setUnauthSessionData = (sessionData: UnauthTicketStore["sessionData"]) => useUnauthTicketStore.setState({ sessionData }); export const addOrUpdateUnauthMessages = (receivedMessages: TicketMessage[]) => { const state = useUnauthTicketStore.getState(); const messageIdToMessageMap: { [messageId: string]: TicketMessage; } = {}; [...state.messages, ...receivedMessages].forEach(message => messageIdToMessageMap[message.id] = message); const sortedMessages = Object.values(messageIdToMessageMap).sort(sortMessagesByTime); useUnauthTicketStore.setState({ messages: sortedMessages, lastMessageId: sortedMessages.at(-1)?.id, }); }; export const setUnauthTicketFetchState = (fetchState: UnauthTicketStore["fetchState"]) => useUnauthTicketStore.setState({ fetchState }); export const incrementUnauthMessageApiPage = () => { const state = useUnauthTicketStore.getState(); useUnauthTicketStore.setState({ apiPage: state.apiPage + 1 }); }; export const setUnauthIsPreventAutoscroll = (isPreventAutoscroll: boolean) => useUnauthTicketStore.setState({ isPreventAutoscroll }); function sortMessagesByTime(ticket1: TicketMessage, ticket2: TicketMessage) { const date1 = new Date(ticket1.created_at).getTime(); const date2 = new Date(ticket2.created_at).getTime(); return date1 - date2; }