import { defineStore } from "pinia"; import type { LogMessage } from "@/types/SettingTypes"; import type { AutoReconnectingWebsocket } from "@/lib/AutoReconnectingWebsocket"; import type { PipelineResult } from "@/types/PhotonTrackingTypes"; import type { WebsocketCalibrationData, WebsocketLogMessage, WebsocketNTUpdate, WebsocketPipelineResultUpdate } from "@/types/WebsocketDataTypes"; export interface NTConnectionStatus { connected: boolean, address?: string, clients?: number } interface StateStore { backendConnected: boolean, websocket?: AutoReconnectingWebsocket, ntConnectionStatus: NTConnectionStatus, showLogModal: boolean, sidebarFolded: boolean, logMessages: LogMessage[] currentCameraIndex: number, pipelineResults?: PipelineResult, colorPickingMode: boolean, calibrationData: { imageCount: number, videoFormatIndex: number, minimumImageCount: number, hasEnoughImages: boolean }, snackbarData: { show: boolean, message: string, color: string, timeout: number } } export const useStateStore = defineStore("state", { state: (): StateStore => { return { backendConnected: false, websocket: undefined, ntConnectionStatus: { connected: false }, showLogModal: false, // Ignored if the display is too small sidebarFolded: localStorage.getItem("sidebarFolded") === null ? false : localStorage.getItem("sidebarFolded") === "true", logMessages: [], currentCameraIndex: 0, pipelineResults: undefined, colorPickingMode: false, calibrationData: { imageCount: 0, videoFormatIndex: 0, minimumImageCount: 12, hasEnoughImages: false }, snackbarData: { show: false, message: "No Message", color: "info", timeout: 2000 } }; }, actions: { setSidebarFolded(value: boolean) { this.sidebarFolded = value; localStorage.setItem("sidebarFolded", Boolean(value).toString()); }, addLogFromWebsocket(data: WebsocketLogMessage) { this.logMessages.push({ level: data.logMessage.logLevel, message: data.logMessage.logMessage }); }, updateNTConnectionStatusFromWebsocket(data: WebsocketNTUpdate) { this.ntConnectionStatus = { connected: data.connected, address: data.address, clients: data.clients }; }, updatePipelineResultsFromWebsocket(data: WebsocketPipelineResultUpdate) { for(const cameraIndex in data) { if(parseInt(cameraIndex) === this.currentCameraIndex) { this.pipelineResults = data[cameraIndex]; } } }, updateCalibrationStateValuesFromWebsocket(data: WebsocketCalibrationData) { this.calibrationData = { imageCount: data.count, videoFormatIndex: data.videoModeIndex, minimumImageCount: data.minCount, hasEnoughImages: data.hasEnough }; }, showSnackbarMessage(data: { message: string, color: string, timeout?: number }) { this.snackbarData = { show: true, message: data.message, color: data.color, timeout: data.timeout || 2000 }; } } });