Files
hyprcrd/public/plugins/logseq-import/logseq-import.js
T
2026-04-11 13:01:27 +02:00

75 lines
2.8 KiB
JavaScript

// 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 = '<i class="ph ph-graph text-sm"></i><span class="font-pixel text-[10px]">Logseq import</span>';
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.',
});