import type { Dispatch, RefObject, SetStateAction } from "react"; import { Printer } from "../../components/Printer"; import type { PrinterConfig } from "../printer.types"; import { createPrintForId } from "./createPrintForId"; import type { PrinterRuntimeState, UnprintedQueueEntry } from "./internalTypes"; import { ConnectionStatus, PrintResult } from "../PrinterProvider.enum"; export type PrintFn = (opts?: { retryOnError?: boolean; }) => Promise<{ printResult: PrintResult; }>; export type PrinterRegistry = { printersRef: RefObject; printersKey: string; printerIdSet: ReadonlySet; instanceEpoch: number; instancesRef: RefObject>; /** Source of truth for per-id status. Read via `getStatusForId`; mutate via `setStatusForId`. */ statusByIdRef: RefObject>; /** Bumps on every real status change. Used as a re-run trigger by internal effects; NOT exposed to consumers. */ statusVersion: number; subscribeToStatus: (id: string, callback: () => void) => () => void; getStatusForId: (id: string) => ConnectionStatus; unprintedById: Record; setStatusForId: (id: string, status: ConnectionStatus) => void; printForId: ReturnType; /** Returns a stable per-id `print` wrapper. Same reference across renders for the same id. */ getPrintForId: (id: string) => PrintFn; setUnprintedById: Dispatch>>; }; /** * Holds printer instances, the per-id status store, retry queues, and `printForId`. * Status lives in a ref-backed pub/sub store so heartbeat ticks don't re-render * consumers of unrelated ids. `printersKey` only changes when the effective * printer list/config changes (not when the array reference alone changes). */ export declare function usePrinterRegistry(printers: PrinterConfig[], testMode?: boolean): PrinterRegistry;