const { contextBridge, ipcRenderer } = require('electron'); // 加载jsQR库 let jsQRLib = null; try { // 直接require jsqr模块 const jsqrModule = require('jsqr'); // 处理ES module的default export jsQRLib = jsqrModule.default || jsqrModule; console.log('jsQR loaded successfully:', typeof jsQRLib); } catch (e) { console.error('Failed to load jsQR:', e); } contextBridge.exposeInMainWorld('api', { // Vault operations getVaults: () => ipcRenderer.invoke('db:getVaults'), addVault: (vault) => ipcRenderer.invoke('db:addVault', vault), updateVault: (id, vault) => ipcRenderer.invoke('db:updateVault', id, vault), deleteVault: (id) => ipcRenderer.invoke('db:deleteVault', id), // Account operations getAccounts: (page, limit, vaultId) => ipcRenderer.invoke('db:getAccounts', page, limit, vaultId), getAccountCount: (vaultId) => ipcRenderer.invoke('db:getAccountCount', vaultId), addAccount: (account) => ipcRenderer.invoke('db:addAccount', account), updateAccount: (id, account) => ipcRenderer.invoke('db:updateAccount', id, account), deleteAccount: (id) => ipcRenderer.invoke('db:deleteAccount', id), moveAccountToVault: (accountId, vaultId) => ipcRenderer.invoke('db:moveAccountToVault', accountId, vaultId), searchAccounts: (query, vaultId) => ipcRenderer.invoke('db:searchAccounts', query, vaultId), // Clipboard copyToClipboard: (text) => ipcRenderer.invoke('clipboard:write', text), // Screenshot captureScreen: () => ipcRenderer.invoke('screen:capture'), // QR Code parsing decodeQR: (imageData, width, height) => { if (!jsQRLib) { console.error('jsQR not loaded'); return null; } try { // 确保是Uint8ClampedArray格式 const data = imageData instanceof Uint8ClampedArray ? imageData : new Uint8ClampedArray(imageData); console.log('Decoding QR, image size:', width, 'x', height, 'data length:', data.length); const result = jsQRLib(data, width, height); if (result) { console.log('QR code found:', result.data); return result.data; } else { console.log('No QR code found in image'); return null; } } catch (e) { console.error('QR decode error:', e); return null; } }, hasJsQR: () => !!jsQRLib, });