// Logseq Import Plugin — frontend. // // Injects a footer button + hidden file input, posts the selected ZIP to // /api/import-logseq, and refreshes the board when the import completes. const hyprcrd = window.hyprcrd; if (!hyprcrd) throw new Error('[logseq-import] window.hyprcrd not found'); function injectFooterButton() { const footer = document.querySelector('footer'); if (!footer) return; if (footer.querySelector('#logseq-import-btn')) return; // Anchor before the settings button so the order matches the previous core layout. const settingsBtn = footer.querySelector('#settings-btn'); const group = settingsBtn?.parentElement || footer.querySelector('.flex.items-center.gap-2'); if (!group) return; const fileInput = document.createElement('input'); fileInput.type = 'file'; fileInput.id = 'logseq-import-file'; fileInput.accept = '.zip,application/zip'; fileInput.className = 'hidden'; group.insertBefore(fileInput, settingsBtn || null); const btn = document.createElement('button'); btn.id = 'logseq-import-btn'; btn.className = 'flex items-center gap-1.5 px-2.5 py-1 text-xs border border-t-border text-t-muted hover:border-t-accent hover:text-t-accent transition-colors'; btn.innerHTML = 'logseq import'; group.insertBefore(btn, settingsBtn || null); btn.addEventListener('click', () => fileInput.click()); fileInput.addEventListener('change', async (e) => { const file = e.target.files?.[0]; if (!file) return; const form = new FormData(); form.append('file', file); try { const res = await fetch('api/import-logseq', { method: 'POST', body: form, headers: { 'X-CSRF-Token': hyprcrd.util.csrf() }, }); const data = await res.json(); if (data.error) throw new Error(data.error); await window._reloadAll?.(); await hyprcrd.dialog.show({ title: 'logseq import', message: `${data.imported} cards, ${data.assets} images imported`, okLabel: 'ok', }); } catch (err) { await hyprcrd.dialog.show({ title: 'logseq import failed', message: String(err?.message || err) || 'unknown error', danger: true, okLabel: 'ok', }); } e.target.value = ''; }); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', injectFooterButton); } else { injectFooterButton(); } hyprcrd.registerPlugin({ name: 'logseq-import', version: '1.0.0', description: 'Import a Logseq vault ZIP as dated journal cards and pages.', });