апи в ките
This commit is contained in:
parent
48ae1359ac
commit
572dfae016
@ -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 =
|
||||||
@ -122,7 +123,7 @@ export default () => {
|
|||||||
const message = parseAxiosError(error);
|
const message = parseAxiosError(error);
|
||||||
if (message) enqueueSnackbar(message);
|
if (message) enqueueSnackbar(message);
|
||||||
},
|
},
|
||||||
onFetchStateChange: () => {},
|
onFetchStateChange: () => { },
|
||||||
enabled: Boolean(user),
|
enabled: Boolean(user),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -196,21 +197,26 @@ export default () => {
|
|||||||
setSseEnabled(true);
|
setSseEnabled(true);
|
||||||
setIsMessageSending(true);
|
setIsMessageSending(true);
|
||||||
|
|
||||||
let successful = await selectSendingMethod({messageField});
|
let successful = await selectSendingMethod({ messageField });
|
||||||
|
|
||||||
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,
|
||||||
@ -42,7 +41,7 @@ const ACCEPT_SEND_FILE_TYPES_MAP = [
|
|||||||
".xlsx",
|
".xlsx",
|
||||||
".csv",
|
".csv",
|
||||||
] as const;
|
] as const;
|
||||||
export default ({ userId }:Props) => {
|
export default ({ userId }: Props) => {
|
||||||
const ticket = useTicketStore((state) => state[userId ? "authData" : "unauthData"]);
|
const ticket = useTicketStore((state) => state[userId ? "authData" : "unauthData"]);
|
||||||
|
|
||||||
const { isActiveSSETab, updateSSEValue } = useSSETab<TicketMessage[]>(
|
const { isActiveSSETab, updateSSEValue } = useSSETab<TicketMessage[]>(
|
||||||
@ -116,7 +115,7 @@ export default ({ userId }:Props) => {
|
|||||||
const message = parseAxiosError(error);
|
const message = parseAxiosError(error);
|
||||||
if (message) enqueueSnackbar(message);
|
if (message) enqueueSnackbar(message);
|
||||||
},
|
},
|
||||||
onFetchStateChange: () => {},
|
onFetchStateChange: () => { },
|
||||||
enabled: Boolean(userId),
|
enabled: Boolean(userId),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -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,16 +1,16 @@
|
|||||||
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;
|
||||||
isSnackbar?: boolean;
|
isSnackbar?: boolean;
|
||||||
systemError?: boolean;
|
systemError?: boolean;
|
||||||
|
|
||||||
}
|
}
|
||||||
export const selectSendingMethod = async ({messageField, isSnackbar = true, systemError = false}: SelectSendingMethod) => {
|
export const selectSendingMethod = async ({ messageField, isSnackbar = true, systemError = false }: SelectSendingMethod) => {
|
||||||
console.log("click")
|
console.log("click")
|
||||||
const user = useUserStore.getState().user?._id;
|
const user = useUserStore.getState().user?._id;
|
||||||
const ticket = useTicketStore.getState()[user ? "authData" : "unauthData"];
|
const ticket = useTicketStore.getState()[user ? "authData" : "unauthData"];
|
||||||
@ -18,19 +18,19 @@ export const selectSendingMethod = async ({messageField, isSnackbar = true, syst
|
|||||||
|
|
||||||
console.log("click 2")
|
console.log("click 2")
|
||||||
let successful = false;
|
let successful = false;
|
||||||
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"
|
||||||
|
Loading…
Reference in New Issue
Block a user