diff --git a/app/soapbox/actions/alerts.js b/app/soapbox/actions/alerts.js index cb8be15b4d..c71ce3e874 100644 Binary files a/app/soapbox/actions/alerts.js and b/app/soapbox/actions/alerts.js differ diff --git a/app/soapbox/utils/errors.js b/app/soapbox/utils/errors.js deleted file mode 100644 index 1bf59e4f09..0000000000 Binary files a/app/soapbox/utils/errors.js and /dev/null differ diff --git a/app/soapbox/utils/errors.ts b/app/soapbox/utils/errors.ts new file mode 100644 index 0000000000..e5e04311cf --- /dev/null +++ b/app/soapbox/utils/errors.ts @@ -0,0 +1,203 @@ +import camelCase from 'lodash/camelCase'; +import startCase from 'lodash/startCase'; + +const toSentence = (arr: string[]) => arr + .reduce( + (prev, curr, i) => prev + curr + (i === arr.length - 2 ? ' and ' : ', '), + '', + ) + .slice(0, -2); + +type Errors = { + [key: string]: string[] +} + +const buildErrorMessage = (errors: Errors) => { + const individualErrors = Object.keys(errors).map( + (attribute) => `${startCase(camelCase(attribute))} ${toSentence( + errors[attribute], + )}`, + ); + + return toSentence(individualErrors); +}; + +const httpErrorMessages: { code: number, name: string, description: string }[] = [ + { + code: 100, + name: 'Continue', + description: 'The server has received the request headers, and the client should proceed to send the request body', + }, + { + code: 101, + name: 'Switching Protocols', + description: 'The requester has asked the server to switch protocols', + }, + { + code: 103, + name: 'Checkpoint', + description: 'Used in the resumable requests proposal to resume aborted PUT or POST requests', + }, + { + code: 200, + name: 'OK', + description: 'The request is OK (this is the standard response for successful HTTP requests)', + }, + { + code: 201, + name: 'Created', + description: 'The request has been fulfilled', + }, + { + code: 202, + name: 'Accepted', + description: 'The request has been accepted for processing', + }, + { + code: 203, + name: 'Non-Authoritative Information', + description: 'The request has been successfully processed', + }, + { + code: 204, + name: 'No Content', + description: 'The request has been successfully processed', + }, + { + code: 205, + name: 'Reset Content', + description: 'The request has been successfully processed', + }, + { + code: 206, + name: 'Partial Content', + description: 'The server is delivering only part of the resource due to a range header sent by the client', + }, + { + code: 400, + name: 'Bad Request', + description: 'The request cannot be fulfilled due to bad syntax', + }, + { + code: 401, + name: 'Unauthorized', + description: 'The request was a legal request', + }, + { + code: 402, + name: 'Payment Required', + description: 'Reserved for future use', + }, + { + code: 403, + name: 'Forbidden', + description: 'The request was a legal request', + }, + { + code: 404, + name: 'Not Found', + description: 'The requested page could not be found but may be available again in the future', + }, + { + code: 405, + name: 'Method Not Allowed', + description: 'A request was made of a page using a request method not supported by that page', + }, + { + code: 406, + name: 'Not Acceptable', + description: 'The server can only generate a response that is not accepted by the client', + }, + { + code: 407, + name: 'Proxy Authentication Required', + description: 'The client must first authenticate itself with the proxy', + }, + { + code: 408, + name: 'Request', + description: ' Timeout\tThe server timed out waiting for the request', + }, + { + code: 409, + name: 'Conflict', + description: 'The request could not be completed because of a conflict in the request', + }, + { + code: 410, + name: 'Gone', + description: 'The requested page is no longer available', + }, + { + code: 411, + name: 'Length Required', + description: 'The "Content-Length" is not defined. The server will not accept the request without it', + }, + { + code: 412, + name: 'Precondition', + description: ' Failed. The precondition given in the request evaluated to false by the server', + }, + { + code: 413, + name: 'Request Entity Too Large', + description: 'The server will not accept the request', + }, + { + code: 414, + name: 'Request-URI Too Long', + description: 'The server will not accept the request', + }, + { + code: 415, + name: 'Unsupported Media Type', + description: 'The server will not accept the request', + }, + { + code: 416, + name: 'Requested Range Not Satisfiable', + description: 'The client has asked for a portion of the file', + }, + { + code: 417, + name: 'Expectation Failed', + description: 'The server cannot meet the requirements of the Expect request-header field', + }, + { + code: 500, + name: 'Internal Server Error', + description: 'A generic error message', + }, + { + code: 501, + name: 'Not Implemented', + description: 'The server either does not recognize the request method', + }, + { + code: 502, + name: 'Bad Gateway', + description: 'The server was acting as a gateway or proxy and received an invalid response from the upstream server', + }, + { + code: 503, + name: 'Service Unavailable', + description: 'The server is currently unavailable (overloaded or down)', + }, + { + code: 504, + name: 'Gateway Timeout', + description: 'The server was acting as a gateway or proxy and did not receive a timely response from the upstream server', + }, + { + code: 505, + name: 'HTTP Version Not Supported', + description: 'The server does not support the HTTP protocol version used in the request', + }, + { + code: 511, + name: 'Network Authentication Required', + description: 'The client needs to auth', + }, +]; + +export { buildErrorMessage, httpErrorMessages };