chore(ts): type getClientErrorObject (#9693)

This commit is contained in:
Erik Ritter 2020-04-30 17:03:31 -07:00 committed by GitHub
parent aad8209922
commit 5fb883e279
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 95 additions and 77 deletions

View File

@ -19,10 +19,12 @@
/* eslint global-require: 0 */
import $ from 'jquery';
import { SupersetClient } from '@superset-ui/connection';
import getClientErrorObject from '../utils/getClientErrorObject';
import getClientErrorObject, {
ClientErrorObject,
} from '../utils/getClientErrorObject';
import setupErrorMessages from './setupErrorMessages';
function showApiMessage(resp: { severity?: string; message: string }) {
function showApiMessage(resp: ClientErrorObject) {
const template =
'<div class="alert"> ' +
'<button type="button" class="close" ' +
@ -30,7 +32,7 @@ function showApiMessage(resp: { severity?: string; message: string }) {
const severity = resp.severity || 'info';
$(template)
.addClass('alert-' + severity)
.append(resp.message)
.append(resp.message || '')
.appendTo($('#alert-container'));
}

View File

@ -1,74 +0,0 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import { t } from '@superset-ui/translation';
import COMMON_ERR_MESSAGES from './errorMessages';
export default function getClientErrorObject(response) {
// takes a Response object as input, attempts to read response as Json if possible,
// and returns a Promise that resolves to a plain object with error key and text value.
return new Promise(resolve => {
if (typeof response === 'string') {
resolve({ error: response });
} else if (
response &&
response.constructor === Response &&
!response.bodyUsed
) {
// attempt to read the body as json, and fallback to text. we must clone the
// response in order to fallback to .text() because Response is single-read
response
.clone()
.json()
.then(errorJson => {
let error = { ...response, ...errorJson };
if (error.stack) {
error = {
...error,
error:
t('Unexpected error: ') +
(error.description ||
t('(no description, click to see stack trace)')),
stacktrace: error.stack,
};
} else if (
error.responseText &&
error.responseText.indexOf('CSRF') >= 0
) {
error = {
...error,
error: t(COMMON_ERR_MESSAGES.SESSION_TIMED_OUT),
};
}
resolve(error);
})
.catch(() => {
// fall back to reading as text
response.text().then(errorText => {
resolve({ ...response, error: errorText });
});
});
} else {
// fall back to Response.statusText or generic error of we cannot read the response
resolve({
...response,
error: response.statusText || t('An error occurred'),
});
}
});
}

View File

@ -0,0 +1,90 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import { SupersetClientResponse } from '@superset-ui/connection';
import { t } from '@superset-ui/translation';
import COMMON_ERR_MESSAGES from './errorMessages';
// The response always contains an error attribute, can contain anything from the
// SupersetClientResponse object, and can contain a spread JSON blob
export type ClientErrorObject = {
error: string;
severity?: string;
message?: string;
stacktrace?: string;
} & Partial<SupersetClientResponse>;
export default function getClientErrorObject(
response: SupersetClientResponse | string,
): Promise<ClientErrorObject> {
// takes a SupersetClientResponse as input, attempts to read response as Json if possible,
// and returns a Promise that resolves to a plain object with error key and text value.
return new Promise(resolve => {
if (typeof response === 'string') {
resolve({ error: response });
} else {
const responseObject =
response instanceof Response ? response : response.response;
if (responseObject && !responseObject.bodyUsed) {
// attempt to read the body as json, and fallback to text. we must clone the
// response in order to fallback to .text() because Response is single-read
responseObject
.clone()
.json()
.then(errorJson => {
let error = { ...responseObject, ...errorJson };
if (error.stack) {
error = {
...error,
error:
t('Unexpected error: ') +
(error.description ||
t('(no description, click to see stack trace)')),
stacktrace: error.stack,
};
} else if (
error.responseText &&
error.responseText.indexOf('CSRF') >= 0
) {
error = {
...error,
error: t(COMMON_ERR_MESSAGES.SESSION_TIMED_OUT),
};
}
resolve(error);
})
.catch(() => {
// fall back to reading as text
responseObject.text().then(errorText => {
resolve({ ...responseObject, error: errorText });
});
});
} else {
// fall back to Response.statusText or generic error of we cannot read the response
const error =
'statusText' in response
? response.statusText
: t('An error occurred');
resolve({
...responseObject,
error,
});
}
}
});
}