2024-03-06 11:13:28 +00:00
|
|
|
|
import { FetchState, TicketMessage } from "@frontend/kitui";
|
|
|
|
|
import { create } from "zustand";
|
|
|
|
|
import { createJSONStorage, devtools, persist } from "zustand/middleware";
|
|
|
|
|
import { useUserStore } from "./user";
|
|
|
|
|
import { produce } from "immer";
|
|
|
|
|
|
|
|
|
|
type SessionData = {
|
|
|
|
|
ticketId: string;
|
|
|
|
|
sessionId: string;
|
2024-03-09 21:01:57 +00:00
|
|
|
|
};
|
2024-03-06 11:13:28 +00:00
|
|
|
|
interface AuthData {
|
|
|
|
|
sessionData: SessionData | null;
|
|
|
|
|
isMessageSending: boolean;
|
|
|
|
|
messages: TicketMessage[];
|
|
|
|
|
apiPage: number;
|
|
|
|
|
messagesPerPage: number;
|
|
|
|
|
lastMessageId: string | undefined;
|
|
|
|
|
isPreventAutoscroll: boolean;
|
|
|
|
|
unauthTicketMessageFetchState: FetchState;
|
|
|
|
|
}
|
|
|
|
|
interface TicketStore {
|
|
|
|
|
unauthData: AuthData;
|
|
|
|
|
authData: AuthData;
|
|
|
|
|
}
|
|
|
|
|
const initAuthData = {
|
|
|
|
|
sessionData: null,
|
|
|
|
|
isMessageSending: false,
|
|
|
|
|
messages: [],
|
|
|
|
|
apiPage: 0,
|
|
|
|
|
messagesPerPage: 10,
|
|
|
|
|
lastMessageId: undefined,
|
|
|
|
|
isPreventAutoscroll: false,
|
|
|
|
|
unauthTicketMessageFetchState: "idle" as FetchState,
|
2024-03-09 21:01:57 +00:00
|
|
|
|
};
|
2024-03-06 11:13:28 +00:00
|
|
|
|
const initState = {
|
2024-03-09 21:01:57 +00:00
|
|
|
|
unauthData: initAuthData,
|
|
|
|
|
authData: initAuthData,
|
|
|
|
|
};
|
2024-03-06 11:13:28 +00:00
|
|
|
|
|
|
|
|
|
export const useTicketStore = create<TicketStore>()(
|
|
|
|
|
persist(
|
2024-03-09 21:01:57 +00:00
|
|
|
|
devtools((set, get) => initState, {
|
|
|
|
|
name: "Unauth tickets",
|
|
|
|
|
}),
|
2024-03-06 11:13:28 +00:00
|
|
|
|
{
|
|
|
|
|
version: 0,
|
|
|
|
|
name: "unauth-ticket",
|
|
|
|
|
storage: createJSONStorage(() => localStorage),
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
|
2024-03-09 21:01:57 +00:00
|
|
|
|
export const cleanAuthTicketData = () => {
|
|
|
|
|
useTicketStore.setState({ authData: initAuthData });
|
|
|
|
|
};
|
2024-03-06 11:13:28 +00:00
|
|
|
|
|
|
|
|
|
export const setTicketData = (sessionData: SessionData) =>
|
|
|
|
|
updateTicket((ticket) => {
|
2024-03-09 21:01:57 +00:00
|
|
|
|
ticket.sessionData = sessionData;
|
2024-03-06 11:13:28 +00:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
export const setIsMessageSending = (
|
|
|
|
|
isMessageSending: AuthData["isMessageSending"],
|
|
|
|
|
) =>
|
|
|
|
|
updateTicket((ticket) => {
|
2024-03-09 21:01:57 +00:00
|
|
|
|
ticket.isMessageSending = isMessageSending;
|
2024-03-06 11:13:28 +00:00
|
|
|
|
});
|
|
|
|
|
|
2024-03-09 21:01:57 +00:00
|
|
|
|
export const addOrUpdateUnauthMessages = (receivedMessages: TicketMessage[]) =>
|
|
|
|
|
updateTicket((ticket) => {
|
|
|
|
|
const filtered = filterMessageUncompleteness(receivedMessages);
|
|
|
|
|
console.log(filtered);
|
|
|
|
|
if (filtered.length === 0) return;
|
2024-03-06 11:13:28 +00:00
|
|
|
|
|
2024-03-09 21:01:57 +00:00
|
|
|
|
const messageIdToMessageMap: { [messageId: string]: TicketMessage } = {};
|
2024-03-06 11:13:28 +00:00
|
|
|
|
|
2024-03-09 21:01:57 +00:00
|
|
|
|
[...ticket.messages, ...filtered].forEach(
|
|
|
|
|
(message) => (messageIdToMessageMap[message.id] = message),
|
|
|
|
|
);
|
2024-03-06 11:13:28 +00:00
|
|
|
|
|
2024-03-09 21:01:57 +00:00
|
|
|
|
const sortedMessages = Object.values(messageIdToMessageMap).sort(
|
|
|
|
|
sortMessagesByTime,
|
|
|
|
|
);
|
2024-03-06 11:13:28 +00:00
|
|
|
|
|
2024-03-09 21:01:57 +00:00
|
|
|
|
ticket.messages = sortedMessages;
|
|
|
|
|
ticket.lastMessageId = sortedMessages.at(-1)?.id;
|
|
|
|
|
});
|
2024-03-06 11:13:28 +00:00
|
|
|
|
|
|
|
|
|
export const incrementUnauthMessageApiPage = () =>
|
|
|
|
|
updateTicket((ticket) => {
|
2024-03-09 21:01:57 +00:00
|
|
|
|
ticket.apiPage++;
|
2024-03-06 11:13:28 +00:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
export const setUnauthIsPreventAutoscroll = (isPreventAutoscroll: boolean) =>
|
|
|
|
|
updateTicket((ticket) => {
|
2024-03-09 21:01:57 +00:00
|
|
|
|
ticket.isPreventAutoscroll = isPreventAutoscroll;
|
2024-03-06 11:13:28 +00:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
export const setUnauthTicketMessageFetchState = (
|
|
|
|
|
unauthTicketMessageFetchState: FetchState,
|
2024-03-09 21:01:57 +00:00
|
|
|
|
) =>
|
|
|
|
|
updateTicket((ticket) => {
|
|
|
|
|
ticket.unauthTicketMessageFetchState = unauthTicketMessageFetchState;
|
|
|
|
|
});
|
2024-03-06 11:13:28 +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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function filterMessageUncompleteness(messages: TicketMessage[]) {
|
2024-03-09 21:01:57 +00:00
|
|
|
|
return messages.filter(
|
|
|
|
|
(message) =>
|
|
|
|
|
"id" in message &&
|
|
|
|
|
"ticket_id" in message &&
|
|
|
|
|
"user_id" in message &&
|
|
|
|
|
"session_id" in message &&
|
|
|
|
|
"message" in message &&
|
|
|
|
|
"files" in message &&
|
|
|
|
|
"shown" in message &&
|
|
|
|
|
"request_screenshot" in message &&
|
|
|
|
|
"created_at" in message &&
|
|
|
|
|
((message.files !== null && message.files.length > 0) ||
|
|
|
|
|
message.message.length > 0),
|
|
|
|
|
);
|
2024-03-06 11:13:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export const updateTicket = <T extends AuthData>(
|
|
|
|
|
recipe: (ticket: AuthData) => void,
|
|
|
|
|
) =>
|
|
|
|
|
setProducedState(
|
|
|
|
|
(state) => {
|
|
|
|
|
//В зависимости от авторизованности вызывается изменение разных объектов
|
|
|
|
|
if (Boolean(useUserStore.getState().userId)) {
|
|
|
|
|
recipe(state.authData);
|
|
|
|
|
} else {
|
|
|
|
|
recipe(state.unauthData);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
type: "updateTicket",
|
|
|
|
|
recipe,
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
function setProducedState<A extends string | { type: unknown }>(
|
|
|
|
|
recipe: (state: TicketStore) => void,
|
|
|
|
|
action?: A,
|
|
|
|
|
) {
|
|
|
|
|
useTicketStore.setState((state) => produce(state, recipe), false, action);
|
2024-03-09 21:01:57 +00:00
|
|
|
|
}
|