import { create } from 'zustand' import { persist } from 'zustand/middleware' export interface DetectorType { detector_id: number name: string serial_number: string object: string status: string type: string detector_type: string location: string floor: number checked: boolean notifications: Array<{ id: number type: string message: string timestamp: string acknowledged: boolean priority: string }> } interface NotificationType { id: number detector_id: number detector_name: string type: string status: string message: string timestamp: string location: string object: string acknowledged: boolean priority: string } interface AlertType { id: number detector_id: number detector_name: string type: string status: string message: string timestamp: string location: string object: string acknowledged: boolean priority: string } export interface NavigationStore { currentObject: { id: string | undefined; title: string | undefined } navigationHistory: string[] currentSubmenu: string | null currentModelPath: string | null showMonitoring: boolean showFloorNavigation: boolean showNotifications: boolean showListOfDetectors: boolean showSensors: boolean selectedDetector: DetectorType | null showDetectorMenu: boolean selectedNotification: NotificationType | null showNotificationDetectorInfo: boolean selectedAlert: AlertType | null showAlertMenu: boolean setCurrentObject: (id: string | undefined, title: string | undefined) => void clearCurrentObject: () => void addToHistory: (path: string) => void goBack: () => string | null setCurrentModelPath: (path: string) => void setCurrentSubmenu: (submenu: string | null) => void clearSubmenu: () => void openMonitoring: () => void closeMonitoring: () => void openFloorNavigation: () => void closeFloorNavigation: () => void openNotifications: () => void closeNotifications: () => void openListOfDetectors: () => void closeListOfDetectors: () => void openSensors: () => void closeSensors: () => void closeAllMenus: () => void setSelectedDetector: (detector: DetectorType | null) => void setShowDetectorMenu: (show: boolean) => void setSelectedNotification: (notification: NotificationType | null) => void setShowNotificationDetectorInfo: (show: boolean) => void setSelectedAlert: (alert: AlertType | null) => void setShowAlertMenu: (show: boolean) => void isOnNavigationPage: () => boolean getCurrentRoute: () => string | null getActiveSidebarItem: () => number PREFERRED_MODEL: string } const useNavigationStore = create()( persist( (set, get) => ({ currentObject: { id: undefined, title: undefined, }, navigationHistory: [], currentSubmenu: null, currentModelPath: null, showMonitoring: false, showFloorNavigation: false, showNotifications: false, showListOfDetectors: false, showSensors: false, selectedDetector: null, showDetectorMenu: false, selectedNotification: null, showNotificationDetectorInfo: false, selectedAlert: null, showAlertMenu: false, PREFERRED_MODEL: 'AerBIM-Monitor_ASM-HT-Viewer_Expo2017Astana_20250910', setCurrentObject: (id: string | undefined, title: string | undefined) => set({ currentObject: { id, title } }), clearCurrentObject: () => set({ currentObject: { id: undefined, title: undefined } }), setCurrentModelPath: (path: string) => set({ currentModelPath: path }), addToHistory: (path: string) => { const { navigationHistory } = get() const newHistory = [...navigationHistory, path] if (newHistory.length > 10) { newHistory.shift() } set({ navigationHistory: newHistory }) }, goBack: () => { const { navigationHistory } = get() if (navigationHistory.length > 1) { const newHistory = [...navigationHistory] newHistory.pop() const previousPage = newHistory.pop() set({ navigationHistory: newHistory }) return previousPage || null } return null }, setCurrentSubmenu: (submenu: string | null) => set({ currentSubmenu: submenu }), clearSubmenu: () => set({ currentSubmenu: null }), openMonitoring: () => set({ showMonitoring: true, showFloorNavigation: false, showNotifications: false, showListOfDetectors: false, currentSubmenu: 'monitoring', showDetectorMenu: false, selectedDetector: null, showNotificationDetectorInfo: false, selectedNotification: null }), closeMonitoring: () => set({ showMonitoring: false, currentSubmenu: null }), openFloorNavigation: () => set({ showFloorNavigation: true, showMonitoring: false, showNotifications: false, showListOfDetectors: false, currentSubmenu: 'floors', showNotificationDetectorInfo: false, selectedNotification: null }), closeFloorNavigation: () => set({ showFloorNavigation: false, showDetectorMenu: false, selectedDetector: null, currentSubmenu: null }), openNotifications: () => set({ showNotifications: true, showMonitoring: false, showFloorNavigation: false, showListOfDetectors: false, currentSubmenu: 'notifications', showDetectorMenu: false, selectedDetector: null }), closeNotifications: () => set({ showNotifications: false, showNotificationDetectorInfo: false, selectedNotification: null, currentSubmenu: null }), openListOfDetectors: () => set({ showListOfDetectors: true, showMonitoring: false, showFloorNavigation: false, showNotifications: false, currentSubmenu: 'detectors', showDetectorMenu: false, selectedDetector: null, showNotificationDetectorInfo: false, selectedNotification: null }), closeListOfDetectors: () => set({ showListOfDetectors: false, showDetectorMenu: false, selectedDetector: null, currentSubmenu: null }), openSensors: () => set({ showSensors: true, showMonitoring: false, showFloorNavigation: false, showNotifications: false, showListOfDetectors: false, currentSubmenu: 'sensors', showDetectorMenu: false, selectedDetector: null, showNotificationDetectorInfo: false, selectedNotification: null }), closeSensors: () => set({ showSensors: false, showDetectorMenu: false, selectedDetector: null, currentSubmenu: null }), closeAllMenus: () => set({ showMonitoring: false, showFloorNavigation: false, showNotifications: false, showListOfDetectors: false, showSensors: false, showDetectorMenu: false, selectedDetector: null, showNotificationDetectorInfo: false, selectedNotification: null, showAlertMenu: false, selectedAlert: null, currentSubmenu: null }), setSelectedDetector: (detector: DetectorType | null) => set({ selectedDetector: detector }), setShowDetectorMenu: (show: boolean) => set({ showDetectorMenu: show }), setSelectedNotification: (notification: NotificationType | null) => set({ selectedNotification: notification }), setShowNotificationDetectorInfo: (show: boolean) => set({ showNotificationDetectorInfo: show }), setSelectedAlert: (alert: AlertType | null) => set({ selectedAlert: alert }), setShowAlertMenu: (show: boolean) => set({ showAlertMenu: show }), isOnNavigationPage: () => { const { navigationHistory } = get() const currentRoute = navigationHistory[navigationHistory.length - 1] return currentRoute === '/navigation' }, getCurrentRoute: () => { const { navigationHistory } = get() return navigationHistory[navigationHistory.length - 1] || null }, getActiveSidebarItem: () => { const { showMonitoring, showFloorNavigation, showNotifications, showListOfDetectors, showSensors } = get() if (showMonitoring) return 3 // Зоны Мониторинга if (showFloorNavigation) return 4 // Навигация по этажам if (showNotifications) return 5 // Уведомления if (showListOfDetectors) return 7 // Список датчиков if (showSensors) return 8 // Сенсоры return 2 // Навигация (базовая) } }), { name: 'navigation-store', } ) ) export default useNavigationStore