From eeef9399dcc326bc02a2289e20e29eaecd6d4ad1 Mon Sep 17 00:00:00 2001 From: shivv23 Date: Thu, 23 Jul 2026 23:37:07 +0530 Subject: [PATCH 1/5] fix Menu.tsx: await async store calls in doSave, doSaveAs, sendEmail, and doPrint --- src/components/Menu/Menu.tsx | 72 ++++++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 28 deletions(-) diff --git a/src/components/Menu/Menu.tsx b/src/components/Menu/Menu.tsx index 0a861ae..bf4c355 100644 --- a/src/components/Menu/Menu.tsx +++ b/src/components/Menu/Menu.tsx @@ -65,10 +65,14 @@ const Menu: React.FC<{ } return filename; }; - const doPrint = () => { + const doPrint = async () => { if (isPlatform("hybrid")) { const printer = Printer; - printer.print(AppGeneral.getCurrentHTMLContent()); + try { + await printer.print(AppGeneral.getCurrentHTMLContent()); + } catch (err) { + console.error("Print failed:", err); + } } else { const content = AppGeneral.getCurrentHTMLContent(); const printWindow = window.open("/printwindow", "Print Invoice"); @@ -76,23 +80,27 @@ const Menu: React.FC<{ printWindow.print(); } }; - const doSave = () => { + const doSave = async () => { if (props.file === "default") { setShowAlert1(true); return; } - const content = encodeURIComponent(AppGeneral.getSpreadsheetContent()); - const data = props.store._getFile(props.file); - const file = new File( - (data as any).created, - new Date().toString(), - content, - props.file, - props.bT - ); - props.store._saveFile(file); - props.updateSelectedFile(props.file); - setShowAlert2(true); + try { + const content = encodeURIComponent(AppGeneral.getSpreadsheetContent()); + const data: any = await props.store._getFile(props.file); + const file = new File( + data.created, + new Date().toString(), + content, + props.file, + props.bT + ); + await props.store._saveFile(file); + props.updateSelectedFile(props.file); + setShowAlert2(true); + } catch (err) { + console.error("Save failed:", err); + } }; const doSaveAs = async (filename) => { if (filename) { @@ -105,9 +113,13 @@ const Menu: React.FC<{ filename, props.bT ); - props.store._saveFile(file); - props.updateSelectedFile(filename); - setShowAlert4(true); + try { + await props.store._saveFile(file); + props.updateSelectedFile(filename); + setShowAlert4(true); + } catch (err) { + console.error("Save As failed:", err); + } } else { setShowToast1(true); } @@ -186,19 +198,23 @@ const Menu: React.FC<{ } }; - const sendEmail = () => { + const sendEmail = async () => { if (isPlatform("hybrid")) { const content = AppGeneral.getCurrentHTMLContent(); const base64 = btoa(content); - EmailComposer.open({ - to: ["jackdwell08@gmail.com"], - cc: [], - bcc: [], - body: "PFA", - attachments: [{ type: "base64", path: base64, name: "Invoice.html" }], - subject: `${APP_NAME} attached`, - isHtml: true, - }); + try { + await EmailComposer.open({ + to: ["jackdwell08@gmail.com"], + cc: [], + bcc: [], + body: "PFA", + attachments: [{ type: "base64", path: base64, name: "Invoice.html" }], + subject: `${APP_NAME} attached`, + isHtml: true, + }); + } catch (err) { + console.error("Email send failed:", err); + } } else { alert("This Functionality works on Anroid/IOS devices"); } From 7ba7fadfbb07e2b288413dea34f53d6f04790199 Mon Sep 17 00:00:00 2001 From: shivv23 Date: Thu, 23 Jul 2026 23:37:08 +0530 Subject: [PATCH 2/5] fix NewFile.tsx: await _getFile and _saveFile in newFile to prevent data loss --- src/components/NewFile/NewFile.tsx | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/components/NewFile/NewFile.tsx b/src/components/NewFile/NewFile.tsx index f1adffa..2ddd087 100644 --- a/src/components/NewFile/NewFile.tsx +++ b/src/components/NewFile/NewFile.tsx @@ -12,19 +12,23 @@ const NewFile: React.FC<{ billType: number; }> = (props) => { const [showAlertNewFileCreated, setShowAlertNewFileCreated] = useState(false); - const newFile = () => { + const newFile = async () => { if (props.file !== "default") { - const content = encodeURIComponent(AppGeneral.getSpreadsheetContent()); - const data = props.store._getFile(props.file); - const file = new File( - (data as any).created, - new Date().toString(), - content, - props.file, - props.billType - ); - props.store._saveFile(file); - props.updateSelectedFile(props.file); + try { + const content = encodeURIComponent(AppGeneral.getSpreadsheetContent()); + const data: any = await props.store._getFile(props.file); + const file = new File( + data.created, + new Date().toString(), + content, + props.file, + props.billType + ); + await props.store._saveFile(file); + props.updateSelectedFile(props.file); + } catch (err) { + console.error("Failed to save current file before creating new:", err); + } } const msc = DATA["home"][AppGeneral.getDeviceType()]["msc"]; AppGeneral.viewFile("default", JSON.stringify(msc)); From b30d14d67d58d5a5ff92d43215c161bcee4e9ded Mon Sep 17 00:00:00 2001 From: shivv23 Date: Thu, 23 Jul 2026 23:37:08 +0530 Subject: [PATCH 3/5] fix Dashboard.tsx: catch loadData promise in useEffect and await all loadData calls --- src/components/Dashboard/Dashboard.tsx | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/components/Dashboard/Dashboard.tsx b/src/components/Dashboard/Dashboard.tsx index dcbed8d..d4a4a4e 100644 --- a/src/components/Dashboard/Dashboard.tsx +++ b/src/components/Dashboard/Dashboard.tsx @@ -73,7 +73,7 @@ const Dashboard: React.FC = ({ store, onOpenFile, currentBillTyp }; useEffect(() => { - loadData(); + loadData().catch(err => console.error("Failed to load data:", err)); checkConnection(); }, []); @@ -87,11 +87,14 @@ const Dashboard: React.FC = ({ store, onOpenFile, currentBillTyp return new Date(date).toLocaleString(); }; - const handleOpen = (key: string) => { - store._getFile(key).then((data: any) => { + const handleOpen = async (key: string) => { + try { + const data: any = await store._getFile(key); AppGeneral.viewFile(key, decodeURIComponent(data.content)); onOpenFile(key, data.billType); - }); + } catch (err) { + displayToast("Failed to open file"); + } }; const handleBackup = async (key: string) => { @@ -120,7 +123,7 @@ const Dashboard: React.FC = ({ store, onOpenFile, currentBillTyp await store._addBackupHistory({ cid: record.cid, timestamp: new Date().toISOString(), name: key }); await store._incrementMetric('invoicesBackedUp'); await store._logActivity({ type: 'BACKUP', description: `Backed up ${key} to IPFS`, cid: record.cid }); - loadData(); + await loadData(); setBackupSuccessCid(record.cid); } catch (error) { displayToast(error instanceof Error ? error.message : "Backup failed"); @@ -158,7 +161,7 @@ const Dashboard: React.FC = ({ store, onOpenFile, currentBillTyp await store._saveFile(file); await store._incrementMetric('successfulRestores'); await store._logActivity({ type: 'RESTORE', description: `Restored ${filename} from IPFS`, cid }); - loadData(); + await loadData(); handleOpen(filename); setRestoreSuccessFile(filename); } catch (error) { @@ -172,7 +175,7 @@ const Dashboard: React.FC = ({ store, onOpenFile, currentBillTyp try { await navigator.clipboard.writeText(`CID: ${cid}\nGateway: https://gateway.pinata.cloud/ipfs/${cid}`); await store._logActivity({ type: 'SHARE', description: `Shared IPFS CID`, cid }); - loadData(); + await loadData(); displayToast("CID & Gateway Link copied to clipboard!"); } catch (err) { displayToast("Failed to copy link"); @@ -188,7 +191,7 @@ const Dashboard: React.FC = ({ store, onOpenFile, currentBillTyp if (fileToDelete) { await store._deleteFile(fileToDelete); await store._logActivity({ type: 'DELETE', description: `Deleted invoice ${fileToDelete}` }); - loadData(); + await loadData(); setFileToDelete(null); displayToast("Invoice deleted"); } @@ -208,7 +211,7 @@ const Dashboard: React.FC = ({ store, onOpenFile, currentBillTyp await store._saveFile(file); await store._incrementMetric('invoicesCreated'); await store._logActivity({ type: 'CREATE', description: `Created new invoice ${filename}` }); - loadData(); + await loadData(); handleOpen(filename); }; From 1ed4bbbea3e5289ddf58e8c443b0cd5af1854cae Mon Sep 17 00:00:00 2001 From: shivv23 Date: Thu, 23 Jul 2026 23:37:09 +0530 Subject: [PATCH 4/5] fix Files.tsx: await _deleteFile and loadFiles, convert editFile to async/await --- src/components/Files/Files.tsx | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/components/Files/Files.tsx b/src/components/Files/Files.tsx index b8fcb25..7e24c86 100644 --- a/src/components/Files/Files.tsx +++ b/src/components/Files/Files.tsx @@ -70,13 +70,16 @@ const Files: React.FC<{ setShowToast(true); }; - const editFile = (key: string) => { - props.store._getFile(key).then((data: any) => { + const editFile = async (key: string) => { + try { + const data: any = await props.store._getFile(key); AppGeneral.viewFile(key, decodeURIComponent(data.content)); props.updateSelectedFile(key); props.updateBillType(data.billType); setListFiles(false); - }); + } catch (err) { + displayToast("Failed to open file"); + } }; const deleteFile = (key: string) => { @@ -124,7 +127,7 @@ const Files: React.FC<{ name: key }); displayToast("Backup successful!"); - loadFiles(); + await loadFiles(); } catch (error) { displayToast(error instanceof Error ? error.message : "Backup failed"); } finally { @@ -148,7 +151,7 @@ const Files: React.FC<{ ); await props.store._saveFile(file); displayToast(`Restored IPFS version of ${key}`); - loadFiles(); + await loadFiles(); editFile(key); // Automatically open the restored version } catch (error) { displayToast("Restore failed: " + (error instanceof Error ? error.message : String(error))); @@ -321,12 +324,16 @@ const Files: React.FC<{ { text: "No", role: "cancel" }, { text: "Yes", - handler: () => { + handler: async () => { if (currentKey) { - props.store._deleteFile(currentKey); - loadDefault(); - setCurrentKey(null); - loadFiles(); // Refresh list after delete + try { + await props.store._deleteFile(currentKey); + loadDefault(); + setCurrentKey(null); + await loadFiles(); + } catch (err) { + displayToast("Failed to delete file"); + } } }, }, From 7aad5b2838da3d8bf1625f79daf81d78a3287849 Mon Sep 17 00:00:00 2001 From: shivv23 Date: Thu, 23 Jul 2026 23:37:10 +0530 Subject: [PATCH 5/5] fix BackupSuccessModal: add console.warn to empty clipboard catch block --- src/components/Modals/BackupSuccessModal.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/Modals/BackupSuccessModal.tsx b/src/components/Modals/BackupSuccessModal.tsx index 414d491..32ef54c 100644 --- a/src/components/Modals/BackupSuccessModal.tsx +++ b/src/components/Modals/BackupSuccessModal.tsx @@ -12,7 +12,9 @@ export const BackupSuccessModal: React.FC = ({ isOpen, onClose, cid }) => const copyToClipboard = async () => { try { await navigator.clipboard.writeText(cid); - } catch (err) {} + } catch (err) { + console.warn("Clipboard write failed:", err); + } }; const openGateway = () => {