2023-04-13 16:48:17 +00:00
|
|
|
import { Ticket, TicketMessage } from "@root/model/ticket";
|
|
|
|
import { create } from "zustand";
|
|
|
|
import { createJSONStorage, devtools, persist } from "zustand/middleware";
|
|
|
|
|
|
|
|
|
|
|
|
interface UnauthTicketStore {
|
2023-05-03 09:54:04 +00:00
|
|
|
ticket: Ticket | null; // TODO delete if unused
|
2023-04-13 16:48:17 +00:00
|
|
|
sessionId: string | null;
|
|
|
|
messages: TicketMessage[];
|
|
|
|
fetchState: "idle" | "fetching" | "all fetched";
|
|
|
|
apiPage: number;
|
|
|
|
messagesPerPage: number;
|
|
|
|
}
|
|
|
|
|
|
|
|
export const useUnauthTicketStore = create<UnauthTicketStore>()(
|
|
|
|
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;
|
|
|
|
}
|