aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/ObservableReactComponent.tsx
blob: 394d1eae2328484f3d2c70a9aec4557a69480dfe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import { action, makeObservable, observable } from 'mobx';
import * as React from 'react';
import './AntimodeMenu.scss';

/**
 * This is an abstract class that serves as the base for a PDF-style or Marquee-style
 * menu. To use this class, look at PDFMenu.tsx or MarqueeOptionsMenu.tsx for an example.
 */
export abstract class ObservableReactComponent<T> extends React.Component<T, {}> {
    @observable _props: React.PropsWithChildren<T>;
    constructor(props: any) {
        super(props);
        this._props = props;
        makeObservable(this);
    }
    componentDidUpdate(prevProps: Readonly<T>): void {
        Object.keys(prevProps).filter(pkey => (prevProps as any)[pkey] !== (this.props as any)[pkey]).forEach(action(pkey =>
                ((this._props as any)[pkey] = (this.props as any)[pkey]))); // prettier-ignore
    }
}