From d0b32f3f2bcb93473d6d4d52f50550211e087b2e Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Fri, 12 Jan 2024 13:00:26 +0100 Subject: [PATCH] Debug: Alert error when main tab is focused (#4158) --- src/util/establishMultitabRole.ts | 4 ++ src/util/handleError.ts | 62 +++++++++++++++++++------------ 2 files changed, 43 insertions(+), 23 deletions(-) diff --git a/src/util/establishMultitabRole.ts b/src/util/establishMultitabRole.ts index 6216c45f7..99705d1dc 100644 --- a/src/util/establishMultitabRole.ts +++ b/src/util/establishMultitabRole.ts @@ -182,3 +182,7 @@ export function reestablishMasterToSelf() { export const subscribeToTokenDied = addCallbackTokenDied; export const subscribeToMasterChange = addCallback; + +export function isMasterTab() { + return masterToken === token; +} diff --git a/src/util/handleError.ts b/src/util/handleError.ts index 663078edb..2df36ba6e 100644 --- a/src/util/handleError.ts +++ b/src/util/handleError.ts @@ -1,38 +1,54 @@ -import { DEBUG_ALERT_MSG } from '../config'; -import { getAllMultitabTokens } from './establishMultitabRole'; -import { throttle } from './schedulers'; -import { IS_MULTITAB_SUPPORTED } from './windowEnvironment'; +import { DEBUG, DEBUG_ALERT_MSG } from '../config'; +import { isMasterTab } from './establishMultitabRole'; -// eslint-disable-next-line prefer-destructuring -const APP_ENV = process.env.APP_ENV; +let showError = true; +let error: Error | undefined; window.addEventListener('error', handleErrorEvent); window.addEventListener('unhandledrejection', handleErrorEvent); +if (DEBUG) { + window.addEventListener('focus', () => { + if (!isMasterTab()) { + return; + } + showError = true; + if (error) { + // eslint-disable-next-line no-alert + window.alert(getErrorMessage(error)); + error = undefined; + } + }); + window.addEventListener('blur', () => { + if (!isMasterTab()) { + return; + } + showError = false; + }); +} + +export function handleError(err: Error) { + // eslint-disable-next-line no-console + console.error(err); + if (DEBUG) { + if (showError) { + // eslint-disable-next-line no-alert + window.alert(getErrorMessage(err)); + } else { + error = err; + } + } +} + function handleErrorEvent(e: ErrorEvent | PromiseRejectionEvent) { // https://stackoverflow.com/questions/49384120/resizeobserver-loop-limit-exceeded if (e instanceof ErrorEvent && e.message === 'ResizeObserver loop limit exceeded') { return; } - e.preventDefault(); - handleError(e instanceof ErrorEvent ? (e.error || e.message) : e.reason); } -const throttledAlert = throttle((message: string) => { - if (IS_MULTITAB_SUPPORTED && getAllMultitabTokens().length > 1) { - return; - } - // eslint-disable-next-line no-alert - window.alert(message); -}, 1000); - -export function handleError(err: Error) { - // eslint-disable-next-line no-console - console.error(err); - - if (APP_ENV === 'development' || APP_ENV === 'staging') { - throttledAlert(`${DEBUG_ALERT_MSG}\n\n${(err?.message) || err}\n${err?.stack}`); - } +function getErrorMessage(err: Error) { + return `${DEBUG_ALERT_MSG}\n\n${(err?.message) || err}\n${err?.stack}`; }