Add notification for unhandled errors
This commit is contained in:
parent
ee975e5854
commit
6431d0285c
|
@ -9,11 +9,15 @@ import store from '~/store'
|
||||||
const { $pgettext } = gettext
|
const { $pgettext } = gettext
|
||||||
const logger = useLogger()
|
const logger = useLogger()
|
||||||
|
|
||||||
export default async (error: Error | BackendError) => {
|
async function useErrorHandler (error: Error | BackendError): Promise<void>
|
||||||
|
async function useErrorHandler (error: Error | BackendError, eventId?: string): Promise<void>
|
||||||
|
async function useErrorHandler (error: Error | BackendError, eventId?: string): Promise<void> {
|
||||||
const title = 'backendErrors' in error
|
const title = 'backendErrors' in error
|
||||||
? 'Unexpected API error'
|
? 'Unexpected API error'
|
||||||
: 'Unexpected error'
|
: 'Unexpected error'
|
||||||
|
|
||||||
|
let content = $pgettext('App/Message/Paragraph', 'An unexpected error occured.')
|
||||||
|
|
||||||
if ('backendErrors' in error) {
|
if ('backendErrors' in error) {
|
||||||
logger.error(title, error, error.backendErrors)
|
logger.error(title, error, error.backendErrors)
|
||||||
} else {
|
} else {
|
||||||
|
@ -31,8 +35,7 @@ export default async (error: Error | BackendError) => {
|
||||||
|
|
||||||
const { get } = useCookies()
|
const { get } = useCookies()
|
||||||
if (get(COOKIE) === 'yes') {
|
if (get(COOKIE) === 'yes') {
|
||||||
const eventId = Sentry.captureException(error)
|
content = $pgettext('App/Message/Paragraph', 'An unexpected error occured. <br><sub>To help us understand why it happened, please attach a detailed description of what you did that has triggered the error.</sub>')
|
||||||
|
|
||||||
const user = store.state.auth.authenticated
|
const user = store.state.auth.authenticated
|
||||||
? {
|
? {
|
||||||
name: store.state.auth.username,
|
name: store.state.auth.username,
|
||||||
|
@ -43,13 +46,16 @@ export default async (error: Error | BackendError) => {
|
||||||
actions.push({
|
actions.push({
|
||||||
text: $pgettext('App/Message/Paragraph', 'Leave feedback'),
|
text: $pgettext('App/Message/Paragraph', 'Leave feedback'),
|
||||||
class: 'basic red',
|
class: 'basic red',
|
||||||
click: () => Sentry.showReportDialog({ eventId, user })
|
click: () => Sentry.showReportDialog({
|
||||||
|
eventId: eventId ?? Sentry.captureException(error),
|
||||||
|
user
|
||||||
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
store.commit('ui/addMessage', {
|
store.commit('ui/addMessage', {
|
||||||
content: $pgettext('App/Message/Paragraph', 'An unexpected error occured.'),
|
content,
|
||||||
date,
|
date,
|
||||||
class: 'error',
|
class: 'error',
|
||||||
key: `error-${date}`,
|
key: `error-${date}`,
|
||||||
|
@ -57,3 +63,5 @@ export default async (error: Error | BackendError) => {
|
||||||
actions
|
actions
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export default useErrorHandler
|
||||||
|
|
|
@ -3,6 +3,7 @@ import type { RootState } from '~/store'
|
||||||
import type { Router } from 'vue-router'
|
import type { Router } from 'vue-router'
|
||||||
import type { Store } from 'vuex'
|
import type { Store } from 'vuex'
|
||||||
import { watchEffect, type App } from 'vue'
|
import { watchEffect, type App } from 'vue'
|
||||||
|
import useErrorHandler from '~/composables/useErrorHandler'
|
||||||
|
|
||||||
export const COOKIE = 'allow-tracing'
|
export const COOKIE = 'allow-tracing'
|
||||||
|
|
||||||
|
@ -28,6 +29,13 @@ const initSentry = async (app: App, router: Router, store: Store<RootState>) =>
|
||||||
],
|
],
|
||||||
debug: import.meta.env.DEV,
|
debug: import.meta.env.DEV,
|
||||||
environment: import.meta.env.MODE,
|
environment: import.meta.env.MODE,
|
||||||
|
beforeSend: (event, hint) => {
|
||||||
|
if (event.exception?.values?.some(exception => exception.mechanism?.handled === false) && hint.originalException instanceof Error) {
|
||||||
|
useErrorHandler(hint.originalException, hint.event_id)
|
||||||
|
}
|
||||||
|
|
||||||
|
return event
|
||||||
|
},
|
||||||
// Set tracesSampleRate to 1.0 to capture 100%
|
// Set tracesSampleRate to 1.0 to capture 100%
|
||||||
// of transactions for performance monitoring.
|
// of transactions for performance monitoring.
|
||||||
// We recommend adjusting this value in production
|
// We recommend adjusting this value in production
|
||||||
|
|
Loading…
Reference in New Issue