[ABANDONED] React/Redux front end for the Flexor social network.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

113 lines
3.1 KiB

// errors.ts
// Copyright (C) 2020 Dwayne Harris
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
import { History } from 'history'
import { setFieldNotification } from '../actions/forms'
import { showNotification } from '../actions/notifications'
import { AppThunkDispatch, FormNotification, NotificationType } from '../types'
export function handleApiError(err: HttpError, dispatch: AppThunkDispatch, history?: History) {
console.error('Error:', err)
if (err instanceof ServerError) {
dispatch(showNotification(NotificationType.Error, 'Server Error'))
return
}
if (err instanceof BadRequestError) {
dispatch(showNotification(NotificationType.Error, `Error: ${err.message}`))
for (const error of err.errors) {
const { field, type, message } = error
if (field) dispatch(setFieldNotification(field, type, message))
}
return
}
if (err instanceof UnauthorizedError) {
dispatch(showNotification(NotificationType.Error, 'You need to be logged in.'))
if (history) history.push('/login')
return
}
if (err instanceof NotFoundError) {
dispatch(showNotification(NotificationType.Error, 'Not found.'))
return
}
dispatch(showNotification(NotificationType.Error, `Error: ${err.message}`))
}
export class HttpError extends Error {
statusCode: number
errors: FormNotification[]
constructor(message = 'Unknown Error') {
super(message)
this.name = 'HttpError'
this.statusCode = 500
this.errors = []
}
}
export class ServerError extends HttpError {
constructor() {
super('Server Error')
this.name = 'ServerError'
this.statusCode = 500
}
}
export class BadRequestError extends HttpError {
constructor(message = 'Bad Request', errors: FormNotification[] = []) {
super(message)
this.name = 'BadRequestError'
this.statusCode = 400
this.errors = errors
}
}
export class UnauthorizedError extends HttpError {
constructor(message = 'Unauthorized') {
super(message)
this.name = 'UnauthorizedError'
this.statusCode = 401
}
}
export class ForbiddenError extends HttpError {
constructor(message = 'Forbidden') {
super(message)
this.name = 'ForbiddenError'
this.statusCode = 403
}
}
export class NotFoundError extends HttpError {
constructor(message = 'Not Found') {
super(message)
this.name = 'NotFoundError'
this.statusCode = 404
}
}