advisor-state.ts 2.7 KB

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