aboutsummaryrefslogtreecommitdiff
path: root/packages/merchant-backoffice-ui/src/hooks/preference.ts
blob: 70542265413093b5a73cbff7439548a4bf47ec36 (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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*
 This file is part of GNU Taler
 (C) 2021-2024 Taler Systems S.A.

 GNU Taler is free software; you can redistribute it and/or modify it under the
 terms of the GNU General Public License as published by the Free Software
 Foundation; either version 3, or (at your option) any later version.

 GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
 A PARTICULAR PURPOSE.  See the GNU General Public License for more details.

 You should have received a copy of the GNU General Public License along with
 GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
 */

import {
  AbsoluteTime,
  Codec,
  buildCodecForObject,
  codecForAbsoluteTime,
  codecForBoolean,
  codecForConstString,
  codecForEither,
} from "@gnu-taler/taler-util";
import { buildStorageKey, useLocalStorage } from "@gnu-taler/web-util/browser";

export interface Preferences {
  advanceOrderMode: boolean;
  advanceInstanceMode: boolean;
  developerMode: boolean;
  hideKycUntil: AbsoluteTime;
  hideMissingAccountUntil: AbsoluteTime;
  dateFormat: "ymd" | "dmy" | "mdy";
}

const defaultSettings: Preferences = {
  advanceOrderMode: false,
  advanceInstanceMode: false,
  developerMode: false,
  hideKycUntil: AbsoluteTime.never(),
  hideMissingAccountUntil: AbsoluteTime.never(),
  dateFormat: "ymd",
};

export const codecForPreferences = (): Codec<Preferences> =>
  buildCodecForObject<Preferences>()
    .property("advanceOrderMode", codecForBoolean())
    .property("advanceInstanceMode", codecForBoolean())
    .property("developerMode", codecForBoolean())
    .property("hideKycUntil", codecForAbsoluteTime)
    .property("hideMissingAccountUntil", codecForAbsoluteTime)
    .property(
      "dateFormat",
      codecForEither(
        codecForConstString("ymd"),
        codecForConstString("dmy"),
        codecForConstString("mdy"),
      ),
    )
    .build("Preferences");

const PREFERENCES_KEY = buildStorageKey(
  "merchant-preferences",
  codecForPreferences(),
);

export function usePreference(): [
  Readonly<Preferences>,
  <T extends keyof Preferences>(key: T, value: Preferences[T]) => void,
  (s: Preferences) => void,
] {
  const { value, update } = useLocalStorage(PREFERENCES_KEY, defaultSettings);
  function updateField<T extends keyof Preferences>(k: T, v: Preferences[T]) {
    const newValue = { ...value, [k]: v };
    update(newValue);
  }

  return [value, updateField, update];
}

export function dateFormatForSettings(s: Preferences): string {
  switch (s.dateFormat) {
    case "ymd":
      return "yyyy/MM/dd";
    case "dmy":
      return "dd/MM/yyyy";
    case "mdy":
      return "MM/dd/yyyy";
  }
}

export function datetimeFormatForSettings(s: Preferences): string {
  return dateFormatForSettings(s) + " HH:mm:ss";
}