frontPanel/src/stores/unauthTicket.ts
2024-02-06 17:39:02 +03:00

92 lines
2.6 KiB
TypeScript

import { FetchState, TicketMessage } from "@frontend/kitui";
import { create } from "zustand";
import { createJSONStorage, devtools, persist } from "zustand/middleware";
interface UnauthTicketStore {
sessionData: {
ticketId: string;
sessionId: string;
} | null;
isMessageSending: boolean;
messages: TicketMessage[];
apiPage: number;
messagesPerPage: number;
lastMessageId: string | undefined;
isPreventAutoscroll: boolean;
unauthTicketMessageFetchState: FetchState;
}
export const useUnauthTicketStore = create<UnauthTicketStore>()(
persist(
devtools(
(set, get) => ({
sessionData: null,
isMessageSending: false,
messages: [],
apiPage: 0,
messagesPerPage: 10,
lastMessageId: undefined,
isPreventAutoscroll: false,
unauthTicketMessageFetchState: "idle",
}),
{
name: "Unauth tickets",
},
),
{
version: 0,
name: "unauth-ticket",
storage: createJSONStorage(() => localStorage),
partialize: (state) => ({
sessionData: state.sessionData,
}),
},
),
);
export const setUnauthSessionData = (
sessionData: UnauthTicketStore["sessionData"],
) => useUnauthTicketStore.setState({ sessionData });
export const setIsMessageSending = (
isMessageSending: UnauthTicketStore["isMessageSending"],
) => useUnauthTicketStore.setState({ isMessageSending });
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 incrementUnauthMessageApiPage = () => {
const state = useUnauthTicketStore.getState();
useUnauthTicketStore.setState({ apiPage: state.apiPage + 1 });
};
export const setUnauthIsPreventAutoscroll = (isPreventAutoscroll: boolean) =>
useUnauthTicketStore.setState({ isPreventAutoscroll });
export const setUnauthTicketMessageFetchState = (
unauthTicketMessageFetchState: FetchState,
) => useUnauthTicketStore.setState({ unauthTicketMessageFetchState });
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;
}