import { ref } from 'vue'; import axios from 'axios'; import { boot } from 'quasar/wrappers'; import qFormMixin from './qformMixin'; import keyShortcut from './keyShortcut'; import { i18n } from './i18n'; import useNotify from 'src/composables/useNotify.js'; import VnInput from 'src/components/common/VnInput.vue'; import { useVnConfirm } from 'src/composables/useVnConfirm'; const { notify } = useNotify(); const { openConfirmationModal } = useVnConfirm(); export default boot(({ app }) => { app.mixin(qFormMixin); app.directive('shortcut', keyShortcut); app.config.errorHandler = (error) => { let message; const response = error.response; const responseData = response?.data; const responseError = responseData && response.data.error; if (responseError) { message = responseError.message; } switch (response?.status) { case 422: if (error.name == 'ValidationError') message += ' "' + responseError.details.context + '.' + Object.keys(responseError.details.codes).join(',') + '"'; break; case 500: message = 'errors.statusInternalServerError'; break; case 502: message = 'errors.statusBadGateway'; break; case 504: message = 'errors.statusGatewayTimeout'; break; } console.error(error); if (error instanceof axios.CanceledError) { const env = process.env.NODE_ENV; if (env && env !== 'development') return; message = 'Duplicate request'; } const { config, headers, request, status, statusText, data } = response || {}; const { params, url, method, signal, headers: confHeaders } = config || {}; const { message: resMessage, code, name } = data?.error || {}; const additionalData = { path: location.href, message: resMessage, code, request: request?.responseURL, status, name, statusText: statusText, config: { url, method, params, headers: confHeaders, aborted: signal?.aborted, version: headers?.['salix-version'], }, }; const opts = { actions: [ { icon: 'support_agent', color: 'primary', dense: true, flat: false, round: true, handler: async () => { const locale = i18n.global.t; const reason = ref( code == 'ACCESS_DENIED' ? locale('cau.askPrivileges') : '' ); openConfirmationModal( locale('cau.title'), locale('cau.subtitle'), async () => { await axios.post('OsTickets/send-to-support', { reason: reason.value, additionalData, }); }, null, { component: VnInput, props: { modelValue: reason, 'onUpdate:modelValue': (val) => (reason.value = val), label: locale('cau.inputLabel'), class: 'full-width', required: true, }, } ); }, }, ], }; notify(message ?? 'globals.error', 'negative', 'error', opts); }; });