import {computed} from 'vue'; import {printerClient, printerOptions} from './printerClient'; let connected = false; /** 确保单例 client 已连接(首次调用时自动连接,install 时已调 connect 则幂等) */ function ensureConnected(): void { if (connected) return; connected = true; printerClient.connect(); } /** * 打印服务客户端 Composable(yh-hiprint 版)。 * * 返回模块级单例 client 的响应式状态,悬浮球组件与 serverPrint 共享 * 同一条 WS 连接、同一份打印机列表、同一个选中的打印机。 */ export function usePrinterClient() { ensureConnected(); const status = computed(() => printerClient.status.value); const printers = computed(() => printerClient.printers.value); const selectedPrinter = computed({ get: () => printerClient.selectedPrinter.value, set: (v: string | null) => printerClient.setSelectedPrinter(v), }); const printing = computed(() => printerClient.printing.value); /** 刷新打印机列表 */ async function refreshPrinters() { try { return await printerClient.getPrinters(); } catch { return []; } } return { /** 连接状态:disconnected / connecting / connected / retry_stopped */ status, /** 打印机列表 */ printers, /** 打印机下拉选项 [{label, value}] */ printerOptions, /** 当前选中的打印机 name(可读写) */ selectedPrinter, /** 是否打印中 */ printing, /** 刷新打印机列表 */ refreshPrinters, /** 原始 client(调底层 printHtml / manualReconnect 时用) */ client: printerClient, }; }