From a28fcecf98c742c60897d7b7d9f09d86d03aa03e Mon Sep 17 00:00:00 2001 From: Mikael Finstad Date: Wed, 6 Sep 2023 22:15:59 +0200 Subject: [PATCH] allow sending certain errors to the user this is useful because: // onedrive gives some errors here that the user might want to know about // e.g. these happen if you try to login to a users in an organization, // without an Office365 licence or OneDrive account setup completed // 400: Tenant does not have a SPO license // 403: You do not have access to create this personal site or you do not have a valid license --- .../@uppy/companion/src/server/provider/providerErrors.js | 8 ++++++-- .../provider-views/src/ProviderView/ProviderView.jsx | 7 +++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/@uppy/companion/src/server/provider/providerErrors.js b/packages/@uppy/companion/src/server/provider/providerErrors.js index bc38093550..4c216837a6 100644 --- a/packages/@uppy/companion/src/server/provider/providerErrors.js +++ b/packages/@uppy/companion/src/server/provider/providerErrors.js @@ -1,7 +1,10 @@ const logger = require('../logger') -const { ProviderApiError, ProviderAuthError } = require('./error') +const { ProviderApiError, ProviderUserError, ProviderAuthError } = require('./error') -async function withProviderErrorHandling ({ fn, tag, providerName, isAuthError = () => false, getJsonErrorMessage }) { +async function withProviderErrorHandling ({ + // eslint-disable-next-line no-unused-vars + fn, tag, providerName, isAuthError = () => false, isUserFacingError = (response) => false, getJsonErrorMessage, +}) { function getErrorMessage (response) { if (typeof response.body === 'object') { const message = getJsonErrorMessage(response.body) @@ -25,6 +28,7 @@ async function withProviderErrorHandling ({ fn, tag, providerName, isAuthError = if (response) { // @ts-ignore if (isAuthError(response)) err2 = new ProviderAuthError() + if (isUserFacingError(response)) err2 = new ProviderUserError({ message: getErrorMessage(response) }) else err2 = new ProviderApiError(getErrorMessage(response), response.statusCode) } diff --git a/packages/@uppy/provider-views/src/ProviderView/ProviderView.jsx b/packages/@uppy/provider-views/src/ProviderView/ProviderView.jsx index 4dd13fb91a..d7986b002a 100644 --- a/packages/@uppy/provider-views/src/ProviderView/ProviderView.jsx +++ b/packages/@uppy/provider-views/src/ProviderView/ProviderView.jsx @@ -187,6 +187,13 @@ export default class ProviderView extends View { this.plugin.setPluginState({ folders, files, breadcrumbs, filterInput: '' }) }) } catch (err) { + // This is the first call that happens when the provider view loads, after auth, so it's probably nice to show any + // error occurring here to the user. + if (err instanceof UserFacingApiError) { + this.plugin.uppy.info({ message: this.plugin.uppy.i18n(err.message) }, 'warning', 5000) + return + } + this.handleError(err) } finally { this.setLoading(false)