const { Plugin, Notice, TFile, TFolder } = require("obsidian"); function getVaultId() { return window.__currentVaultId || ""; } function triggerDownload(endpoint, filePath, downloadName) { const vaultId = getVaultId(); const url = `/api/fs/${endpoint}` + `?vault=${encodeURIComponent(vaultId)}` + `&path=${encodeURIComponent(filePath)}`; const a = document.createElement("a"); a.href = url; a.download = downloadName; a.click(); } class IgnisBridgePlugin extends Plugin { async onload() { console.log("[ignis-bridge] Plugin loaded"); this.addRibbonIcon("upload", "Upload file", () => { this.showFilePicker(); }); this.registerEvent( this.app.workspace.on("file-menu", (menu, file) => { if (file instanceof TFile) { this.addFileMenuItems(menu, file); } else if (file instanceof TFolder) { this.addFolderMenuItems(menu, file); } }), ); } addFileMenuItems(menu, file) { menu.addItem((item) => { item .setTitle("Download") .setIcon("download") .onClick(() => triggerDownload("download", file.path, file.name)); }); } addFolderMenuItems(menu, folder) { menu.addItem((item) => { item .setTitle("Download as ZIP") .setIcon("download") .onClick(() => triggerDownload("download-zip", folder.path, `${folder.name}.zip`), ); }); menu.addItem((item) => { item .setTitle("Upload file") .setIcon("upload") .onClick(() => this.showFilePicker(folder)); }); } showFilePicker(targetFolder = null) { const input = document.createElement("input"); input.type = "file"; input.multiple = true; input.style.display = "none"; input.addEventListener("change", async () => { const files = Array.from(input.files || []); if (files.length === 0) return; const folder = targetFolder || this.app.vault.getRoot(); const folderPath = folder.path; new Notice(`Uploading ${files.length} file(s)...`); let successCount = 0; let errorCount = 0; for (const file of files) { try { const arrayBuffer = await file.arrayBuffer(); const targetPath = folderPath ? `${folderPath}/${file.name}` : file.name; await this.app.vault.createBinary(targetPath, arrayBuffer); successCount++; } catch (e) { console.error("[ignis-bridge] Upload failed:", file.name, e); errorCount++; } } if (successCount > 0) { new Notice(`Uploaded ${successCount} file(s) successfully`); } if (errorCount > 0) { new Notice(`Failed to upload ${errorCount} file(s)`, 5000); } input.remove(); }); document.body.appendChild(input); input.click(); } onunload() { console.log("[ignis-bridge] Plugin unloaded"); } } module.exports = IgnisBridgePlugin;