"use client"; import { useEffect, useState } from "react"; // Served by nginx from the server's docker/drops/ folder, behind the same login as the page. const base = "/drops/files/"; type Drop = { title: string; note?: string; files: { name: string; src: string }[]; }; export default function DropViewer() { const [drop, setDrop] = useState(null); const [failed, setFailed] = useState(false); useEffect(() => { fetch(`${base}manifest.json`, { cache: "no-store" }) .then((r) => (r.ok ? r.json() : Promise.reject(r.status))) .then(setDrop) .catch(() => setFailed(true)); }, []); if (failed) { return (

Nothing here

These previews have been taken down. Ask your Two Tales contact if you still need them.

); } if (!drop) { return

Loading…

; } return ( <>

Confidential · view only

{drop.title}

{drop.note &&

{drop.note}

}
    {drop.files.map((f, i) => (
  1. {String(i + 1).padStart(2, "0")} {f.name}
  2. ))}
); } // Plays inline with no download, cast or picture-in-picture options and no right-click menu. // This only stops casual saving: anyone who can watch can still screen-record. function Player({ src, label }: { src: string; label: string }) { return (
e.preventDefault()}>
); }