апи в ките

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", "@craco/craco": "^7.0.0",
"@emotion/react": "^11.10.5", "@emotion/react": "^11.10.5",
"@emotion/styled": "^11.10.5", "@emotion/styled": "^11.10.5",
"@frontend/kitui": "^1.0.108", "@frontend/kitui": "^1.0.109",
"@frontend/squzanswerer": "^1.0.57", "@frontend/squzanswerer": "^1.0.57",
"@mui/icons-material": "^5.10.14", "@mui/icons-material": "^5.10.14",
"@mui/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`; 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 ( export const sendFile = async (
ticketId: string, ticketId: string,

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

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

@ -1,13 +1,15 @@
import { useCallback, useEffect, useMemo, useState } from "react";
import { import {
TicketMessage, TicketMessage,
createTicket,
shownMessage,
useSSESubscription, useSSESubscription,
useTicketMessages, useTicketMessages,
useTicketsFetcher, useTicketsFetcher,
sendFile as sf
} from "@frontend/kitui"; } from "@frontend/kitui";
import FloatingSupportChat from "./FloatingSupportChat"; import FloatingSupportChat from "./FloatingSupportChat";
import { useUserStore } from "@root/user"; 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 { useSSETab } from "../../utils/hooks/useSSETab";
import { import {
addOrUpdateUnauthMessages, addOrUpdateUnauthMessages,
@ -21,7 +23,6 @@ import {
} from "@root/ticket"; } from "@root/ticket";
import { enqueueSnackbar } from "notistack"; import { enqueueSnackbar } from "notistack";
import { parseAxiosError } from "@utils/parse-error"; import { parseAxiosError } from "@utils/parse-error";
import { createTicket, sendFile as sendFileRequest } from "@api/ticket";
import { selectSendingMethod } from "./utils"; import { selectSendingMethod } from "./utils";
type ModalWarningType = type ModalWarningType =
@ -201,16 +202,21 @@ export default () => {
setIsMessageSending(false); setIsMessageSending(false);
return successful; return successful;
}; };
const sendFile = async (file: File) => { const sendFile = async (file: File | undefined): Promise<void> => {
if (file === undefined) return true; if (file === undefined) return;
let ticketId = ticket.sessionData?.ticketId; let ticketId = ticket.sessionData?.ticketId;
if (!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; ticketId = data?.Ticket;
if (createError || !data) { if (createError || !data) {
enqueueSnackbar(createError); enqueueSnackbar(`Не удалось создать диалог ${parseAxiosError(createError)}`);
return;
} else { } else {
setTicketData({ ticketId: data.Ticket, sessionId: data.sess }); setTicketData({ ticketId: data.Ticket, sessionId: data.sess });
} }
@ -219,15 +225,16 @@ export default () => {
} }
if (ticketId !== undefined) { if (ticketId !== undefined) {
if (file.size > MAX_FILE_SIZE) return setModalWarningType("errorSize"); if (file.size > MAX_FILE_SIZE) {
setModalWarningType("errorSize");
const [_, sendFileError] = await sendFileRequest(ticketId, file); return;
if (sendFileError) {
enqueueSnackbar(sendFileError);
} }
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 { useSSETab } from "@/utils/hooks/useSSETab";
import { parseAxiosError } from "@/utils/parse-error"; 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 { import {
addOrUpdateUnauthMessages, addOrUpdateUnauthMessages,
@ -190,15 +189,16 @@ export default ({ userId }:Props) => {
let successful = false; let successful = false;
setIsMessageSending(true); setIsMessageSending(true);
if (!ticket.sessionData?.ticketId) { if (!ticket.sessionData?.ticketId) {
const [data, createError] = await createTicket( const [data, createError] = await createTicket({
messageField, message: messageField,
Boolean(userId), useToken: Boolean(userId),
); systemError: false
});
if (createError || !data) { if (createError || !data) {
successful = false; successful = false;
enqueueSnackbar(createError); enqueueSnackbar(`Не удалось создать чат ${(createError)}`);
} else { } else {
successful = true; successful = true;
@ -207,15 +207,16 @@ export default ({ userId }:Props) => {
setIsMessageSending(false); setIsMessageSending(false);
} else { } else {
const [_, sendTicketMessageError] = await sendTicketMessage( const [_, sendTicketMessageError] = await sendTicketMessage({
ticket.sessionData?.ticketId, ticketId: ticket.sessionData?.ticketId,
messageField, message: messageField,
); systemError: false
});
successful = true; successful = true;
if (sendTicketMessageError) { if (sendTicketMessageError) {
successful = false; successful = false;
enqueueSnackbar(sendTicketMessageError); enqueueSnackbar(`Ошибка отправки сообщения ${parseAxiosError(sendTicketMessageError)}`);
} }
setIsMessageSending(false); setIsMessageSending(false);
} }
@ -227,11 +228,15 @@ export default ({ userId }:Props) => {
let ticketId = ticket.sessionData?.ticketId; let ticketId = ticket.sessionData?.ticketId;
if (!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; ticketId = data?.Ticket;
if (createError || !data) { if (createError || !data) {
enqueueSnackbar(createError); enqueueSnackbar(`Не удалось создать диалог ${parseAxiosError(createError)}`);
} else { } else {
setTicketData({ ticketId: data.Ticket, sessionId: data.sess }); setTicketData({ ticketId: data.Ticket, sessionId: data.sess });
} }
@ -242,7 +247,10 @@ export default ({ userId }:Props) => {
if (ticketId !== undefined) { if (ticketId !== undefined) {
if (file.size > MAX_FILE_SIZE) return setModalWarningType("errorSize"); if (file.size > MAX_FILE_SIZE) return setModalWarningType("errorSize");
const [_, sendFileError] = await sf(ticketId, file); const [_, sendFileError] = await sf({
ticketId,
file
});
if (sendFileError) { if (sendFileError) {
enqueueSnackbar(sendFileError); enqueueSnackbar(sendFileError);

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

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