export const useSideBar = () => useState('sideBar', () => false) export const useSideBarCollapsed = () => useState('sideBarCollapsed', () => false) export const useSideBarScroll = () => useState('sideBarScroll', () => 0) export const useTabs = () => useState('tabs', () => [{link: '/', text: 'Home', active: true}]) export const useActiveMenu = () => useState('activeMenu', () => '') export const useActiveSubMenu = () => useState('activeSubMenu', () => '') export const useActiveSubChildMenu = () => useState('activeSubChildMenu', () => '') export const useActiveSave = () => useState('activeSave', () => false) export const usePrintPreview = () => useState('printPreview', () => false) export const usePrintParam = () => useState('printParam', () => {}) export const useAttachmentPreview = () => useState('attachmentPreview', () => false) export const useAttachmentParam = () => useState('attachmentParam', () => {}) export const useQuickView = () => useState('quickView', () => '') export const useQuickViewParam = () => useState('quickViewParam', () => {}) export const useWindowFrom = () => useState('windowFrom', () => '') export const useWindowParam = () => useState('windowParam', () => {}) export const useGenerateShipments = () => useState('generateShipments', () => {}) export const useGenerateShipmentActive = () => useState('generateShipmentActive', () => false) export const useGenerateInvoices = () => useState('generateInvoices', () => {}) export const useGenerateInvoiceActive = () => useState('generateInvoiceActive', () => false) export const useDataTableFilters = () => useState('dataTableFilters', () => {}) export const useBoMTab = () => useState('boMTab', () => 'bom') export const useBoMActive = () => useState('boMActive', () => false) export const useBoM = () => useState('boM', () => {}) export const useEmailInvoice = () => useState('emailInvoice', () => false) export const useEmailInvoiceParam = () => useState('emailInvoiceParam', () => {}) export const usePaymentReminder = () => useState('paymentReminder', () => false) export const usePaymentReminderParam = () => useState('paymentReminderParam', () => {}) export const useBatchPrintPreview = () => useState('batchPrintPreview', () => false) export const useBatchPrintParam = () => useState('batchPrintParam', () => []) export const useStockReportEmail = () => useState('stockReportEmail', () => false) export const useStockReportEmailParam = () => useState('stockReportEmailParam', () => {}) export const useTransactionReportEmail = () => useState('transactionReportEmail', () => false) export const useTransactionReportEmailParam = () => useState('transactionReportEmailParam', () => {}) export const useMarginReportEmail = () => useState('marginReportEmail', () => false) export const useMarginReportEmailParam = () => useState('marginReportEmailParam', () => {}) export const useQuickPayment = () => useState('quickPayment', () => false) export const useQuickPaymentParam = () => useState('quickPaymentParam', () => {}) export const useReminderNotes = () => useState('reminderNotes', () => false) export const useReminderNotesParam = () => useState('reminderNotesParam', () => ({})) // Order comparison modal — current order vs. previous completed order of the same partner. export const useOrderCompare = () => useState('orderCompare', () => false) export const useOrderCompareParam = () => useState('orderCompareParam', () => ({})) export const useMarketplaceConfirmLog = () => useState('marketplaceConfirmLog', () => false) export const useMarketplaceConfirmLogParam = () => useState('marketplaceConfirmLogParam', () => ({})) export const useOpenShipmentsModal = () => useState('openShipmentsModal', () => false) export const useOpenShipmentsModalParam = () => useState('openShipmentsModalParam', () => ({})) // Dashboard "Picking" picklist generator (sort options + server/download output). export const usePicklistModal = () => useState('picklistModal', () => false) export const usePicklistModalParam = () => useState('picklistModalParam', () => ({})) export const useOpenOrdersModal = () => useState('openOrdersModal', () => false) export const useOpenOrdersModalParam = () => useState('openOrdersModalParam', () => ({})) // Staff live-chat module state (all additive; safe to remove with the module). export const useChatOpen = () => useState('chatOpen', () => false) export const useChatActivePeer = () => useState('chatActivePeer', () => null) export const useChatPresence = () => useState>('chatPresence', () => ({})) export const useChatUnread = () => useState>('chatUnread', () => ({})) export const useChatConnected = () => useState('chatConnected', () => false) export const useChatThreads = () => useState>('chatThreads', () => ({})) // Per-peer "is typing" flags (ephemeral, never persisted). export const useChatTyping = () => useState>('chatTyping', () => ({})) // Pending ERP-entity share waiting to be sent into a conversation: // { kind:'entity', entityType, entityId, label, url } | null. export const useChatShare = () => useState('chatShare', () => null) // Inbound-sound mute preference (seeded from localStorage on the client). export const useChatSoundMuted = () => useState('chatSoundMuted', () => false) export interface ActiveTaskTimerState { // Which timer flow on mobile/tasks.vue currently owns this state — the two // flows are mutually exclusive there, so one shared state is enough to feed // a cross-page "timer running" banner (see app/layouts/mobile.vue). kind: 'new-task' | 'existing-request' | null running: boolean paused: boolean startTime: number | null pausedElapsedMs: number categoryName: string // new-task flow only orgName: string requestId: number | null // existing-request flow only documentNo: string // existing-request flow only } export const useActiveTaskTimer = () => useState('activeTaskTimer', () => ({ kind: null, running: false, paused: false, startTime: null, pausedElapsedMs: 0, categoryName: '', orgName: '', requestId: null, documentNo: '' })) // Dunning gate (TerminationGuard): null = not yet fetched; else the // /api/invoices/termination-status response { notice, terminated, invoices, totalOpen, sessionKey }. export const useTerminationStatus = () => useState('terminationStatus', () => null) // Fullscreen ticket quick-view modal on the dashboard (list + chat + quick edits). export const useTicketQuickModal = () => useState('ticketQuickModal', () => false) // "Set a Lexoffice booking category?" prompt shown before a Lexoffice upload (single // or bulk — same modal, same category applies to every invoice in the call). param // holds { count, resolve } where resolve(categoryId | null | undefined) is called by // the modal — see app/composables/useLexofficeCategoryPrompt.ts. export const useLexofficeCategoryModal = () => useState('lexofficeCategoryModal', () => false) export const useLexofficeCategoryParam = () => useState('lexofficeCategoryParam', () => ({})) // Bumped by the product page's "Bestand je Lagerplatz" card after a completed // in-page stock action (count / receipt / movement) so sibling components that // render storage data (e.g. the "Located at" tab) refetch without a reload. export const useProductStockVersion = () => useState('productStockVersion', () => 0) // The CUST_Printer.CupsName selected for return-label printing on this // device/session — set by the nav-bar picker, consulted by the return pages. // See app/composables/useReturnLabelPrinter.ts. export const useReturnLabelPrinterQueue = () => useState('returnLabelPrinterQueue', () => '')