advisor-state.ts78 lines · main
1import { proxy, snapshot, useSnapshot } from 'valtio'
2
3export type AdvisorTab = 'all' | 'security' | 'performance' | 'messages'
4export type AdvisorSeverity = 'critical' | 'warning' | 'info'
5export type AdvisorItemSource = 'lint' | 'notification' | 'signal'
6
7const initialState = {
8 activeTab: 'all' as AdvisorTab,
9 severityFilters: ['critical', 'warning'] as AdvisorSeverity[],
10 selectedItemId: undefined as string | undefined,
11 selectedItemSource: undefined as AdvisorItemSource | undefined,
12 // Notification filters
13 notificationFilterStatuses: [] as string[],
14 notificationFilterPriorities: [] as string[],
15 get numNotificationFiltersApplied() {
16 return [...this.notificationFilterStatuses, ...this.notificationFilterPriorities].length
17 },
18}
19
20export const advisorState = proxy({
21 ...initialState,
22 setActiveTab(tab: AdvisorTab) {
23 advisorState.activeTab = tab
24 },
25 setSeverityFilters(severities: AdvisorSeverity[]) {
26 advisorState.severityFilters = severities
27 },
28 clearSeverityFilters() {
29 advisorState.severityFilters = []
30 },
31 setSelectedItem(id: string | undefined, source?: AdvisorItemSource) {
32 advisorState.selectedItemId = id
33 advisorState.selectedItemSource = source
34 },
35 focusItem({ id, tab, source }: { id: string; tab?: AdvisorTab; source?: AdvisorItemSource }) {
36 if (tab) {
37 advisorState.activeTab = tab
38 }
39 advisorState.selectedItemId = id
40 advisorState.selectedItemSource = source
41 },
42 setNotificationFilters: (value: string, type: 'status' | 'priority') => {
43 switch (type) {
44 case 'status':
45 if (advisorState.notificationFilterStatuses.includes(value)) {
46 advisorState.notificationFilterStatuses = advisorState.notificationFilterStatuses.filter(
47 (x) => x !== value
48 )
49 } else {
50 advisorState.notificationFilterStatuses = advisorState.notificationFilterStatuses.concat([
51 value,
52 ])
53 }
54 break
55 case 'priority':
56 if (advisorState.notificationFilterPriorities.includes(value)) {
57 advisorState.notificationFilterPriorities =
58 advisorState.notificationFilterPriorities.filter((x) => x !== value)
59 } else {
60 advisorState.notificationFilterPriorities =
61 advisorState.notificationFilterPriorities.concat([value])
62 }
63 break
64 }
65 },
66 resetNotificationFilters() {
67 advisorState.notificationFilterStatuses = []
68 advisorState.notificationFilterPriorities = []
69 },
70 reset() {
71 Object.assign(advisorState, initialState)
72 },
73})
74
75export const getAdvisorStateSnapshot = () => snapshot(advisorState)
76
77export const useAdvisorStateSnapshot = (options?: Parameters<typeof useSnapshot>[1]) =>
78 useSnapshot(advisorState, options)