diff --git a/frontend/src/libs/index.ts b/frontend/src/libs/index.ts index b1a4bdae9..46d80814e 100644 --- a/frontend/src/libs/index.ts +++ b/frontend/src/libs/index.ts @@ -1,11 +1,9 @@ export { default as isErrorWithMessage, - isErrorWithError, - isRequestErrorWithDetail, - isRequestFormErrors, - isRequestFormFieldError, - isRequestFormErrors2, -} from './isErrorWithMessage'; + isResponseServerFormFieldError, + isResponseServerError, + getServerError, +} from './serverErrors'; import { format, formatDistanceToNowStrict } from 'date-fns'; // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/frontend/src/libs/isErrorWithMessage.ts b/frontend/src/libs/isErrorWithMessage.ts deleted file mode 100644 index 84dd270a3..000000000 --- a/frontend/src/libs/isErrorWithMessage.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { isArray } from 'lodash'; - -import { FormErrors, FormErrors2, FormFieldError, RequestErrorWithDetail } from './types'; - -export default function isErrorWithMessage(error: unknown): error is { data: { message: string } } { - return ( - typeof error === 'object' && - error !== null && - 'data' in error && - // eslint-disable-next-line @typescript-eslint/no-explicit-any - typeof ((error as any).data as any)?.message === 'string' - ); -} - -export function isErrorWithError(error: unknown): error is { data: { error: string } } { - return ( - typeof error === 'object' && - error !== null && - 'data' in error && - // eslint-disable-next-line @typescript-eslint/no-explicit-any - typeof ((error as any).data as any)?.error === 'string' - ); -} - -export function isRequestFormFieldError(fieldError: unknown): fieldError is FormFieldError { - return ( - typeof fieldError === 'object' && - fieldError !== null && - fieldError !== undefined && - 'loc' in fieldError && - 'msg' in fieldError && - isArray(fieldError?.loc) && - typeof fieldError?.msg === 'string' - ); -} - -export function isRequestErrorWithDetail(requestError: unknown): requestError is RequestErrorWithDetail { - return ( - typeof requestError === 'object' && - requestError !== null && - requestError !== undefined && - 'detail' in requestError && - typeof requestError?.detail === 'string' - ); -} - -export function isRequestFormErrors(formErrors: unknown): formErrors is FormErrors { - return ( - typeof formErrors === 'object' && - formErrors !== null && - formErrors !== undefined && - 'detail' in formErrors && - isArray(formErrors?.detail) && - isRequestFormFieldError(formErrors.detail[0]) - ); -} - -export function isRequestFormErrors2(formErrors: unknown): formErrors is FormErrors2 { - return ( - typeof formErrors === 'object' && - formErrors !== null && - formErrors !== undefined && - 'detail' in formErrors && - isArray(formErrors?.detail) && - !!formErrors.detail.length && - 'msg' in formErrors.detail[0] - ); -} diff --git a/frontend/src/libs/serverErrors.ts b/frontend/src/libs/serverErrors.ts new file mode 100644 index 000000000..90e9d0c9b --- /dev/null +++ b/frontend/src/libs/serverErrors.ts @@ -0,0 +1,51 @@ +import { isArray } from 'lodash'; + +import { FormFieldError, ResponseServerError } from './types'; + +export default function serverErrors(error: unknown): error is { data: { message: string } } { + return ( + typeof error === 'object' && + error !== null && + 'data' in error && + // eslint-disable-next-line @typescript-eslint/no-explicit-any + typeof ((error as any).data as any)?.message === 'string' + ); +} + +export function isResponseServerFormFieldError(fieldError: unknown): fieldError is FormFieldError { + return ( + typeof fieldError === 'object' && + fieldError !== null && + fieldError !== undefined && + 'loc' in fieldError && + 'msg' in fieldError && + isArray(fieldError?.loc) && + typeof fieldError?.msg === 'string' + ); +} + +export function isResponseServerError(formErrors: unknown): formErrors is ResponseServerError { + return ( + typeof formErrors === 'object' && + formErrors !== null && + formErrors !== undefined && + 'detail' in formErrors && + isArray(formErrors?.detail) && + !!formErrors.detail.length && + 'msg' in formErrors.detail[0] + ); +} + +export function getServerError(error: any): string { + let errorText = error?.error; + + const errorData = error.data; + + if (isResponseServerError(errorData)) { + const errorDetail = errorData.detail; + + errorText = errorDetail.flatMap(({ msg }) => msg).join(', '); + } + + return errorText; +} diff --git a/frontend/src/libs/types.ts b/frontend/src/libs/types.ts index b6a574714..22b1d14c2 100644 --- a/frontend/src/libs/types.ts +++ b/frontend/src/libs/types.ts @@ -5,19 +5,11 @@ export type FormFieldError = { code: string; }; -export type FormError = { +export type ResponseServerErrorItem = { msg: string; code: string; }; -export type FormErrors = { - detail: FormFieldError[]; -}; - -export type FormErrors2 = { - detail: (FormFieldError | FormError)[]; -}; - -export type RequestErrorWithDetail = { - detail: string; +export type ResponseServerError = { + detail: (FormFieldError | ResponseServerErrorItem)[]; }; diff --git a/frontend/src/pages/Fleets/List/useDeleteFleet.ts b/frontend/src/pages/Fleets/List/useDeleteFleet.ts index e4c293486..7e38dd277 100644 --- a/frontend/src/pages/Fleets/List/useDeleteFleet.ts +++ b/frontend/src/pages/Fleets/List/useDeleteFleet.ts @@ -2,7 +2,7 @@ import { useCallback, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useNotifications } from 'hooks'; -import { isRequestFormErrors2 } from 'libs'; +import { getServerError } from 'libs'; import { useDeleteFleetMutation } from 'services/fleet'; export const useDeleteFleet = () => { @@ -40,19 +40,9 @@ export const useDeleteFleet = () => { return Promise.all(requests) .finally(() => setIsDeleting(false)) .catch((error) => { - let errorText = error?.error; - - const errorData = error.data; - - if (isRequestFormErrors2(errorData)) { - const errorDetail = errorData.detail; - - errorText = errorDetail.flatMap(({ msg }) => msg).join(', '); - } - pushNotification({ type: 'error', - content: t('common.server_error', { error: errorText }), + content: t('common.server_error', { error: getServerError(error) }), }); }); }, []); diff --git a/frontend/src/pages/Instances/List/hooks/useActions.ts b/frontend/src/pages/Instances/List/hooks/useActions.ts index 55a70825f..619bdbae5 100644 --- a/frontend/src/pages/Instances/List/hooks/useActions.ts +++ b/frontend/src/pages/Instances/List/hooks/useActions.ts @@ -2,10 +2,9 @@ import { useCallback, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useNotifications } from 'hooks'; +import { getServerError } from 'libs'; import { useDeleteInstancesMutation } from 'services/instance'; -import { isRequestFormErrors2 } from '../../../../libs'; - export const useActions = () => { const { t } = useTranslation(); const [deleteInstances] = useDeleteInstancesMutation(); @@ -46,19 +45,9 @@ export const useActions = () => { return Promise.all(requests) .finally(() => setIsDeleting(false)) .catch((error) => { - let errorText = error?.error; - - const errorData = error.data; - - if (isRequestFormErrors2(errorData)) { - const errorDetail = errorData.detail; - - errorText = errorDetail.flatMap(({ msg }) => msg).join(', '); - } - pushNotification({ type: 'error', - content: t('common.server_error', { error: errorText }), + content: t('common.server_error', { error: getServerError(error) }), }); }); }, []); diff --git a/frontend/src/pages/Project/Add/index.tsx b/frontend/src/pages/Project/Add/index.tsx index 86c5db582..00c6ee47d 100644 --- a/frontend/src/pages/Project/Add/index.tsx +++ b/frontend/src/pages/Project/Add/index.tsx @@ -5,6 +5,7 @@ import { useNavigate } from 'react-router-dom'; import { ContentLayout, Header } from 'components'; import { useBreadcrumbs, useNotifications } from 'hooks'; +import { getServerError } from 'libs'; import { ROUTES } from 'routes'; import { useCreateProjectMutation } from 'services/project'; @@ -43,7 +44,12 @@ export const ProjectAdd: React.FC = () => { navigate(ROUTES.PROJECT.DETAILS.SETTINGS.FORMAT(data.project_name)); }) - .catch((error) => console.log(error)); + .catch((error) => { + pushNotification({ + type: 'error', + content: t('common.server_error', { error: getServerError(error) }), + }); + }); return request; }; diff --git a/frontend/src/pages/Project/Backends/Add/index.tsx b/frontend/src/pages/Project/Backends/Add/index.tsx index 5948c746a..611b76d6d 100644 --- a/frontend/src/pages/Project/Backends/Add/index.tsx +++ b/frontend/src/pages/Project/Backends/Add/index.tsx @@ -5,6 +5,7 @@ import { useNavigate, useParams } from 'react-router-dom'; import { Container, Header } from 'components'; import { useBreadcrumbs, useNotifications } from 'hooks'; +import { getServerError } from 'libs'; import { ROUTES } from 'routes'; import { // useCreateBackendMutation, @@ -85,8 +86,11 @@ export const BackendAdd: React.FC = () => { navigate(ROUTES.PROJECT.DETAILS.SETTINGS.FORMAT(paramProjectName)); }) - .catch((error: never) => { - console.log(error); + .catch((error) => { + pushNotification({ + type: 'error', + content: t('common.server_error', { error: getServerError(error) }), + }); }); return request; diff --git a/frontend/src/pages/Project/Backends/Edit/index.tsx b/frontend/src/pages/Project/Backends/Edit/index.tsx index 2ae3beb16..10912b4be 100644 --- a/frontend/src/pages/Project/Backends/Edit/index.tsx +++ b/frontend/src/pages/Project/Backends/Edit/index.tsx @@ -6,6 +6,7 @@ import { pick } from 'lodash'; import { Container, Header, Loader } from 'components'; import { useBreadcrumbs, useNotifications } from 'hooks'; +import { getServerError } from 'libs'; import { ROUTES } from 'routes'; import { // useGetBackendConfigQuery, @@ -100,7 +101,12 @@ export const BackendEdit: React.FC = () => { content: t('backend.edit.success_notification'), }); }) - .catch(console.log); + .catch((error) => { + pushNotification({ + type: 'error', + content: t('common.server_error', { error: getServerError(error) }), + }); + }); return request; }; diff --git a/frontend/src/pages/Project/Backends/Form/AWS/index.tsx b/frontend/src/pages/Project/Backends/Form/AWS/index.tsx index 8f8a3e22a..b2f8e2bf5 100644 --- a/frontend/src/pages/Project/Backends/Form/AWS/index.tsx +++ b/frontend/src/pages/Project/Backends/Form/AWS/index.tsx @@ -7,7 +7,7 @@ import { FormInput, FormMultiselect, FormMultiselectOptions, FormSelect, InfoLin import { useHelpPanel, useNotifications } from 'hooks'; import useIsMounted from 'hooks/useIsMounted'; -import { isRequestFormErrors2, isRequestFormFieldError } from 'libs'; +import { isResponseServerError, isResponseServerFormFieldError } from 'libs'; import { useBackendValuesMutation } from 'services/backend'; import { AWSCredentialTypeEnum } from 'types'; @@ -94,9 +94,9 @@ export const AWSBackend: React.FC = ({ loading }) => { // @ts-ignore const errorRequestData = errorResponse?.data; - if (isRequestFormErrors2(errorRequestData)) { + if (isResponseServerError(errorRequestData)) { errorRequestData.detail.forEach((error) => { - if (isRequestFormFieldError(error)) { + if (isResponseServerFormFieldError(error)) { setError(error.loc.join('.'), { type: 'custom', message: error.msg }); } else { pushNotification({ diff --git a/frontend/src/pages/Project/Backends/Form/Azure/index.tsx b/frontend/src/pages/Project/Backends/Form/Azure/index.tsx index c32939cb2..86e6e5547 100644 --- a/frontend/src/pages/Project/Backends/Form/Azure/index.tsx +++ b/frontend/src/pages/Project/Backends/Form/Azure/index.tsx @@ -16,7 +16,7 @@ import { import { useHelpPanel, useNotifications } from 'hooks'; import useIsMounted from 'hooks/useIsMounted'; -import { isRequestFormErrors2, isRequestFormFieldError } from 'libs'; +import { isResponseServerError, isResponseServerFormFieldError } from 'libs'; import { useBackendValuesMutation } from 'services/backend'; import { AzureCredentialTypeEnum } from 'types'; @@ -117,9 +117,9 @@ export const AzureBackend: React.FC = ({ loading }) => { // @ts-ignore const errorRequestData = errorResponse?.data; - if (isRequestFormErrors2(errorRequestData)) { + if (isResponseServerError(errorRequestData)) { errorRequestData.detail.forEach((error) => { - if (isRequestFormFieldError(error)) { + if (isResponseServerFormFieldError(error)) { setError(error.loc.join('.'), { type: 'custom', message: error.msg }); } else { pushNotification({ diff --git a/frontend/src/pages/Project/Backends/Form/GCP/index.tsx b/frontend/src/pages/Project/Backends/Form/GCP/index.tsx index 304b0c654..fd9f25f7f 100644 --- a/frontend/src/pages/Project/Backends/Form/GCP/index.tsx +++ b/frontend/src/pages/Project/Backends/Form/GCP/index.tsx @@ -15,7 +15,7 @@ import { import { useHelpPanel, useNotifications } from 'hooks'; import useIsMounted from 'hooks/useIsMounted'; -import { isRequestFormErrors2, isRequestFormFieldError } from 'libs'; +import { isResponseServerError, isResponseServerFormFieldError } from 'libs'; import { useBackendValuesMutation } from 'services/backend'; import { GCPCredentialTypeEnum } from 'types'; @@ -115,9 +115,9 @@ export const GCPBackend: React.FC = ({ loading }) => { // @ts-ignore const errorRequestData = errorResponse?.data; - if (isRequestFormErrors2(errorRequestData)) { + if (isResponseServerError(errorRequestData)) { errorRequestData.detail.forEach((error) => { - if (isRequestFormFieldError(error)) { + if (isResponseServerFormFieldError(error)) { if (error.loc.length === 1 && error.loc[0] === 'credentials') { setError(FIELD_NAMES.CREDENTIALS.TYPE, { type: 'custom', message: error.msg }); } else { diff --git a/frontend/src/pages/Project/Backends/Form/Lambda/index.tsx b/frontend/src/pages/Project/Backends/Form/Lambda/index.tsx index 202c61202..db4eb0888 100644 --- a/frontend/src/pages/Project/Backends/Form/Lambda/index.tsx +++ b/frontend/src/pages/Project/Backends/Form/Lambda/index.tsx @@ -7,7 +7,7 @@ import { FormInput, FormMultiselect, FormMultiselectOptions, InfoLink, SpaceBetw import { useHelpPanel, useNotifications } from 'hooks'; import useIsMounted from 'hooks/useIsMounted'; -import { isRequestFormErrors2, isRequestFormFieldError } from 'libs'; +import { isResponseServerError, isResponseServerFormFieldError } from 'libs'; import { useBackendValuesMutation } from 'services/backend'; import { API_KEY_HELP, FIELD_NAMES, REGIONS_HELP } from './constants'; @@ -66,9 +66,9 @@ export const LambdaBackend: React.FC = ({ loading }) => { // @ts-ignore const errorRequestData = errorResponse?.data; - if (isRequestFormErrors2(errorRequestData)) { + if (isResponseServerError(errorRequestData)) { errorRequestData.detail.forEach((error) => { - if (isRequestFormFieldError(error)) { + if (isResponseServerFormFieldError(error)) { setError(error.loc.join('.'), { type: 'custom', message: error.msg }); } else { pushNotification({ diff --git a/frontend/src/pages/Project/Backends/Form/index.tsx b/frontend/src/pages/Project/Backends/Form/index.tsx index b91d50195..bfbf5c0f9 100644 --- a/frontend/src/pages/Project/Backends/Form/index.tsx +++ b/frontend/src/pages/Project/Backends/Form/index.tsx @@ -5,7 +5,7 @@ import { useTranslation } from 'react-i18next'; import { Alert, Button, FormField, FormTiles, FormUI, Grid, InfoLink, SpaceBetween, TilesProps } from 'components'; import { useHelpPanel, useNotifications } from 'hooks'; -import { isRequestFormErrors2, isRequestFormFieldError } from 'libs'; +import { isResponseServerError, isResponseServerFormFieldError } from 'libs'; import { useGetBackendTypesQuery } from 'services/backend'; import { AWSBackend } from './AWS'; @@ -63,9 +63,9 @@ export const BackendForm: React.FC = ({ initialValues, onCancel, loading onSubmitProp(data).catch((errorResponse) => { const errorRequestData = errorResponse?.data; - if (isRequestFormErrors2(errorRequestData)) { + if (isResponseServerError(errorRequestData)) { errorRequestData.detail.forEach((error) => { - if (isRequestFormFieldError(error)) { + if (isResponseServerFormFieldError(error)) { setError(error.loc.join('.') as FieldPath, { type: 'custom', message: error.msg }); } else { pushNotification({ diff --git a/frontend/src/pages/Project/Backends/YAMLForm/index.tsx b/frontend/src/pages/Project/Backends/YAMLForm/index.tsx index e5da1009c..e5ebc10a7 100644 --- a/frontend/src/pages/Project/Backends/YAMLForm/index.tsx +++ b/frontend/src/pages/Project/Backends/YAMLForm/index.tsx @@ -5,7 +5,7 @@ import { useTranslation } from 'react-i18next'; import { Button, FormCodeEditor, FormUI, InfoLink, SpaceBetween } from 'components'; import { useHelpPanel, useNotifications } from 'hooks'; -import { isRequestFormErrors2, isRequestFormFieldError } from 'libs'; +import { isResponseServerError, isResponseServerFormFieldError } from 'libs'; import { CONFIG_YAML_HELP_ENTERPRISE, CONFIG_YAML_HELP_SKY } from './constants'; @@ -47,9 +47,9 @@ export const YAMLForm: React.FC = ({ .catch((errorResponse) => { const errorRequestData = errorResponse?.data; - if (isRequestFormErrors2(errorRequestData)) { + if (isResponseServerError(errorRequestData)) { errorRequestData.detail.forEach((error) => { - if (isRequestFormFieldError(error)) { + if (isResponseServerFormFieldError(error)) { setError(error.loc.join('.') as FieldPath, { type: 'custom', message: error.msg, diff --git a/frontend/src/pages/Project/Backends/hooks/useBackendsTable.ts b/frontend/src/pages/Project/Backends/hooks/useBackendsTable.ts index 12c644736..c43b2d12d 100644 --- a/frontend/src/pages/Project/Backends/hooks/useBackendsTable.ts +++ b/frontend/src/pages/Project/Backends/hooks/useBackendsTable.ts @@ -1,11 +1,16 @@ +import { useTranslation } from 'react-i18next'; import { useNavigate } from 'react-router-dom'; +import { useNotifications } from 'hooks'; +import { getServerError } from 'libs'; import { ROUTES } from 'routes'; import { useDeleteProjectBackendMutation } from 'services/backend'; export const useBackendsTable = (projectName: IProject['project_name'], backends: IProject['backends']) => { + const { t } = useTranslation(); const navigate = useNavigate(); const [deleteBackendRequest, { isLoading: isDeleting }] = useDeleteProjectBackendMutation(); + const [pushNotification] = useNotifications(); const editBackend = (backend: IProjectBackend) => { navigate(ROUTES.PROJECT.BACKEND.EDIT.FORMAT(projectName, backend.name)); @@ -15,7 +20,14 @@ export const useBackendsTable = (projectName: IProject['project_name'], backends deleteBackendRequest({ projectName, backends_names: backends.map((backend) => backend.name), - }); + }) + .unwrap() + .catch((error) => { + pushNotification({ + type: 'error', + content: t('common.server_error', { error: getServerError(error) }), + }); + }); }; const addBackend = () => { diff --git a/frontend/src/pages/Project/Form/index.tsx b/frontend/src/pages/Project/Form/index.tsx index 9e4127e74..5103676c8 100644 --- a/frontend/src/pages/Project/Form/index.tsx +++ b/frontend/src/pages/Project/Form/index.tsx @@ -5,7 +5,7 @@ import { useTranslation } from 'react-i18next'; import { Button, Container, FormInput, FormUI, Header, SpaceBetween } from 'components'; import { useNotifications } from 'hooks'; -import { isRequestFormErrors2, isRequestFormFieldError } from 'libs'; +import { isResponseServerError, isResponseServerFormFieldError } from 'libs'; import { IProps } from './types'; import { FieldPath } from 'react-hook-form/dist/types/path'; @@ -28,9 +28,9 @@ export const ProjectForm: React.FC = ({ initialValues, onCancel, loading onSubmitProp(data).catch((errorResponse) => { const errorRequestData = errorResponse?.data; - if (isRequestFormErrors2(errorRequestData)) { + if (isResponseServerError(errorRequestData)) { errorRequestData.detail.forEach((error) => { - if (isRequestFormFieldError(error)) { + if (isResponseServerFormFieldError(error)) { setError(error.loc.join('.') as FieldPath, { type: 'custom', message: error.msg }); } else { pushNotification({ diff --git a/frontend/src/pages/Project/Gateways/Add/index.tsx b/frontend/src/pages/Project/Gateways/Add/index.tsx index b033c0f36..733853dde 100644 --- a/frontend/src/pages/Project/Gateways/Add/index.tsx +++ b/frontend/src/pages/Project/Gateways/Add/index.tsx @@ -7,7 +7,7 @@ import { get as _get } from 'lodash'; import { Button, Container, FormSelect, FormSelectOptions, FormUI, Header, SpaceBetween, Spinner } from 'components'; import { useBreadcrumbs, useNotifications } from 'hooks'; -import { isRequestFormErrors2, isRequestFormFieldError } from 'libs'; +import { getServerError, isResponseServerError, isResponseServerFormFieldError } from 'libs'; import { ROUTES } from 'routes'; import { useCreateProjectGatewayMutation } from 'services/gateway'; import { useGetProjectQuery } from 'services/project'; @@ -108,9 +108,9 @@ export const AddGateway: React.FC = () => { .catch((errorResponse) => { const errorRequestData = errorResponse?.data; - if (isRequestFormErrors2(errorRequestData)) { + if (isResponseServerError(errorRequestData)) { errorRequestData.detail.forEach((error) => { - if (isRequestFormFieldError(error)) { + if (isResponseServerFormFieldError(error)) { setError(error.loc.join('.') as FieldPath, { type: 'custom', message: error.msg, @@ -126,7 +126,7 @@ export const AddGateway: React.FC = () => { pushNotification({ type: 'error', content: t('common.server_error', { - error: errorResponse?.data?.detail?.map((i: { msg: string }) => i.msg).join(', '), + error: getServerError(errorResponse), }), }); } diff --git a/frontend/src/pages/Project/Gateways/Edit/index.tsx b/frontend/src/pages/Project/Gateways/Edit/index.tsx index 2529110bd..7d4ac6a37 100644 --- a/frontend/src/pages/Project/Gateways/Edit/index.tsx +++ b/frontend/src/pages/Project/Gateways/Edit/index.tsx @@ -18,7 +18,7 @@ import { } from 'components'; import { useBreadcrumbs, useHelpPanel, useNotifications } from 'hooks'; -import { isRequestFormErrors2, isRequestFormFieldError } from 'libs'; +import { getServerError, isResponseServerError, isResponseServerFormFieldError } from 'libs'; import { ROUTES } from 'routes'; import { useGetProjectGatewayQuery, @@ -122,9 +122,9 @@ export const EditGateway: React.FC = () => { .catch((errorResponse) => { const errorRequestData = errorResponse?.data; - if (isRequestFormErrors2(errorRequestData)) { + if (isResponseServerError(errorRequestData)) { errorRequestData.detail.forEach((error) => { - if (isRequestFormFieldError(error)) { + if (isResponseServerFormFieldError(error)) { setError(error.loc.join('.') as FieldPath, { type: 'custom', message: error.msg, @@ -140,7 +140,7 @@ export const EditGateway: React.FC = () => { pushNotification({ type: 'error', content: t('common.server_error', { - error: errorResponse?.data?.detail?.map((i: { msg: string }) => i.msg).join(', '), + error: getServerError(errorResponse), }), }); } diff --git a/frontend/src/pages/Project/hooks/useDeleteProject.ts b/frontend/src/pages/Project/hooks/useDeleteProject.ts index a01f4fe50..86f51ac48 100644 --- a/frontend/src/pages/Project/hooks/useDeleteProject.ts +++ b/frontend/src/pages/Project/hooks/useDeleteProject.ts @@ -1,6 +1,7 @@ import { useTranslation } from 'react-i18next'; import { useNotifications } from 'hooks'; +import { getServerError } from 'libs'; import { useDeleteProjectsMutation } from 'services/project'; export const useDeleteProject = () => { @@ -14,7 +15,7 @@ export const useDeleteProject = () => { request.catch((error) => { pushNotification({ type: 'error', - content: t('common.server_error', { error: error?.error }), + content: t('common.server_error', { error: getServerError(error) }), }); }); @@ -27,7 +28,7 @@ export const useDeleteProject = () => { request.catch((error) => { pushNotification({ type: 'error', - content: t('common.server_error', { error: error?.error }), + content: t('common.server_error', { error: getServerError(error) }), }); }); diff --git a/frontend/src/pages/Runs/Details/index.tsx b/frontend/src/pages/Runs/Details/index.tsx index a4878d6ee..011a2ab7a 100644 --- a/frontend/src/pages/Runs/Details/index.tsx +++ b/frontend/src/pages/Runs/Details/index.tsx @@ -9,7 +9,7 @@ import { Box, ColumnLayout, Container, ContentLayout, DetailsHeader, Header, Loa import { DATE_TIME_FORMAT } from 'consts'; import { useBreadcrumbs, useNotifications } from 'hooks'; -import { riseRouterException } from 'libs'; +import { getServerError, riseRouterException } from 'libs'; import { getStatusIconType } from 'libs/run'; import { ROUTES } from 'routes'; import { useDeleteRunsMutation, useGetRunQuery, useStopRunsMutation } from 'services/run'; @@ -86,7 +86,7 @@ export const RunDetails: React.FC = () => { .catch((error) => { pushNotification({ type: 'error', - content: t('common.server_error', { error: error?.error }), + content: t('common.server_error', { error: getServerError(error) }), }); }); }; @@ -101,7 +101,7 @@ export const RunDetails: React.FC = () => { .catch((error) => { pushNotification({ type: 'error', - content: t('common.server_error', { error: error?.error }), + content: t('common.server_error', { error: getServerError(error) }), }); }); }; @@ -118,7 +118,7 @@ export const RunDetails: React.FC = () => { .catch((error) => { pushNotification({ type: 'error', - content: t('common.server_error', { error: error?.error }), + content: t('common.server_error', { error: getServerError(error) }), }); }); }; diff --git a/frontend/src/pages/Runs/List/hooks/useDeleteRuns.ts b/frontend/src/pages/Runs/List/hooks/useDeleteRuns.ts index db208c230..cb8cf4a77 100644 --- a/frontend/src/pages/Runs/List/hooks/useDeleteRuns.ts +++ b/frontend/src/pages/Runs/List/hooks/useDeleteRuns.ts @@ -2,6 +2,7 @@ import { useCallback } from 'react'; import { useTranslation } from 'react-i18next'; import { useNotifications } from 'hooks'; +import { getServerError } from 'libs'; import { useDeleteRunsMutation } from 'services/run'; import { getGroupedRunsByProjectAndRepoID } from '../helpers'; @@ -28,7 +29,7 @@ export const useDeleteRuns = () => { request.catch((error) => { pushNotification({ type: 'error', - content: t('common.server_error', { error: error?.error }), + content: t('common.server_error', { error: getServerError(error) }), }); }); diff --git a/frontend/src/pages/Runs/List/hooks/useStopRuns.ts b/frontend/src/pages/Runs/List/hooks/useStopRuns.ts index e49929b9b..d65d80027 100644 --- a/frontend/src/pages/Runs/List/hooks/useStopRuns.ts +++ b/frontend/src/pages/Runs/List/hooks/useStopRuns.ts @@ -2,6 +2,7 @@ import { useCallback } from 'react'; import { useTranslation } from 'react-i18next'; import { useNotifications } from 'hooks'; +import { getServerError } from 'libs'; import { useStopRunsMutation } from 'services/run'; import { getGroupedRunsByProjectAndRepoID } from '../helpers'; @@ -30,7 +31,7 @@ export const useStopRuns = (isAborting?: boolean) => { request.catch((error) => { pushNotification({ type: 'error', - content: t('common.server_error', { error: error?.error }), + content: t('common.server_error', { error: getServerError(error) }), }); }); diff --git a/frontend/src/pages/User/Details/Billing/index.tsx b/frontend/src/pages/User/Details/Billing/index.tsx index 774807994..c15c86b77 100644 --- a/frontend/src/pages/User/Details/Billing/index.tsx +++ b/frontend/src/pages/User/Details/Billing/index.tsx @@ -7,7 +7,7 @@ import { PermissionGuard } from 'components/PermissionGuard'; import { HotspotIds } from 'layouts/AppLayout/TutorialPanel/constants'; import { useAppSelector, useBreadcrumbs, useNotifications } from 'hooks'; -import { centsToFormattedString, goToUrl } from 'libs'; +import { centsToFormattedString, getServerError, goToUrl } from 'libs'; import { ROUTES } from 'routes'; import { useGetUserBillingInfoQuery, @@ -75,7 +75,7 @@ export const Billing: React.FC = () => { .catch((error) => { pushNotification({ type: 'error', - content: t('common.server_error', { error: error?.msg }), + content: t('common.server_error', { error: getServerError(error) }), }); }) .finally(closeModal); @@ -94,7 +94,7 @@ export const Billing: React.FC = () => { .catch((error) => { pushNotification({ type: 'error', - content: t('common.server_error', { error: error?.msg }), + content: t('common.server_error', { error: getServerError(error) }), }); }) .finally(closeModal); diff --git a/frontend/src/pages/User/Details/CreditsHistory/Add/index.tsx b/frontend/src/pages/User/Details/CreditsHistory/Add/index.tsx index fd9e0381f..d4d0f058c 100644 --- a/frontend/src/pages/User/Details/CreditsHistory/Add/index.tsx +++ b/frontend/src/pages/User/Details/CreditsHistory/Add/index.tsx @@ -6,7 +6,7 @@ import { useNavigate, useParams } from 'react-router-dom'; import { Button, Container, ContentLayout, FormInput, FormUI, Header, SpaceBetween } from 'components'; import { useBreadcrumbs, useNotifications } from 'hooks'; -import { isRequestFormErrors2, isRequestFormFieldError } from 'libs'; +import { getServerError, isResponseServerError, isResponseServerFormFieldError } from 'libs'; import { getFieldErrorFromServerResponse } from 'libs/form'; import { ROUTES } from 'routes'; import { useAddUserPaymentMutation } from 'services/user'; @@ -72,9 +72,9 @@ export const Add: React.FC = () => { .catch((errorResponse) => { const errorRequestData = errorResponse?.data; - if (isRequestFormErrors2(errorRequestData)) { + if (isResponseServerError(errorRequestData)) { errorRequestData.detail.forEach((error) => { - if (isRequestFormFieldError(error)) { + if (isResponseServerFormFieldError(error)) { const { fieldNamePath, message } = getFieldErrorFromServerResponse(error); setError(fieldNamePath as FieldPath, { type: 'custom', message }); @@ -88,7 +88,7 @@ export const Add: React.FC = () => { } else { pushNotification({ type: 'error', - content: t('common.server_error', { error: errorResponse?.error ?? errorResponse }), + content: t('common.server_error', { error: getServerError(errorResponse) }), }); } }); diff --git a/frontend/src/pages/User/Details/index.tsx b/frontend/src/pages/User/Details/index.tsx index 26aa17ee2..da01e606b 100644 --- a/frontend/src/pages/User/Details/index.tsx +++ b/frontend/src/pages/User/Details/index.tsx @@ -6,7 +6,7 @@ import { ConfirmationDialog, ContentLayout, SpaceBetween, Tabs } from 'component import { DetailsHeader } from 'components'; import { useNotifications, usePermissionGuard } from 'hooks'; -import { riseRouterException } from 'libs'; +import { getServerError, riseRouterException } from 'libs'; import { ROUTES } from 'routes'; import { useDeleteUsersMutation, useGetUserQuery } from 'services/user'; @@ -47,7 +47,7 @@ export const UserDetails: React.FC = () => { .catch((error) => { pushNotification({ type: 'error', - content: t('common.server_error', { error: error?.error }), + content: t('common.server_error', { error: getServerError(error) }), }); }); diff --git a/frontend/src/pages/User/List/index.tsx b/frontend/src/pages/User/List/index.tsx index 0b805cf3a..1c216307c 100644 --- a/frontend/src/pages/User/List/index.tsx +++ b/frontend/src/pages/User/List/index.tsx @@ -15,14 +15,14 @@ import { TextFilter, } from 'components'; +import { DATE_TIME_FORMAT } from 'consts'; import { useAppSelector, useBreadcrumbs, useCollection, useNotifications } from 'hooks'; +import { getServerError } from 'libs'; import { ROUTES } from 'routes'; import { useDeleteUsersMutation, useGetUserListQuery } from 'services/user'; import { selectUserData } from 'App/slice'; -import { DATE_TIME_FORMAT } from '../../../consts'; - export const UserList: React.FC = () => { const { t } = useTranslation(); const [showDeleteConfirm, setShowConfirmDelete] = useState(false); @@ -115,7 +115,7 @@ export const UserList: React.FC = () => { .catch((error) => { pushNotification({ type: 'error', - content: t('common.server_error', { error: error?.error }), + content: t('common.server_error', { error: getServerError(error) }), }); }); } diff --git a/frontend/src/pages/Volumes/List/hooks.tsx b/frontend/src/pages/Volumes/List/hooks.tsx index 728240fbc..af79a5617 100644 --- a/frontend/src/pages/Volumes/List/hooks.tsx +++ b/frontend/src/pages/Volumes/List/hooks.tsx @@ -8,12 +8,12 @@ import { SelectCSDProps } from 'components'; import { DATE_TIME_FORMAT, DEFAULT_TABLE_PAGE_SIZE } from 'consts'; import { useNotifications } from 'hooks'; import { useLocalStorageState } from 'hooks/useLocalStorageState'; +import { getServerError } from 'libs'; import { getStatusIconType } from 'libs/volumes'; +import { ROUTES } from 'routes'; import { useGetProjectsQuery } from 'services/project'; import { useDeleteVolumesMutation, useLazyGetAllVolumesQuery } from 'services/volume'; -import { ROUTES } from '../../../routes'; - export const useVolumesTableEmptyMessages = ({ clearFilters, isDisabledClearFilter, @@ -256,7 +256,7 @@ export const useVolumesDelete = () => { .catch((error) => { pushNotification({ type: 'error', - content: t('common.server_error', { error: error?.error }), + content: t('common.server_error', { error: getServerError(error) }), }); }); };