// Copyright 2022 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only /* eslint-disable no-console */ import React from 'react'; export abstract class PureComponentProfiler< Props extends Record, State extends Record > extends React.Component { public override shouldComponentUpdate( nextProps: Props, nextState: State ): boolean { console.group(`PureComponentProfiler(${this.props.id})`); const propKeys = new Set([ ...Object.keys(nextProps), ...Object.keys(this.props), ]); const stateKeys = new Set([ ...Object.keys(nextState ?? {}), ...Object.keys(this.state ?? {}), ]); let result = false; for (const key of propKeys) { if (nextProps[key] !== this.props[key]) { console.error( `propUpdated(${key})`, this.props[key], '=>', nextProps[key] ); result = true; } } for (const key of stateKeys) { if (nextState[key] !== this.state[key]) { console.error( `stateUpdated(${key}):`, this.state[key], '=>', nextState[key] ); result = true; } } console.groupEnd(); return result; } }