From 151dfd29d3f2cda43125bb2c4555e5d57b1adb2e Mon Sep 17 00:00:00 2001 From: "sentry[bot]" <39604003+sentry[bot]@users.noreply.github.com> Date: Tue, 9 Jun 2026 01:08:44 +0000 Subject: [PATCH] fix: Handle network errors with proper Error objects --- .../NetworkErrorBoundary.jsx | 6 +++- src/shared/api/rejectNetworkError.ts | 32 ++++++++++++++++--- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/layouts/shared/NetworkErrorBoundary/NetworkErrorBoundary.jsx b/src/layouts/shared/NetworkErrorBoundary/NetworkErrorBoundary.jsx index 9a04cf7b20..0d892a2ca8 100644 --- a/src/layouts/shared/NetworkErrorBoundary/NetworkErrorBoundary.jsx +++ b/src/layouts/shared/NetworkErrorBoundary/NetworkErrorBoundary.jsx @@ -6,6 +6,7 @@ import { useHistory, useLocation } from 'react-router-dom' import config from 'config' +import { NetworkError } from 'shared/api/rejectNetworkError' import { useUser } from 'services/user' import A from 'ui/A' import Button from 'ui/Button' @@ -213,7 +214,10 @@ class NetworkErrorBoundary extends Component { static getDerivedStateFromError(error) { // if the error is not a network error, we don't do anything and // another error boundary will take it from there - if (Object.keys(errorToUI).includes(String(error.status))) { + if ( + error instanceof NetworkError && + Object.keys(errorToUI).includes(String(error.status)) + ) { return { hasNetworkError: true, error } } diff --git a/src/shared/api/rejectNetworkError.ts b/src/shared/api/rejectNetworkError.ts index b9aa4da892..d37595889e 100644 --- a/src/shared/api/rejectNetworkError.ts +++ b/src/shared/api/rejectNetworkError.ts @@ -9,6 +9,26 @@ export type NetworkErrorName = | NotFoundError | OwnerNotActivatedError +export class NetworkError extends Error { + status: number + data: { detail?: React.ReactNode } | undefined + + constructor({ + status, + data, + dev, + }: { + status: number + data?: { detail?: React.ReactNode } + dev: string + }) { + super(dev) + this.name = 'NetworkError' + this.status = status + this.data = data + } +} + export type ParsingErrorObject = { errorName: ParsingError errorDetails: { error: Error; callingFn: string } @@ -107,9 +127,11 @@ export function rejectNetworkError(error: NetworkErrorObject) { const status = determineStatusCode(errorName) - return Promise.reject({ - dev: devMsg, - data: 'data' in error ? error.data : undefined, - status: status, - }) + return Promise.reject( + new NetworkError({ + dev: devMsg, + data: 'data' in error ? error.data : undefined, + status: status, + }) + ) }