front-hub/src/stores/unauthTicket.ts

75 lines
2.5 KiB
TypeScript
Raw Normal View History

2023-06-06 13:13:58 +00:00
import { TicketMessage } from "@frontend/kitui";
2023-04-13 16:48:17 +00:00
import { create } from "zustand";
import { createJSONStorage, devtools, persist } from "zustand/middleware";
interface UnauthTicketStore {
2023-05-03 16:24:15 +00:00
sessionData: {
ticketId: string;
sessionId: string;
} | null;
2023-05-23 12:49:51 +00:00
isMessageSending: boolean;
2023-04-13 16:48:17 +00:00
messages: TicketMessage[];
apiPage: number;
messagesPerPage: number;
2023-05-03 16:24:15 +00:00
lastMessageId: string | undefined;
isPreventAutoscroll: boolean;
2023-04-13 16:48:17 +00:00
}
export const useUnauthTicketStore = create<UnauthTicketStore>()(
persist(
devtools(
(set, get) => ({
2023-05-03 16:24:15 +00:00
sessionData: null,
2023-05-23 12:49:51 +00:00
isMessageSending: false,
2023-04-13 16:48:17 +00:00
messages: [],
apiPage: 0,
messagesPerPage: 10,
2023-05-03 16:24:15 +00:00
lastMessageId: undefined,
isPreventAutoscroll: false,
2023-04-13 16:48:17 +00:00
}),
{
2023-06-30 15:28:10 +00:00
name: "Unauth tickets"
2023-04-13 16:48:17 +00:00
}
),
{
version: 0,
2023-05-03 16:24:15 +00:00
name: "unauth-ticket",
2023-04-13 16:48:17 +00:00
storage: createJSONStorage(() => localStorage),
partialize: state => ({
2023-05-03 16:24:15 +00:00
sessionData: state.sessionData,
2023-04-13 16:48:17 +00:00
})
}
)
);
2023-05-03 16:24:15 +00:00
export const setUnauthSessionData = (sessionData: UnauthTicketStore["sessionData"]) => useUnauthTicketStore.setState({ sessionData });
2023-05-23 12:49:51 +00:00
export const setIsMessageSending = (isMessageSending: UnauthTicketStore["isMessageSending"]) => useUnauthTicketStore.setState({ isMessageSending });
2023-04-13 16:48:17 +00:00
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);
2023-05-03 16:24:15 +00:00
useUnauthTicketStore.setState({
messages: sortedMessages,
lastMessageId: sortedMessages.at(-1)?.id,
});
2023-04-13 16:48:17 +00:00
};
export const incrementUnauthMessageApiPage = () => {
const state = useUnauthTicketStore.getState();
useUnauthTicketStore.setState({ apiPage: state.apiPage + 1 });
};
2023-05-03 16:24:15 +00:00
export const setUnauthIsPreventAutoscroll = (isPreventAutoscroll: boolean) => useUnauthTicketStore.setState({ isPreventAutoscroll });
2023-04-13 16:48:17 +00:00
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;
}