|
|
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, |
|
|
) => ({ |
|
|
|
|
|
setSessionToken(token: string | undefined) { |
|
|
set({ sessionToken: token }); |
|
|
}, |
|
|
|
|
|
|
|
|
modelId: 1, |
|
|
|
|
|
updateModelId(id: number) { |
|
|
set(() => ({ modelId: id })); |
|
|
}, |
|
|
|
|
|
|
|
|
showSideBar: false, |
|
|
|
|
|
async setShowSideBar(open: boolean) { |
|
|
set({ showSideBar: open }); |
|
|
}, |
|
|
|
|
|
setLatestAnnouncementId(id: number) { |
|
|
set({ latestAnnouncementId: id }); |
|
|
}, |
|
|
|
|
|
|
|
|
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: { |
|
|
...DEFAULT_CONFIG, |
|
|
}, |
|
|
|
|
|
resetConfig() { |
|
|
set(() => ({ config: { ...DEFAULT_CONFIG } })); |
|
|
}, |
|
|
|
|
|
getConfig() { |
|
|
return get().config; |
|
|
}, |
|
|
|
|
|
updateConfig(updater) { |
|
|
const config = get().config; |
|
|
updater(config); |
|
|
set(() => ({ config })); |
|
|
}, |
|
|
|
|
|
clearData() { |
|
|
set((state) => ({ |
|
|
sessionToken: undefined, |
|
|
config: undefined, |
|
|
})); |
|
|
}, |
|
|
}); |
|
|
|