fix: defer Web Bluetooth check and implement mobile-specific print fallback for POS receipts

This commit is contained in:
Suherdy Yacob 2026-05-25 10:15:29 +07:00
parent 0f225a7bfb
commit 464bbc3067

View File

@ -70,14 +70,6 @@ patch(PosPrinterService.prototype, {
console.log('[BluetoothPrint] Element tag:', el?.tagName); console.log('[BluetoothPrint] Element tag:', el?.tagName);
console.log('[BluetoothPrint] Element classes:', el?.className); console.log('[BluetoothPrint] Element classes:', el?.className);
// Check if Web Bluetooth API is available
if (!navigator.bluetooth) {
console.log('[BluetoothPrint] Web Bluetooth API not available, using browser print dialog');
await this._printViaBrowserDialog(el);
return true;
}
console.log('[BluetoothPrint] Web Bluetooth API available');
// Check if a Bluetooth printer is configured (from localStorage) // Check if a Bluetooth printer is configured (from localStorage)
const storage = new BluetoothPrinterStorage(); const storage = new BluetoothPrinterStorage();
@ -101,6 +93,14 @@ patch(PosPrinterService.prototype, {
} }
} }
// Check if Web Bluetooth API is available
if (!navigator.bluetooth) {
console.log('[BluetoothPrint] Web Bluetooth API not available, using browser print dialog');
await this._printViaBrowserDialog(el);
return true;
}
console.log('[BluetoothPrint] Web Bluetooth API available');
const config = storage.loadConfiguration(posConfigId); const config = storage.loadConfiguration(posConfigId);
if (!config || !config.deviceId) { if (!config || !config.deviceId) {
@ -196,6 +196,21 @@ patch(PosPrinterService.prototype, {
async _printViaBrowserDialog(el) { async _printViaBrowserDialog(el) {
console.log('[BluetoothPrint] Opening browser print dialog...'); console.log('[BluetoothPrint] Opening browser print dialog...');
// Detect if mobile OS (Android, iOS, etc.) or WebView where iframe printing doesn't work
const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
if (isMobile) {
console.log('[BluetoothPrint] Mobile or WebView environment detected. Falling back to native printWeb on main window.');
try {
this.printWeb(el);
return true;
} catch (e) {
console.error('[BluetoothPrint] printWeb failed, calling window.print directly:', e);
window.print(el);
return true;
}
}
return new Promise((resolve) => { return new Promise((resolve) => {
// Create a hidden iframe for printing // Create a hidden iframe for printing
const printFrame = document.createElement('iframe'); const printFrame = document.createElement('iframe');