/** * Zebra Browser Print 연동 * - 지브라 공식 "Zebra Browser Print" 앱(Windows/macOS/Android)과 웹 페이지 통신 * - 앱 설치 시 네트워크·Bluetooth 프린터 발견 후 ZPL 전송 가능 (Chrome 권장) * - Android: Browser Print APK 설치 시 Chrome에서 목록에 안 나오는 문제 우회 가능 * 참고: https://developer.zebra.com/products/printers/browser-print */ const BROWSER_PRINT_SCRIPT_URL = "https://cdn.jsdelivr.net/npm/zebra-browser-print-min@3.0.216/BrowserPrint-3.0.216.min.js"; /** ZebraPrintResult와 동일한 형태 (zebraBluetooth와 공유) */ export interface ZebraPrintResult { success: boolean; message: string; } declare global { interface Window { BrowserPrint?: { getDefaultDevice: ( type: string, onSuccess: (device: BrowserPrintDevice) => void, onError: (err: string) => void ) => void; }; } } interface BrowserPrintDevice { send: ( data: string, onSuccess: () => void, onError: (err: string) => void ) => void; } let scriptLoadPromise: Promise | null = null; /** Browser Print 스크립트를 한 번만 동적 로드 */ function loadBrowserPrintScript(): Promise { if (typeof window === "undefined") return Promise.resolve(false); if (window.BrowserPrint) return Promise.resolve(true); if (scriptLoadPromise) return scriptLoadPromise; scriptLoadPromise = new Promise((resolve) => { const existing = document.querySelector( `script[src="${BROWSER_PRINT_SCRIPT_URL}"]` ); if (existing) { resolve(!!window.BrowserPrint); return; } const script = document.createElement("script"); script.src = BROWSER_PRINT_SCRIPT_URL; script.async = true; script.onload = () => resolve(!!window.BrowserPrint); script.onerror = () => resolve(false); document.head.appendChild(script); }); return scriptLoadPromise; } /** Browser Print 앱이 설치되어 있고 기본 프린터를 사용할 수 있는지 확인 */ export function isBrowserPrintAvailable(): boolean { return typeof window !== "undefined" && !!window.BrowserPrint; } /** * Zebra Browser Print 앱으로 ZPL 전송 (기본 프린터 사용) * - 앱 미설치 또는 기본 프린터 없으면 실패 */ export function printZPLToBrowserPrint(zpl: string): Promise { return loadBrowserPrintScript().then((loaded) => { if (!loaded || !window.BrowserPrint) { return { success: false, message: "Zebra Browser Print 스크립트를 불러올 수 없습니다. CDN 연결을 확인하세요.", }; } return new Promise((resolve) => { window.BrowserPrint!.getDefaultDevice( "printer", (device) => { if (!device) { resolve({ success: false, message: "기본 Zebra 프린터가 설정되지 않았습니다. Browser Print 앱에서 프린터를 검색해 기본으로 지정해 주세요.", }); return; } device.send( zpl, () => resolve({ success: true, message: "Zebra Browser Print로 전송했습니다." }), (err) => resolve({ success: false, message: err || "Browser Print 전송 중 오류가 발생했습니다.", }) ); }, (err) => resolve({ success: false, message: err || "Zebra Browser Print 앱이 설치되어 있지 않거나 연결할 수 없습니다. Android에서는 'Zebra Browser Print' 앱을 설치한 뒤 Chrome에서 이 페이지를 허용해 주세요.", }) ); }); }); } /** Browser Print 앱 설치/다운로드 안내 문구 */ export function getBrowserPrintHelpMessage(): string { return "Android에서 Bluetooth 목록에 프린터가 안 나오면, Zebra 공식 'Zebra Browser Print' 앱을 설치한 뒤 앱에서 프린터를 검색·기본 설정하고, 이 사이트를 허용하면 'Zebra 프린터로 출력'으로 인쇄할 수 있습니다."; }