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.
62 lines
1.7 KiB
62 lines
1.7 KiB
import { AxiosError, AxiosResponse } from 'axios'; |
|
|
|
import { Message } from '../components/MessageBox'; |
|
|
|
const handleAPIError = <RequestDataType, ResponseDataType>( |
|
error: AxiosError<ResponseDataType, RequestDataType>, |
|
{ |
|
onRequestError = (request) => ({ |
|
children: `Incomplete request; reason: ${request}.`, |
|
type: 'error', |
|
}), |
|
onResponseErrorAppend, |
|
onSetupError = (message) => ({ |
|
children: `Failed to setup request; reason: ${message}.`, |
|
type: 'error', |
|
}), |
|
// Following options rely on other values. |
|
onResponseError = (response) => { |
|
const { status, statusText } = response; |
|
|
|
let result: Message; |
|
|
|
if (status === 500) { |
|
result = { |
|
children: `The API encountered a problem: ${status} (${statusText})! Please check its systemd service logs.`, |
|
type: 'error', |
|
}; |
|
} else { |
|
result = onResponseErrorAppend?.call(null, response) ?? { |
|
children: `API responded with ${status} (${statusText}).`, |
|
type: 'warning', |
|
}; |
|
} |
|
return result; |
|
}, |
|
}: { |
|
onRequestError?: (request: unknown) => Message; |
|
onResponseError?: ( |
|
response: AxiosResponse<ResponseDataType, RequestDataType>, |
|
) => Message; |
|
onResponseErrorAppend?: ( |
|
response: AxiosResponse<ResponseDataType, RequestDataType>, |
|
) => Message | undefined; |
|
onSetupError?: (message: string) => Message; |
|
} = {}, |
|
): Message => { |
|
const { request, response, message } = error; |
|
|
|
let result: Message; |
|
|
|
if (response) { |
|
result = onResponseError(response); |
|
} else if (request) { |
|
result = onRequestError(request); |
|
} else { |
|
result = onSetupError(message); |
|
} |
|
|
|
return result; |
|
}; |
|
|
|
export default handleAPIError;
|
|
|