From 34fc7ad0279a79ab70a03fd008267dd53363acd9 Mon Sep 17 00:00:00 2001 From: mokaddem Date: Tue, 27 Jul 2021 10:38:43 +0200 Subject: [PATCH] chg: [helpers:api-helpers] Slight rework on notifications --- webroot/js/api-helper.js | 91 +++++++++++++++++++++++----------------- 1 file changed, 53 insertions(+), 38 deletions(-) diff --git a/webroot/js/api-helper.js b/webroot/js/api-helper.js index aa01843..9062c23 100644 --- a/webroot/js/api-helper.js +++ b/webroot/js/api-helper.js @@ -68,6 +68,49 @@ class AJAXApi { } } + provideSuccessFeedback(response, toastOptions, skip=false) { + let alteredToastOptions = Object.assign( + { + 'variant': 'success' + }, + AJAXApi.defaultOptions.successToastOptions, + toastOptions + ) + alteredToastOptions.body = response.message + if (!skip && this.options.provideFeedback) { + UI.toast(alteredToastOptions) + } + } + + provideFailureFeedback(response, toastOptions, skip=false) { + let alteredToastOptions = Object.assign( + { + 'variant': 'danger' + }, + AJAXApi.defaultOptions.errorToastOptions, + toastOptions + ) + if (response.message && response.errors) { + if (Array.isArray(response.errors)) { + alteredToastOptions.title = response.message + alteredToastOptions.body = response.errors.join(', ') + } else if (typeof response.errors === 'string') { + alteredToastOptions.title = response.message + alteredToastOptions.body = response.errors + } else { + alteredToastOptions.title = 'There has been a problem with the operation' + alteredToastOptions.body = response.message + } + } else { + alteredToastOptions.title = 'There has been a problem with the operation' + alteredToastOptions.body = response.message + } + if (!skip && this.options.provideFeedback) { + UI.toast(alteredToastOptions) + console.warn(alteredToastOptions.body) + } + } + /** * Merge newOptions configuration into the current object * @param {Object} The options supported by AJAXApi#defaultOptions @@ -175,17 +218,10 @@ class AJAXApi { throw new Error(`Network response was not ok. \`${response.statusText}\``) } const dataHtml = await response.text(); - this.provideFeedback({ - variant: 'success', - title: 'URL fetched', - }, false, skipFeedback); + this.provideSuccessFeedback({message: 'URL fetched'}, {}, skipFeedback) toReturn = dataHtml; } catch (error) { - this.provideFeedback({ - variant: 'danger', - title: 'There has been a problem with the operation', - body: error.message - }, true, skipFeedback); + this.provideFailureFeedback(error, {}, skipFeedback) toReturn = Promise.reject(error); } finally { if (!skipRequestHooks) { @@ -212,17 +248,10 @@ class AJAXApi { throw new Error(`Network response was not ok. \`${response.statusText}\``) } const dataJson = await response.json(); - this.provideFeedback({ - variant: 'success', - title: 'URL fetched', - }, false, skipFeedback); + this.provideSuccessFeedback({message: 'JSON fetched'}, {}, skipFeedback) toReturn = dataJson; } catch (error) { - this.provideFeedback({ - variant: 'danger', - title: 'There has been a problem with the operation', - body: error.message - }, true, skipFeedback); + this.provideFailureFeedback(error, {}, skipFeedback) toReturn = Promise.reject(error); } finally { if (!skipRequestHooks) { @@ -257,11 +286,7 @@ class AJAXApi { } toReturn = form[0]; } catch (error) { - this.provideFeedback({ - variant: 'danger', - title: 'There has been a problem with the operation', - body: error.message - }, true, skipFeedback); + this.provideFailureFeedback(error, {}, skipFeedback) toReturn = Promise.reject(error); } finally { if (!skipRequestHooks) { @@ -302,13 +327,10 @@ class AJAXApi { variant: 'success', body: data.message }, false, skipFeedback); + this.provideSuccessFeedback(data, {}, skipFeedback) toReturn = data; } else { - this.provideFeedback({ - variant: 'danger', - title: 'There has been a problem with the operation', - body: data.message - }, true, skipFeedback); + this.provideFailureFeedback(data, {}, skipFeedback) toReturn = Promise.reject(data.errors); } } catch (error) { @@ -327,7 +349,7 @@ class AJAXApi { } /** - * @param {HTMLFormElement} form - The form to be posted + * @param {HTMLFormElement} form - The form to be posted * @param {Object} [dataToMerge={}] - Additional data to be integrated or modified in the form * @param {boolean} [skipRequestHooks=false] - If true, default request hooks will be skipped * @param {boolean} [skipFeedback=false] - Pass this value to the AJAXApi.provideFeedback function @@ -356,17 +378,10 @@ class AJAXApi { try { const data = await response.json() if (data.success) { - this.provideFeedback({ - variant: 'success', - body: data.message - }, false, skipFeedback); + this.provideSuccessFeedback(data, {}, skipFeedback) toReturn = data; } else { - this.provideFeedback({ - variant: 'danger', - title: 'There has been a problem with the operation', - body: data.message - }, true, skipFeedback); + this.provideFailureFeedback(data, {}, skipFeedback) feedbackShown = true this.injectFormValidationFeedback(form, data.errors) toReturn = Promise.reject(data.errors);