diff --git a/package.json b/package.json index 5f34f899..40c62754 100755 --- a/package.json +++ b/package.json @@ -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", diff --git a/src/api/ticket.ts b/src/api/ticket.ts index 5056dc64..44a1d393 100644 --- a/src/api/ticket.ts +++ b/src/api/ticket.ts @@ -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, diff --git a/src/ui_kit/FloatingSupportChat/Chat.tsx b/src/ui_kit/FloatingSupportChat/Chat.tsx index 28e17676..7ce80acd 100644 --- a/src/ui_kit/FloatingSupportChat/Chat.tsx +++ b/src/ui_kit/FloatingSupportChat/Chat.tsx @@ -40,7 +40,7 @@ interface Props { sx?: SxProps; onclickArrow?: () => void; sendMessage: (a: string) => Promise; - sendFile: (a: File | undefined) => Promise; + sendFile: (a: File | undefined) => Promise; greetingMessage: TicketMessage; } diff --git a/src/ui_kit/FloatingSupportChat/FloatingSupportChat.tsx b/src/ui_kit/FloatingSupportChat/FloatingSupportChat.tsx index c59aa418..1ee0ba3e 100644 --- a/src/ui_kit/FloatingSupportChat/FloatingSupportChat.tsx +++ b/src/ui_kit/FloatingSupportChat/FloatingSupportChat.tsx @@ -44,7 +44,7 @@ interface Props { handleChatClickClose: () => void; handleChatClickSwitch: () => void; sendMessage: (a: string) => Promise; - sendFile: (a: File | undefined) => Promise; + sendFile: (a: File | undefined) => Promise; modalWarningType: string | null; setModalWarningType: any; greetingMessage: TicketMessage; diff --git a/src/ui_kit/FloatingSupportChat/index.tsx b/src/ui_kit/FloatingSupportChat/index.tsx index eb17a552..6b9e8c92 100644 --- a/src/ui_kit/FloatingSupportChat/index.tsx +++ b/src/ui_kit/FloatingSupportChat/index.tsx @@ -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 => { + 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)}`); + } } }; diff --git a/src/ui_kit/FloatingSupportChat/useTechnicalSupport.ts b/src/ui_kit/FloatingSupportChat/useTechnicalSupport.ts index 21430c7e..e9f42cbe 100644 --- a/src/ui_kit/FloatingSupportChat/useTechnicalSupport.ts +++ b/src/ui_kit/FloatingSupportChat/useTechnicalSupport.ts @@ -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( @@ -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); diff --git a/src/ui_kit/FloatingSupportChat/utils.ts b/src/ui_kit/FloatingSupportChat/utils.ts index a603e348..87d80ca6 100644 --- a/src/ui_kit/FloatingSupportChat/utils.ts +++ b/src/ui_kit/FloatingSupportChat/utils.ts @@ -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; } \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 00050294..8ed63d0c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -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"