/* Atlus — ASI Bridge plugin app */
(function () {
'use strict';
let container = null;
let ws = null;
let statusEl = null;
let filesEl = null;
async function loadStatus() {
try {
const res = await Atlus.apiFetch('/api/plugins/asi-bridge/status');
if (!res.ok) return;
const data = await res.json();
renderStatus(data);
} catch (e) {}
}
function renderStatus(data) {
if (!statusEl) return;
const mountClass = data.mounted ? 'var(--status-green)' : 'var(--status-red)';
const mountText = data.mounted ? 'Connected' : 'Disconnected';
statusEl.innerHTML = `
FITS FILES
${data.fits_count}
TOTAL SIZE
${Atlus.formatBytes(data.total_size)}
Share: ${data.cifs_share || 'Not configured'}
Mount: ${data.mount_point}
`;
const mountBtn = statusEl.querySelector('#asiBridgeMount');
mountBtn.addEventListener('click', async () => {
const endpoint = data.mounted ? '/api/plugins/asi-bridge/unmount' : '/api/plugins/asi-bridge/mount';
await Atlus.apiFetch(endpoint, { method: 'POST' });
loadStatus();
loadFiles();
});
// Latest file
if (data.latest_file) {
const latest = document.createElement('div');
latest.style.cssText = 'margin-top:16px;padding:12px;background:var(--bg-titlebar);border:1px solid var(--border-structural);border-radius:var(--radius-md);';
latest.innerHTML = `
LATEST CAPTURE
${data.latest_file.name}
${Atlus.formatBytes(data.latest_file.size)} ·
${new Date(data.latest_file.modified * 1000).toLocaleString()}
`;
statusEl.appendChild(latest);
}
}
async function loadFiles() {
if (!filesEl) return;
try {
const res = await Atlus.apiFetch('/api/plugins/asi-bridge/files');
if (!res.ok) {
filesEl.innerHTML = 'Share not mounted.
';
return;
}
const files = await res.json();
renderFiles(files);
} catch (e) {
filesEl.innerHTML = 'Unable to load files.
';
}
}
function renderFiles(files) {
if (!filesEl) return;
filesEl.innerHTML = '';
if (files.length === 0) {
filesEl.innerHTML = 'No FITS files found.
';
return;
}
const header = document.createElement('div');
header.style.cssText = 'display:grid;grid-template-columns:1fr 80px 140px;padding:0 16px;height:32px;align-items:center;font-family:var(--font-mono);font-size:10px;color:var(--text-muted);letter-spacing:0.5px;border-bottom:1px solid var(--border-structural);';
header.innerHTML = 'NameSizeModified';
filesEl.appendChild(header);
files.slice(0, 100).forEach(file => {
const row = document.createElement('div');
row.style.cssText = 'display:grid;grid-template-columns:1fr 80px 140px;padding:0 16px;min-height:44px;align-items:center;border-bottom:1px solid var(--border-structural);font-family:var(--font-mono);font-size:12px;';
row.innerHTML = `
${file.name}
${Atlus.formatBytes(file.size)}
${new Date(file.modified * 1000).toLocaleString('en-US', { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit', hour12: false })}
`;
filesEl.appendChild(row);
});
}
function connectWs() {
ws = new WebSocket(Atlus.wsUrl('/api/plugins/asi-bridge/ws'));
ws.onmessage = (e) => {
const msg = JSON.parse(e.data);
if (msg.type === 'mount_status') {
loadStatus();
} else if (msg.type === 'new_file') {
loadFiles();
}
};
ws.onclose = () => {
setTimeout(connectWs, 5000);
};
}
Atlus.registerApp('asi-bridge', {
title: 'ASI Bridge',
init(el) {
container = el;
container.style.display = 'flex';
container.style.flexDirection = 'column';
container.style.height = '100%';
container.style.overflow = 'auto';
// Status section
statusEl = document.createElement('div');
statusEl.style.padding = '24px';
statusEl.style.borderBottom = '1px solid var(--border-structural)';
container.appendChild(statusEl);
// Files section
const filesHeader = document.createElement('div');
filesHeader.style.cssText = 'padding:16px 24px 8px;font-family:var(--font-mono);font-size:10px;font-weight:500;color:var(--text-muted);letter-spacing:1.5px;';
filesHeader.textContent = 'CAPTURES';
container.appendChild(filesHeader);
filesEl = document.createElement('div');
filesEl.style.flex = '1';
filesEl.style.overflow = 'auto';
container.appendChild(filesEl);
loadStatus();
loadFiles();
connectWs();
},
destroy() {
if (ws) { ws.close(); ws = null; }
container = null;
statusEl = null;
filesEl = null;
},
});
})();