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