апи в ките

This commit is contained in:
Nastya 2025-07-05 03:27:58 +03:00
parent 48ae1359ac
commit 572dfae016
8 changed files with 95 additions and 120 deletions

@ -6,7 +6,7 @@
"@craco/craco": "^7.0.0",
"@emotion/react": "^11.10.5",
"@emotion/styled": "^11.10.5",
"@frontend/kitui": "^1.0.108",
"@frontend/kitui": "^1.0.109",
"@frontend/squzanswerer": "^1.0.57",
"@mui/icons-material": "^5.10.14",
"@mui/material": "^5.10.14",

@ -15,47 +15,7 @@ type SendFileResponse = {
const API_URL = `${process.env.REACT_APP_DOMAIN}/heruvym/v1.0.0`;
export const sendTicketMessage = async (
ticketId: string,
message: string,
systemError: boolean
): Promise<[null, string?]> => {
try {
const sendTicketMessageResponse = await makeRequest<
SendTicketMessageRequest,
null
>({
url: `${API_URL}/send`,
method: "POST",
useToken: true,
body: { ticket: ticketId, message: message, lang: "ru", files: [], system: systemError },
});
return [sendTicketMessageResponse];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось отправить сообщение. ${error}`];
}
};
export const shownMessage = async (id: string): Promise<[null, string?]> => {
try {
const shownMessageResponse = await makeRequest<{ id: string }, null>({
url: `${API_URL}/shown`,
method: "POST",
useToken: true,
body: { id },
});
return [shownMessageResponse];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось прочесть сообщение. ${error}`];
}
};
export const sendFile = async (
ticketId: string,

@ -40,7 +40,7 @@ interface Props {
sx?: SxProps<Theme>;
onclickArrow?: () => void;
sendMessage: (a: string) => Promise<boolean>;
sendFile: (a: File | undefined) => Promise<true>;
sendFile: (a: File | undefined) => Promise<void>;
greetingMessage: TicketMessage;
}

@ -44,7 +44,7 @@ interface Props {
handleChatClickClose: () => void;
handleChatClickSwitch: () => void;
sendMessage: (a: string) => Promise<boolean>;
sendFile: (a: File | undefined) => Promise<true>;
sendFile: (a: File | undefined) => Promise<void>;
modalWarningType: string | null;
setModalWarningType: any;
greetingMessage: TicketMessage;

@ -1,13 +1,15 @@
import { useCallback, useEffect, useMemo, useState } from "react";
import {
TicketMessage,
createTicket,
shownMessage,
useSSESubscription,
useTicketMessages,
useTicketsFetcher,
sendFile as sf
} from "@frontend/kitui";
import FloatingSupportChat from "./FloatingSupportChat";
import { useUserStore } from "@root/user";
import { useCallback, useEffect, useMemo, useState } from "react";
import { sendTicketMessage, shownMessage } from "../../api/ticket";
import { useSSETab } from "../../utils/hooks/useSSETab";
import {
addOrUpdateUnauthMessages,
@ -21,7 +23,6 @@ import {
} from "@root/ticket";
import { enqueueSnackbar } from "notistack";
import { parseAxiosError } from "@utils/parse-error";
import { createTicket, sendFile as sendFileRequest } from "@api/ticket";
import { selectSendingMethod } from "./utils";
type ModalWarningType =
@ -75,7 +76,7 @@ export default () => {
const workingHoursMessage =
"Здравствуйте, задайте ваш вопрос и наш оператор вам ответит в течение 10 минут";
const offHoursMessage =
"Здравствуйте, задайте ваш вопрос и наш оператор вам ответит в течение 10 минут";
"Здравствуйте, задайте ваш вопрос и наш оператор вам ответит в течение 10 минут";
const date = new Date();
const currentHourUTC = date.getUTCHours();
const MscTime = 3; // Москва UTC+3;
@ -122,7 +123,7 @@ export default () => {
const message = parseAxiosError(error);
if (message) enqueueSnackbar(message);
},
onFetchStateChange: () => {},
onFetchStateChange: () => { },
enabled: Boolean(user),
});
@ -196,21 +197,26 @@ export default () => {
setSseEnabled(true);
setIsMessageSending(true);
let successful = await selectSendingMethod({messageField});
let successful = await selectSendingMethod({ messageField });
setIsMessageSending(false);
return successful;
};
const sendFile = async (file: File) => {
if (file === undefined) return true;
const sendFile = async (file: File | undefined): Promise<void> => {
if (file === undefined) return;
let ticketId = ticket.sessionData?.ticketId;
if (!ticket.sessionData?.ticketId) {
const [data, createError] = await createTicket("", Boolean(user));
const [data, createError] = await createTicket({
message: "",
useToken: Boolean(user),
systemError: false
});
ticketId = data?.Ticket;
if (createError || !data) {
enqueueSnackbar(createError);
enqueueSnackbar(`Не удалось создать диалог ${parseAxiosError(createError)}`);
return;
} else {
setTicketData({ ticketId: data.Ticket, sessionId: data.sess });
}
@ -219,15 +225,16 @@ export default () => {
}
if (ticketId !== undefined) {
if (file.size > MAX_FILE_SIZE) return setModalWarningType("errorSize");
const [_, sendFileError] = await sendFileRequest(ticketId, file);
if (sendFileError) {
enqueueSnackbar(sendFileError);
if (file.size > MAX_FILE_SIZE) {
setModalWarningType("errorSize");
return;
}
return true;
const [_, sendFileError] = await sf({ticketId, file});
if (sendFileError) {
enqueueSnackbar(`Не удалось отправить файл ${parseAxiosError(sendFileError)}`);
}
}
};

@ -1,7 +1,6 @@
import { sendTicketMessage, shownMessage } from "@/api/ticket";
import { useSSETab } from "@/utils/hooks/useSSETab";
import { parseAxiosError } from "@/utils/parse-error";
import { TicketMessage, createTicket, useSSESubscription, useTicketMessages, useTicketsFetcher, sendFile as sf } from "@frontend/kitui";
import { TicketMessage, createTicket, useSSESubscription, useTicketMessages, useTicketsFetcher, sendFile as sf, sendTicketMessage, shownMessage } from "@frontend/kitui";
import {
addOrUpdateUnauthMessages,
@ -17,7 +16,7 @@ import { enqueueSnackbar } from "notistack";
import { useCallback, useEffect, useMemo, useState } from "react";
interface Props {
userId?: string;
userId?: string;
}
@ -42,7 +41,7 @@ const ACCEPT_SEND_FILE_TYPES_MAP = [
".xlsx",
".csv",
] as const;
export default ({ userId }:Props) => {
export default ({ userId }: Props) => {
const ticket = useTicketStore((state) => state[userId ? "authData" : "unauthData"]);
const { isActiveSSETab, updateSSEValue } = useSSETab<TicketMessage[]>(
@ -69,7 +68,7 @@ export default ({ userId }:Props) => {
const workingHoursMessage =
"Здравствуйте, задайте ваш вопрос и наш оператор вам ответит в течение 10 минут";
const offHoursMessage =
"Здравствуйте, задайте ваш вопрос и наш оператор вам ответит в течение 10 минут";
"Здравствуйте, задайте ваш вопрос и наш оператор вам ответит в течение 10 минут";
const date = new Date();
const currentHourUTC = date.getUTCHours();
const MscTime = 3; // Москва UTC+3;
@ -116,7 +115,7 @@ export default ({ userId }:Props) => {
const message = parseAxiosError(error);
if (message) enqueueSnackbar(message);
},
onFetchStateChange: () => {},
onFetchStateChange: () => { },
enabled: Boolean(userId),
});
@ -190,15 +189,16 @@ export default ({ userId }:Props) => {
let successful = false;
setIsMessageSending(true);
if (!ticket.sessionData?.ticketId) {
const [data, createError] = await createTicket(
messageField,
Boolean(userId),
);
const [data, createError] = await createTicket({
message: messageField,
useToken: Boolean(userId),
systemError: false
});
if (createError || !data) {
successful = false;
enqueueSnackbar(createError);
enqueueSnackbar(`Не удалось создать чат ${(createError)}`);
} else {
successful = true;
@ -207,15 +207,16 @@ export default ({ userId }:Props) => {
setIsMessageSending(false);
} else {
const [_, sendTicketMessageError] = await sendTicketMessage(
ticket.sessionData?.ticketId,
messageField,
);
const [_, sendTicketMessageError] = await sendTicketMessage({
ticketId: ticket.sessionData?.ticketId,
message: messageField,
systemError: false
});
successful = true;
if (sendTicketMessageError) {
successful = false;
enqueueSnackbar(sendTicketMessageError);
enqueueSnackbar(`Ошибка отправки сообщения ${parseAxiosError(sendTicketMessageError)}`);
}
setIsMessageSending(false);
}
@ -227,11 +228,15 @@ export default ({ userId }:Props) => {
let ticketId = ticket.sessionData?.ticketId;
if (!ticket.sessionData?.ticketId) {
const [data, createError] = await createTicket("", Boolean(userId));
const [data, createError] = await createTicket({
message: "",
useToken: Boolean(userId),
systemError: false
});
ticketId = data?.Ticket;
if (createError || !data) {
enqueueSnackbar(createError);
enqueueSnackbar(`Не удалось создать диалог ${parseAxiosError(createError)}`);
} else {
setTicketData({ ticketId: data.Ticket, sessionId: data.sess });
}
@ -242,7 +247,10 @@ export default ({ userId }:Props) => {
if (ticketId !== undefined) {
if (file.size > MAX_FILE_SIZE) return setModalWarningType("errorSize");
const [_, sendFileError] = await sf(ticketId, file);
const [_, sendFileError] = await sf({
ticketId,
file
});
if (sendFileError) {
enqueueSnackbar(sendFileError);

@ -1,55 +1,55 @@
import { sendTicketMessage } from "@/api/ticket";
import { setTicketData, useTicketStore } from "@/stores/ticket";
import { useUserStore } from "@root/user";
import { createTicket, sendFile as sendFileRequest } from "@api/ticket";
import { enqueueSnackbar } from "notistack";
import { createTicket, sendTicketMessage } from "@frontend/kitui";
import { parseAxiosError } from "@/utils/parse-error";
interface SelectSendingMethod {
messageField: string;
isSnackbar?: boolean;
systemError?: boolean;
messageField: string;
isSnackbar?: boolean;
systemError?: boolean;
}
export const selectSendingMethod = async ({messageField, isSnackbar = true, systemError = false}: SelectSendingMethod) => {
console.log("click")
}
export const selectSendingMethod = async ({ messageField, isSnackbar = true, systemError = false }: SelectSendingMethod) => {
console.log("click")
const user = useUserStore.getState().user?._id;
const ticket = useTicketStore.getState()[user ? "authData" : "unauthData"];
console.log(ticket)
console.log("click 2")
let successful = false;
if (!(window.location.hostname == 'localhost' && systemError )) { //предупреждать о системных ошибках вне локалхост
if (!ticket.sessionData?.ticketId) {
console.log("autorisated 2")
const [data, createError] = await createTicket(
messageField,
Boolean(user),
false,
);
if (!(window.location.hostname == 'localhost' && systemError)) { //предупреждать о системных ошибках вне локалхост
if (!ticket.sessionData?.ticketId) {
console.log("autorisated 2")
const [data, createError] = await createTicket({
message: messageField,
useToken: Boolean(user),
systemError: false,
});
if (createError || !data) {
successful = false;
if (isSnackbar) enqueueSnackbar(createError);
} else {
successful = true;
setTicketData({ ticketId: data.Ticket, sessionId: data.sess });
}
if (createError || !data) {
successful = false;
if (isSnackbar) enqueueSnackbar(`Не удалось открыть диалог ${parseAxiosError(createError)}`);
} else {
const [_, sendTicketMessageError] = await sendTicketMessage(
ticket.sessionData?.ticketId,
messageField,
false,
);
successful = true;
if (sendTicketMessageError) {
successful = false;
if (isSnackbar) enqueueSnackbar(sendTicketMessageError);
}
setTicketData({ ticketId: data.Ticket, sessionId: data.sess });
}
}
} else {
const [_, sendTicketMessageError] = await sendTicketMessage({
ticketId: ticket.sessionData?.ticketId,
message: messageField,
systemError: false,
});
successful = true;
if (sendTicketMessageError) {
successful = false;
if (isSnackbar) enqueueSnackbar(sendTicketMessageError);
}
}
}
return successful;
}

@ -1443,10 +1443,10 @@
resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.9.tgz#50dea3616bc8191fb8e112283b49eaff03e78429"
integrity sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==
"@frontend/kitui@^1.0.108":
version "1.0.108"
resolved "http://gitea.pena/api/packages/skeris/npm/%40frontend%2Fkitui/-/1.0.108/kitui-1.0.108.tgz#1bb609dfe07668b6fd9a7b8618c229e0bb609f1e"
integrity sha512-4DiF7GHX0RbBMZpFioclc3B87N+HrGLv1B3DveUCdHzukfxvFXyEKnRZQ4wYljO2A3FLSD9+4Dr6cSuZYw95OQ==
"@frontend/kitui@^1.0.109":
version "1.0.109"
resolved "http://gitea.pena/api/packages/skeris/npm/%40frontend%2Fkitui/-/1.0.109/kitui-1.0.109.tgz#a9611e7b69dbd2bbc46e78c083d0442fc22bdcef"
integrity sha512-y6wzLDEWfTXMjL2gDucs/AzAc0fyh80aIbiokGz1ZgaHMR0XQhV2E/VqlUvK95VZRFO7UqnEaJofpY7iwSQjQA==
dependencies:
immer "^10.0.2"
reconnecting-eventsource "^1.6.2"