апи в ките
This commit is contained in:
parent
48ae1359ac
commit
572dfae016
@ -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),
|
||||
});
|
||||
|
||||
@ -192,25 +193,30 @@ export default () => {
|
||||
|
||||
const sendMessage = async (messageField: string) => {
|
||||
if (!messageField || ticket.isMessageSending) return false;
|
||||
|
||||
|
||||
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;
|
||||
|
||||
}
|
||||
export const selectSendingMethod = async ({messageField, isSnackbar = true, systemError = false}: SelectSendingMethod) => {
|
||||
console.log("click")
|
||||
messageField: string;
|
||||
isSnackbar?: boolean;
|
||||
systemError?: boolean;
|
||||
|
||||
}
|
||||
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"
|
||||
|
Loading…
Reference in New Issue
Block a user