(fileUrl, fileName)
| 589 | |
| 590 | /* -------------------------------- Entry -------------------------------- */ |
| 591 | export function previewFile(fileUrl, fileName) { |
| 592 | const overlay = ensureMediaModal(); |
| 593 | const container = overlay.querySelector(".file-preview-container"); |
| 594 | const actionWrap = overlay.querySelector(".media-right .action-group"); |
| 595 | const statusChip = overlay.querySelector(".media-right .status-chip"); |
| 596 | |
| 597 | // replace nav buttons to clear old listeners |
| 598 | let prevBtn = overlay.querySelector('.nav-left'); |
| 599 | let nextBtn = overlay.querySelector('.nav-right'); |
| 600 | const newPrev = prevBtn.cloneNode(true); |
| 601 | const newNext = nextBtn.cloneNode(true); |
| 602 | prevBtn.replaceWith(newPrev); |
| 603 | nextBtn.replaceWith(newNext); |
| 604 | prevBtn = newPrev; nextBtn = newNext; |
| 605 | |
| 606 | // reset |
| 607 | container.innerHTML = ""; |
| 608 | actionWrap.innerHTML = ""; |
| 609 | if (statusChip) statusChip.style.display = 'none'; |
| 610 | setPreviewLoading(overlay, true, t('loading') || 'Loading...'); |
| 611 | if (overlay._onKey) window.removeEventListener('keydown', overlay._onKey); |
| 612 | overlay._onKey = null; |
| 613 | |
| 614 | const folder = window.currentFolder || 'root'; |
| 615 | const name = fileName; |
| 616 | const lower = (name || '').toLowerCase(); |
| 617 | const isSvg = SVG_RE.test(lower); |
| 618 | const isImage = IMG_RE.test(lower); |
| 619 | const isVideo = VID_RE.test(lower); |
| 620 | const isAudio = AUD_RE.test(lower); |
| 621 | |
| 622 | // Base preview URL from the link we clicked |
| 623 | const baseUrl = fileUrl; |
| 624 | |
| 625 | // Use the same preview endpoint, just swap the "file" param. |
| 626 | function siblingPreviewUrl(newName) { |
| 627 | try { |
| 628 | const u = new URL(baseUrl, window.location.origin); |
| 629 | u.searchParams.set('file', newName); |
| 630 | // cache-bust so we don’t get stale frames |
| 631 | u.searchParams.set('t', String(Date.now())); |
| 632 | return u.toString(); |
| 633 | } catch (e) { |
| 634 | // Fallback: go through generic download/inline endpoint |
| 635 | return buildPreviewUrl(folder, newName); |
| 636 | } |
| 637 | } |
| 638 | |
| 639 | setTitle(overlay, name); |
| 640 | if (isSvg) { |
| 641 | const downloadBtn = makeDownloadButton(folder, () => name); |
| 642 | actionWrap.appendChild(downloadBtn); |
| 643 | |
| 644 | container.textContent = |
| 645 | t("svg_preview_disabled") || |
| 646 | "SVG preview is disabled for security. Use Download to view this file."; |
| 647 | setPreviewLoading(overlay, false); |
| 648 | overlay.style.display = "flex"; |
no test coverage detected