app-state.ts87 lines · main
1import { LOCAL_STORAGE_KEYS as COMMON_LOCAL_STORAGE_KEYS } from 'common'
2import { proxy, snapshot, useSnapshot } from 'valtio'
3
4const getInitialState = () => {
5 return {
6 activeDocsSection: ['introduction'],
7 docsLanguage: 'js',
8 showProjectApiDocs: false,
9 showCreateBranchModal: false,
10 showAiSettingsModal: false,
11 ongoingQueriesPanelOpen: false,
12 mobileMenuOpen: false,
13 showSidebar: true,
14 showEditorPanel: false,
15 lastRouteBeforeVisitingAccountPage: '',
16 }
17}
18
19export const appState = proxy({
20 ...getInitialState(),
21
22 activeDocsSection: ['introduction'],
23 docsLanguage: 'js' as 'js' | 'bash',
24 showProjectApiDocs: false,
25 setShowProjectApiDocs: (value: boolean) => {
26 appState.showProjectApiDocs = value
27 },
28 setActiveDocsSection: (value: string[]) => {
29 appState.activeDocsSection = value
30 },
31 setDocsLanguage: (value: 'js' | 'bash') => {
32 appState.docsLanguage = value
33 },
34
35 isOptedInTelemetry: false,
36 setIsOptedInTelemetry: (value: boolean | null) => {
37 appState.isOptedInTelemetry = value === null ? false : value
38 if (typeof window !== 'undefined' && value !== null) {
39 localStorage.setItem(COMMON_LOCAL_STORAGE_KEYS.TELEMETRY_CONSENT, value.toString())
40 }
41 },
42
43 isMfaEnforced: false,
44 setIsMfaEnforced: (value: boolean) => {
45 appState.isMfaEnforced = value
46 },
47
48 showCreateBranchModal: false,
49 setShowCreateBranchModal: (value: boolean) => {
50 appState.showCreateBranchModal = value
51 },
52
53 showAiSettingsModal: false,
54 setShowAiSettingsModal: (value: boolean) => {
55 appState.showAiSettingsModal = value
56 },
57
58 showSidebar: true,
59 setShowSidebar: (value: boolean) => {
60 appState.showSidebar = value
61 },
62
63 showOngoingQueriesPanelOpen: false,
64 setOnGoingQueriesPanelOpen: (value: boolean) => {
65 appState.ongoingQueriesPanelOpen = value
66 },
67
68 mobileMenuOpen: false,
69 setMobileMenuOpen: (value: boolean) => {
70 appState.mobileMenuOpen = value
71 },
72
73 connectSheetSource: 'header_button' as 'header_button' | 'connect_section',
74 setConnectSheetSource: (value: 'header_button' | 'connect_section') => {
75 appState.connectSheetSource = value
76 },
77
78 lastRouteBeforeVisitingAccountPage: '',
79 setLastRouteBeforeVisitingAccountPage: (value: string) => {
80 appState.lastRouteBeforeVisitingAccountPage = value
81 },
82})
83
84export const getAppStateSnapshot = () => snapshot(appState)
85
86export const useAppStateSnapshot = (options?: Parameters<typeof useSnapshot>[1]) =>
87 useSnapshot(appState, options)