// Which CUST_Printer (by CupsName) return labels print to on this device — // switchable via the nav-bar picker (RmasReturnLabelPrinterPicker, admin // only), remembered per browser like the click-to-dial extension // (localStorage.logship_dial_ext in DialButton.vue). const LS_KEY = 'logship_return_label_printer' const readRemembered = () => { try { return localStorage.getItem(LS_KEY) || '' } catch { return '' } } const remember = (v: string) => { try { if (v) localStorage.setItem(LS_KEY, v) else localStorage.removeItem(LS_KEY) } catch { /* ignore */ } } export const useReturnLabelPrinter = () => { const queue = useReturnLabelPrinterQueue() const { data: printersData } = useLookup('/api/printers') const labelPrinters = computed(() => (printersData.value?.records || []).filter((p: any) => p.printerType === 'lab')) // Hydrate from localStorage strictly after mount (never in setup) so the // client's first render matches SSR markup — this then lands as a normal // reactive update, not a hydration mismatch. onMounted(() => { const remembered = readRemembered() if (remembered) queue.value = remembered }) // Snap a stale/empty/deleted-printer selection to a valid one, same idiom // as bom-productions.vue's paperPrinters watch. Fallback: org's isDefault // lab printer, else the lab printer with the smallest id (deterministic). watch(labelPrinters, (printers) => { if (printers.length === 0) return if (printers.some((p: any) => p.cupsName === queue.value)) return const byId = [...printers].sort((a: any, b: any) => a.id - b.id) queue.value = (printers.find((p: any) => p.isDefault) || byId[0]).cupsName }, { immediate: true }) watch(queue, (v) => remember(v)) return { queue, labelPrinters } }