summaryrefslogtreecommitdiff
path: root/frontend/src/utils/hooks/useSetting.ts
blob: 2425ed16dc82efb9343e509c178a40058d1485f7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import { useEffect, useState } from 'react';

interface GetSettingArgs<T> {
  key: string;
  default: T;
}

interface SetSettingArgs<T> {
  key: string;
  value: T;
}

export function useSetting<T>(key: string, def: T): [value: T | null, setValue: (value: T) => void] {
  const [value, setValue] = useState(def);
  const [ready, setReady] = useState<boolean>(false);

  useEffect(() => {
    (async () => {
      const res = (await window.DeckyPluginLoader.callServerMethod('get_setting', {
        key,
        default: def,
      } as GetSettingArgs<T>)) as { result: T };
      setReady(true);
      setValue(res.result);
    })();
  }, []);

  useEffect(() => {
    if (ready)
      (async () => {
        await window.DeckyPluginLoader.callServerMethod('set_setting', {
          key,
          value,
        } as SetSettingArgs<T>);
      })();
  }, [value]);

  return [value, setValue];
}