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); }; 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"); + } } }, }, 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"); } 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 = () => { 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));