front-hub/src/stores/unauthTicket.ts

75 lines
2.4 KiB
TypeScript
Raw Normal View History

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;
}