From c0098c095ec968bc61894c0e24d29518aafaa99a Mon Sep 17 00:00:00 2001 From: Piotr Gawron <p.gawron@atcomp.pl> Date: Thu, 23 May 2024 14:40:11 +0200 Subject: [PATCH] send error report to developers --- .../ErroReportModal.component.tsx | 9 +++++++++ src/redux/apiPath.ts | 1 + src/utils/error-report/sendErrorReport.ts | 20 +++++++++++++++++++ 3 files changed, 30 insertions(+) create mode 100644 src/utils/error-report/sendErrorReport.ts diff --git a/src/components/FunctionalArea/Modal/ErrorReportModal/ErroReportModal.component.tsx b/src/components/FunctionalArea/Modal/ErrorReportModal/ErroReportModal.component.tsx index 0263bfd6..bfc5c1bb 100644 --- a/src/components/FunctionalArea/Modal/ErrorReportModal/ErroReportModal.component.tsx +++ b/src/components/FunctionalArea/Modal/ErrorReportModal/ErroReportModal.component.tsx @@ -4,8 +4,13 @@ import { Button } from '@/shared/Button'; import { Input } from '@/shared/Input'; import React from 'react'; import { currentErrorDataSelector } from '@/redux/modal/modal.selector'; +import { sendReport } from '@/utils/error-report/sendErrorReport'; +import { ONE_THOUSAND } from '@/constants/common'; +import { useAppDispatch } from '@/redux/hooks/useAppDispatch'; +import { closeModal } from '@/redux/modal/modal.slice'; export const ErrorReportModal: React.FC = () => { + const dispatch = useAppDispatch(); const errorData = useAppSelector(currentErrorDataSelector); function getValue(nullableVale: string | null | undefined): string { @@ -24,6 +29,7 @@ export const ErrorReportModal: React.FC = () => { const stacktrace = getValue(errorData?.stacktrace); const version = getValue(errorData?.version); const message = getValue(errorData?.message); + const timestamp = errorData ? errorData.timestamp : Math.floor(+new Date() / ONE_THOUSAND); // eslint-disable-next-line @typescript-eslint/no-unused-vars const [errorDataToSend, setValue] = React.useState({ @@ -35,6 +41,7 @@ export const ErrorReportModal: React.FC = () => { javaStacktrace, stacktrace, version, + timestamp, message, }); @@ -63,6 +70,8 @@ export const ErrorReportModal: React.FC = () => { const handleSubmit = async (e: React.FormEvent<HTMLFormElement>): Promise<void> => { e.preventDefault(); + await dispatch(sendReport(errorDataToSend)); + dispatch(closeModal()); }; return ( diff --git a/src/redux/apiPath.ts b/src/redux/apiPath.ts index 0604e565..88149929 100644 --- a/src/redux/apiPath.ts +++ b/src/redux/apiPath.ts @@ -95,4 +95,5 @@ export const apiPath = { logout: (): string => `doLogout`, user: (login: string): string => `users/${login}`, getStacktrace: (code: string): string => `stacktrace/${code}`, + submitError: (): string => `minervanet/submitError`, }; diff --git a/src/utils/error-report/sendErrorReport.ts b/src/utils/error-report/sendErrorReport.ts new file mode 100644 index 00000000..6fa58821 --- /dev/null +++ b/src/utils/error-report/sendErrorReport.ts @@ -0,0 +1,20 @@ +import { axiosInstance } from '@/services/api/utils/axiosInstance'; +import { createAsyncThunk } from '@reduxjs/toolkit'; +import { Login } from '@/types/models'; +import { ErrorData } from '@/utils/error-report/ErrorData'; +import { apiPath } from '@/redux/apiPath'; +import { showToast } from '@/utils/showToast'; + +export const sendReport = createAsyncThunk('error/report', async (errorData: ErrorData) => { + try { + await axiosInstance.post<Login>(apiPath.submitError(), errorData); + showToast({ type: 'success', message: 'Error report sent successfully.' }); + } catch (error) { + // eslint-disable-next-line no-console + console.log(error); + showToast({ + type: 'error', + message: 'Unexpected error. More information can be found in the console.', + }); + } +}); -- GitLab