Use same lock values as mobile clients
[ProtonMail-WebClient.git] / packages / shared / lib / api / helpers / apiErrorHelper.ts
blobfb41ef75a7cdf2cb2d3317fae61eaea079fd1ddb
1 import { c } from 'ttag';
3 import { API_CODES } from '../../constants';
4 import { HTTP_ERROR_CODES } from '../../errors';
6 export const isNotExistError = (error: any) => {
7     const notExistErrorCodes = [
8         API_CODES.INVALID_ID_ERROR,
9         API_CODES.NOT_FOUND_ERROR,
10         /**
11          * Mail Specific: Conversation does not exist
12          */
13         20052,
14     ];
16     return Boolean(notExistErrorCodes.includes(error.data?.Code));
19 export const getApiError = (e?: any) => {
20     if (!e) {
21         return {};
22     }
23     const { data, status } = e;
25     if (!data) {
26         return {
27             status,
28         };
29     }
31     const { Error: errorMessage, Code: errorCode, Details: errorDetails } = data;
33     if (!errorMessage) {
34         return {
35             status,
36         };
37     }
39     return {
40         status,
41         code: errorCode,
42         message: errorMessage,
43         details: errorDetails,
44     };
47 export const getIs401Error = (e: any) => {
48     if (!e) {
49         return false;
50     }
51     return e.name === 'InactiveSession' || e.status === 401;
54 export const getIsOfflineError = (e: any) => {
55     if (!e) {
56         return false;
57     }
58     return e.name === 'OfflineError';
61 export const getIsUnreachableError = (e: any) => {
62     if (!e) {
63         return false;
64     }
65     // On 503, even if there's response, it's an unreachable error
66     if (e.status === HTTP_ERROR_CODES.SERVICE_UNAVAILABLE) {
67         return true;
68     }
69     // On 502 or 504, we verify that the API did not actually give a response. It can return these codes when acting as a proxy (e.g. email-list unsubscribe).
70     return (
71         [HTTP_ERROR_CODES.BAD_GATEWAY, HTTP_ERROR_CODES.GATEWAY_TIMEOUT].includes(e.status) &&
72         e.data?.Code === undefined
73     );
76 export const getIsNetworkError = (e: any) => {
77     if (!e) {
78         return false;
79     }
80     return e.name === 'NetworkError' || e.message?.toLowerCase() === 'network error';
83 export const getIsTimeoutError = (e: any) => {
84     if (!e) {
85         return false;
86     }
87     return e.name === 'TimeoutError';
90 export const getIsConnectionIssue = (e: any) => {
91     return getIsOfflineError(e) || getIsUnreachableError(e) || getIsNetworkError(e) || getIsTimeoutError(e);
94 export const getApiErrorMessage = (e: any): string | undefined => {
95     const { message } = getApiError(e);
96     if (getIs401Error(e)) {
97         return message || c('Info').t`Session timed out`;
98     }
99     if (getIsOfflineError(e)) {
100         return message || c('Info').t`Internet connection lost`;
101     }
102     if (getIsUnreachableError(e)) {
103         return message || c('Info').t`Servers are unreachable. Please try again in a few minutes`;
104     }
105     if (getIsTimeoutError(e)) {
106         return message || c('Error').t`Request timed out`;
107     }
108     if (message) {
109         return `${message}`;
110     }