import { Ticket, TicketMessage } from "@root/model/ticket"; import { create } from "zustand"; import { createJSONStorage, devtools, persist } from "zustand/middleware"; interface UnauthTicketStore { ticket: Ticket | null; // TODO delete if unused sessionId: string | null; messages: TicketMessage[]; fetchState: "idle" | "fetching" | "all fetched"; apiPage: number; messagesPerPage: number; } export const useUnauthTicketStore = create()( persist( devtools( (set, get) => ({ ticket: null, sessionId: null, messages: [], fetchState: "idle", apiPage: 0, messagesPerPage: 10, }), { name: "Unauth ticket store" } ), { version: 0, name: "session", storage: createJSONStorage(() => localStorage), partialize: state => ({ sessionId: state.sessionId, }) } ) ); export const setUnauthTicket = (ticket: Ticket) => useUnauthTicketStore.setState({ ticket }); 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 }); }; export const clearUnauthTicketState = () => useUnauthTicketStore.setState({ ticket: null, messages: [], apiPage: 0, fetchState: "idle", }); export const setUnauthTicketFetchState = (fetchState: UnauthTicketStore["fetchState"]) => useUnauthTicketStore.setState({ fetchState }); export const incrementUnauthMessageApiPage = () => { const state = useUnauthTicketStore.getState(); useUnauthTicketStore.setState({ apiPage: state.apiPage + 1 }); }; export const setUnauthTicketSessionId = (sessionId: string | null) => useUnauthTicketStore.setState({ sessionId }); 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; }