chore(react-helpers): improve error catching in useResizeObserver (#3058)

This commit is contained in:
Maciek 2023-03-02 10:32:42 +01:00 committed by GitHub
parent 068f7b3fc3
commit c030264211
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 30 additions and 13 deletions

View File

@ -24,6 +24,7 @@ export const Banner = () => {
<AnnouncementBanner> <AnnouncementBanner>
<div className="grid grid-cols-[auto_1fr] gap-4 font-alpha calt uppercase text-center text-lg text-white"> <div className="grid grid-cols-[auto_1fr] gap-4 font-alpha calt uppercase text-center text-lg text-white">
<button <button
className="flex items-center"
onClick={() => update({ shouldDisplayAnnouncementBanner: false })} onClick={() => update({ shouldDisplayAnnouncementBanner: false })}
> >
<Icon name="cross" className="w-6 h-6" ariaLabel="dismiss" /> <Icon name="cross" className="w-6 h-6" ariaLabel="dismiss" />

View File

@ -1,6 +1,6 @@
import { captureException } from '@sentry/react';
import debounce from 'lodash/debounce'; import debounce from 'lodash/debounce';
import { useEffect, useMemo } from 'react'; import { useCallback, useEffect, useMemo } from 'react';
import { localLoggerFactory } from '@vegaprotocol/utils';
type ResizeObserverConfiguration = { type ResizeObserverConfiguration = {
debounceTime: number; debounceTime: number;
@ -19,20 +19,26 @@ export function useResizeObserver(
callback: ResizeObserverCallback, callback: ResizeObserverCallback,
options: ResizeObserverConfiguration = DEFAULT_OPTIONS options: ResizeObserverConfiguration = DEFAULT_OPTIONS
) { ) {
const observer = useMemo(() => { const wrappedCb = useCallback(
return new ResizeObserver( (entries: ResizeObserverEntry[], observer: ResizeObserver) =>
window.requestAnimationFrame(() => {
options.debounceTime > 0 options.debounceTime > 0
? debounce(callback, options.debounceTime) ? debounce(callback, options.debounceTime)(entries, observer)
: callback : callback(entries, observer);
}),
[callback, options.debounceTime]
); );
}, [callback, options.debounceTime]);
const observer = useMemo(() => {
return new ResizeObserver(wrappedCb);
}, [wrappedCb]);
useEffect(() => { useEffect(() => {
if (!observer || !target) return; if (!observer || !target) return;
try { try {
observer.observe(target, options.config); observer.observe(target, options.config);
} catch (err) { } catch (err) {
captureException(err); localLoggerFactory({ application: 'react-helpers' }).debug(err as Error);
} }
return () => observer?.disconnect(); return () => observer?.disconnect();
}, [observer, options.config, target]); }, [observer, options.config, target]);

View File

@ -49,10 +49,10 @@ export class LocalLogger {
return LocalLogger.levelLogMap[this._logLevel]; return LocalLogger.levelLogMap[this._logLevel];
} }
private tags: string[] = []; private tags: string[] = [];
private application = 'trading'; private _application = 'trading';
constructor(conf: LoggerConf) { constructor(conf: LoggerConf) {
if (conf.application) { if (conf.application) {
this.application = conf.application; this._application = conf.application;
} }
this.tags = [...(conf.tags || [])]; this.tags = [...(conf.tags || [])];
this._logLevel = conf.logLevel || this._logLevel; this._logLevel = conf.logLevel || this._logLevel;
@ -85,7 +85,7 @@ export class LocalLogger {
) { ) {
if (this.numberLogLevel <= LocalLogger.levelLogMap[level]) { if (this.numberLogLevel <= LocalLogger.levelLogMap[level]) {
console[logMethod].apply(console, [ console[logMethod].apply(console, [
`${this.application}:${level}: `, `${this._application}:${level}: `,
...args, ...args,
]); ]);
} }
@ -148,13 +148,23 @@ export class LocalLogger {
public get logLevel() { public get logLevel() {
return this._logLevel; return this._logLevel;
} }
public get application() {
return this._application;
}
} }
let singleLoggerInstance: LocalLogger; let singleLoggerInstances: LocalLogger[];
export const localLoggerFactory = (conf: LoggerConf) => { export const localLoggerFactory = (conf: LoggerConf) => {
if (!singleLoggerInstances) {
singleLoggerInstances = [];
}
let singleLoggerInstance = singleLoggerInstances.find(
(instance) => instance.application === conf.application
);
if (!singleLoggerInstance) { if (!singleLoggerInstance) {
singleLoggerInstance = new LocalLogger(conf); singleLoggerInstance = new LocalLogger(conf);
singleLoggerInstances.push(singleLoggerInstance);
} }
if (conf.logLevel && singleLoggerInstance.logLevel !== conf.logLevel) { if (conf.logLevel && singleLoggerInstance.logLevel !== conf.logLevel) {
singleLoggerInstance.setLogLevel(conf.logLevel); singleLoggerInstance.setLogLevel(conf.logLevel);