xref: /MusicFree/src/utils/stateMapper.ts (revision 6704747af84cebd842b258efac7143542722fac5)
1import {useEffect, useState} from 'react';
2
3export default class StateMapper<T> {
4  private getFun: () => T;
5  private cbs: Set<Function> = new Set([]);
6  constructor(getFun: () => T) {
7    this.getFun = getFun;
8  }
9
10  notify = () => {
11    this.cbs.forEach(_ => _?.());
12  }
13
14  useMappedState = () => {
15    const [_state, _setState] = useState<T>(this.getFun);
16    const updateState = () => {
17      _setState(this.getFun());
18    };
19    useEffect(() => {
20      this.cbs.add(updateState);
21      return () => {
22        this.cbs.delete(updateState);
23      };
24    }, []);
25    return _state;
26  }
27}
28