File size: 1,808 Bytes
db242f8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import { StateCreator } from 'zustand';

import { LocalConfig, SharedSlice, StoreType } from '@/store/types';

export enum SubmitKey {
  Enter = 'Enter',
  CtrlEnter = 'Ctrl + Enter',
  ShiftEnter = 'Shift + Enter',
  AltEnter = 'Alt + Enter',
  MetaEnter = 'Meta + Enter',
}

export enum Theme {
  Auto = 'auto',
  Dark = 'dark',
  Light = 'light',
}

const DEFAULT_CONFIG: LocalConfig = {
  theme: Theme.Auto as Theme,
  tightBorder: false,
  submitKey: SubmitKey.Enter as SubmitKey,
};

export const createSharedStore: StateCreator<StoreType, [], [], SharedSlice> = (
  set,
  get,
) => ({
  // Auth
  setSessionToken(token: string | undefined) {
    set({ sessionToken: token });
  },

  // Model
  modelId: 1,

  updateModelId(id: number) {
    set(() => ({ modelId: id }));
  },

  // Sidebar
  showSideBar: false,

  async setShowSideBar(open: boolean) {
    set({ showSideBar: open });
  },

  setLatestAnnouncementId(id: number) {
    set({ latestAnnouncementId: id });
  },

  // utils
  fetcher(url: string, init?: RequestInit) {
    return fetch(`/api${url}`, {
      ...init,
      headers: {
        ...init?.headers,
        'Content-Type': 'application/json',
        Authorization: `Bearer ${get().sessionToken}`,
      },
    }).then((res) => {
      if (res.status === 401) {
        set({ sessionToken: undefined });
      }
      return res;
    });
  },
  // Config
  config: {
    ...DEFAULT_CONFIG,
  },

  resetConfig() {
    set(() => ({ config: { ...DEFAULT_CONFIG } }));
  },

  getConfig() {
    return get().config;
  },

  updateConfig(updater) {
    const config = get().config;
    updater(config);
    set(() => ({ config }));
  },
  /* Reset persist storage */
  clearData() {
    set((state) => ({
      sessionToken: undefined,
      config: undefined,
    }));
  },
});