@putkoff/abstract-securefiles 0.0.49 → 0.0.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api.d.ts +2 -1
- package/dist/index.cjs +18 -26
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +18 -26
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +7 -1
- package/package.json +1 -1
- package/src/SecureFiles.tsx +6 -4
- package/src/ServerFiles.tsx +32 -17
- package/src/api.ts +4 -15
- package/src/styles.css +10 -0
- package/src/types.ts +3 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/api.ts","../src/FolderSelect.tsx","../src/UploadPanel.tsx","../src/CopyButton.tsx","../src/ShareDialog.tsx","../src/ConfirmButton.tsx","../src/ServerFiles.tsx","../node_modules/style-inject/dist/style-inject.es.js","../src/SecureFiles.tsx"],"sourcesContent":["import type { BrowseResult, LinkRoot, RootChallenge, SecureFile, ShareUpdate } from \"./types\";\n\nexport const DEFAULT_API_BASE = \"https://api.abstractendeavors.com\";\n\nexport class ApiError extends Error {\n constructor(message: string, public status: number) {\n super(message);\n }\n}\n\nasync function errorFrom(res: Response): Promise<ApiError> {\n let message = `${res.status} ${res.statusText}`;\n try {\n const body = await res.json();\n message = body?.message || body?.error || message;\n } catch {\n /* non-JSON error body */\n }\n if (res.status === 401) message = \"Please log in to use Secure Files.\";\n return new ApiError(message, res.status);\n}\n\nexport function createApi(apiBase: string = DEFAULT_API_BASE) {\n const root = `${apiBase.replace(/\\/+$/, \"\")}/secure-files`;\n\n async function json<T>(path: string, init: RequestInit = {}): Promise<T> {\n const res = await fetch(`${root}${path}`, {\n credentials: \"include\",\n ...init,\n headers: { Accept: \"application/json\", ...(init.body ? { \"Content-Type\": \"application/json\" } : {}) },\n });\n if (!res.ok) throw await errorFrom(res);\n return res.json();\n }\n\n return {\n list: () => json<{ user_name: string; is_admin: boolean; files: SecureFile[] }>(\"/userInfo\"),\n\n roots: () => json<{ roots: LinkRoot[] }>(\"/admin/roots\"),\n\n requestRoot: (path: string) =>\n json<{ challenge: RootChallenge }>(\"/admin/roots\", { method: \"POST\", body: JSON.stringify({ path }) }),\n\n confirmRoot: (nonce: string, signature: string, label?: string) =>\n json<{ roots: LinkRoot[] }>(\"/admin/roots/confirm\", {\n method: \"POST\",\n body: JSON.stringify({ nonce, signature, label }),\n }),\n\n removeRoot: (id: number) => json<{ roots: LinkRoot[] }>(`/admin/roots/${id}`, { method: \"DELETE\" }),\n\n browse: (path: string) => json<BrowseResult>(`/admin/browse?path=${encodeURIComponent(path)}`),\n\n link: (paths: string[], folder: string) =>\n json<{ linked: string[]; errors: { path: string; error: string }[] }>(\"/admin/link\", {\n method: \"POST\",\n body: JSON.stringify({ paths, folder }),\n }),\n\n updateShare: (update: ShareUpdate) =>\n json<{ file: SecureFile }>(\"/files/share\", { method: \"PATCH\", body: JSON.stringify(update) }),\n\n remove: (ids: number[]) =>\n json<{ removed: number[]; errors: { id: number; error: string }[] }>(\"/remove\", {\n method: \"POST\",\n body: JSON.stringify({ ids }),\n }),\n\n async download(ids: number[], fallbackName: string): Promise<void> {\n const res = await fetch(`${root}/download`, {\n method: \"POST\",\n credentials: \"include\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ ids }),\n });\n if (!res.ok) throw await errorFrom(res);\n const disposition = res.headers.get(\"Content-Disposition\") || \"\";\n const match = /filename\\*?=(?:UTF-8'')?\"?([^\";]+)\"?/i.exec(disposition);\n const name = match ? decodeURIComponent(match[1]) : fallbackName;\n const url = URL.createObjectURL(await res.blob());\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = name;\n document.body.appendChild(a);\n a.click();\n a.remove();\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n },\n\n upload(file: File, relPath: string, onProgress?: (fraction: number) => void): Promise<void> {\n return new Promise((resolve, reject) => {\n const form = new FormData();\n form.append(\"file\", file);\n form.append(\"rel_path\", relPath);\n const xhr = new XMLHttpRequest();\n xhr.open(\"POST\", `${root}/upload`);\n xhr.withCredentials = true;\n xhr.upload.onprogress = (e) => {\n if (e.lengthComputable) onProgress?.(e.loaded / e.total);\n };\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) return resolve();\n let message = `Upload failed (${xhr.status})`;\n try {\n message = JSON.parse(xhr.responseText)?.message || message;\n } catch {\n /* non-JSON */\n }\n if (xhr.status === 401) message = \"Please log in to use Secure Files.\";\n reject(new ApiError(message, xhr.status));\n };\n xhr.onerror = () => reject(new ApiError(\"Network error during upload\", 0));\n xhr.send(form);\n });\n },\n };\n}\n\nexport type SecureFilesApi = ReturnType<typeof createApi>;\n","import React, { useState } from \"react\";\n\nconst NEW_FOLDER = \"__new__\";\n\nexport function FolderSelect({\n label,\n folders,\n value,\n onChange,\n}: {\n label: string;\n folders: string[];\n value: string;\n onChange: (folder: string) => void;\n}) {\n const [creating, setCreating] = useState(false);\n const [draft, setDraft] = useState(\"\");\n const [extra, setExtra] = useState<string[]>([]);\n const options = [...new Set([...folders, ...extra, ...(value ? [value] : [])])].sort();\n\n const accept = () => {\n const clean = draft.trim().replace(/^\\/+|\\/+$/g, \"\");\n if (clean) {\n setExtra((e) => (e.includes(clean) ? e : [...e, clean]));\n onChange(clean);\n }\n setCreating(false);\n setDraft(\"\");\n };\n\n return (\n <div className=\"sf-field\">\n <span>{label}</span>\n {creating ? (\n <div className=\"sf-row\">\n <input\n className=\"sf-input\"\n autoFocus\n value={draft}\n placeholder=\"new-folder-name (use / for subfolders)\"\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") accept();\n if (e.key === \"Escape\") setCreating(false);\n }}\n />\n <button type=\"button\" className=\"sf-btn\" onClick={accept}>\n OK\n </button>\n </div>\n ) : (\n <select\n className=\"sf-input\"\n value={value}\n onChange={(e) => (e.target.value === NEW_FOLDER ? setCreating(true) : onChange(e.target.value))}\n >\n <option value=\"\">/ (top level)</option>\n {options.map((d) => (\n <option key={d} value={d}>\n {d}/\n </option>\n ))}\n <option value={NEW_FOLDER}>+ Create new directory…</option>\n </select>\n )}\n </div>\n );\n}\n","import React, { useRef, useState } from \"react\";\nimport type { SecureFilesApi } from \"./api\";\nimport { FolderSelect } from \"./FolderSelect\";\n\ninterface Queued {\n file: File;\n relPath: string;\n progress: number;\n error?: string;\n done?: boolean;\n}\n\nfunction readEntries(reader: any): Promise<any[]> {\n return new Promise((resolve, reject) => reader.readEntries(resolve, reject));\n}\n\nasync function walkEntry(entry: any, prefix: string, out: { file: File; relPath: string }[]) {\n if (entry.isFile) {\n const file: File = await new Promise((resolve, reject) => entry.file(resolve, reject));\n out.push({ file, relPath: prefix + file.name });\n } else if (entry.isDirectory) {\n const reader = entry.createReader();\n let batch: any[];\n do {\n batch = await readEntries(reader);\n for (const child of batch) await walkEntry(child, `${prefix}${entry.name}/`, out);\n } while (batch.length > 0);\n }\n}\n\nasync function filesFromDrop(dt: DataTransfer) {\n const out: { file: File; relPath: string }[] = [];\n const entries = Array.from(dt.items || [])\n .map((item) => (item as any).webkitGetAsEntry?.())\n .filter(Boolean);\n if (entries.length) {\n for (const entry of entries) await walkEntry(entry, \"\", out);\n } else {\n for (const file of Array.from(dt.files)) out.push({ file, relPath: file.name });\n }\n return out;\n}\n\nfunction joinTarget(target: string, relPath: string) {\n const clean = target.trim().replace(/^\\/+|\\/+$/g, \"\");\n return clean ? `${clean}/${relPath}` : relPath;\n}\n\nfunction CloudIcon() {\n return (\n <svg className=\"sf-drop__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5} aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 16.5V9.75m0 0 3 3m-3-3-3 3M6.75 19.5a4.5 4.5 0 0 1-1.41-8.775 5.25 5.25 0 0 1 10.233-2.33 3 3 0 0 1 3.758 3.848A3.752 3.752 0 0 1 18 19.5H6.75Z\"\n />\n </svg>\n );\n}\n\nexport function UploadPanel({\n api,\n folders,\n onUploaded,\n}: {\n api: SecureFilesApi;\n folders: string[];\n onUploaded: () => void;\n}) {\n const [queue, setQueue] = useState<Queued[]>([]);\n const [mode, setMode] = useState<\"files\" | \"folder\">(\"files\");\n const [target, setTarget] = useState(\"\");\n const [dragging, setDragging] = useState(false);\n const [busy, setBusy] = useState(false);\n const [message, setMessage] = useState<string | null>(null);\n const fileInput = useRef<HTMLInputElement>(null);\n const folderInput = useRef<HTMLInputElement>(null);\n\n const enqueue = (items: { file: File; relPath: string }[]) => {\n setMessage(null);\n setQueue((q) => {\n const kept = q.filter((x) => !x.done);\n const seen = new Set(kept.map((x) => x.relPath));\n return [...kept, ...items.filter((i) => !seen.has(i.relPath)).map((i) => ({ ...i, progress: 0 }))];\n });\n };\n\n const openPicker = () => (mode === \"folder\" ? folderInput : fileInput).current?.click();\n\n const fromInput = (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files || []);\n enqueue(files.map((file) => ({ file, relPath: (file as any).webkitRelativePath || file.name })));\n e.target.value = \"\";\n };\n\n const uploadAll = async () => {\n setBusy(true);\n setMessage(null);\n let failed = 0;\n for (let i = 0; i < queue.length; i++) {\n const item = queue[i];\n if (item.done) continue;\n const set = (patch: Partial<Queued>) =>\n setQueue((q) => q.map((x, idx) => (idx === i ? { ...x, ...patch } : x)));\n try {\n await api.upload(item.file, joinTarget(target, item.relPath), (p) => set({ progress: p }));\n set({ progress: 1, done: true, error: undefined });\n } catch (err) {\n failed++;\n set({ error: err instanceof Error ? err.message : String(err) });\n }\n }\n setBusy(false);\n setMessage(failed ? `${failed} upload(s) failed` : \"Upload complete\");\n if (!failed) setQueue([]);\n onUploaded();\n };\n\n const pending = queue.filter((q) => !q.done);\n\n return (\n <section className=\"sf-upload\">\n <div className=\"sf-row sf-mode\" role=\"radiogroup\" aria-label=\"Choose what clicking the upload area picks\">\n <label className=\"sf-check sf-check--inline\">\n <input type=\"radio\" checked={mode === \"files\"} onChange={() => setMode(\"files\")} /> Files\n </label>\n <label className=\"sf-check sf-check--inline\">\n <input type=\"radio\" checked={mode === \"folder\"} onChange={() => setMode(\"folder\")} /> Folder\n </label>\n <span className=\"sf-muted\">(drag-and-drop accepts either)</span>\n </div>\n\n <div\n className={`sf-drop${dragging ? \" sf-drop--active\" : \"\"}`}\n role=\"button\"\n tabIndex={0}\n aria-label={`Upload area: click to choose ${mode === \"folder\" ? \"a folder\" : \"files\"}, or drop files or folders`}\n onClick={openPicker}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n openPicker();\n }\n }}\n onDragEnter={(e) => {\n e.preventDefault();\n setDragging(true);\n }}\n onDragOver={(e) => e.preventDefault()}\n onDragLeave={(e) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node)) setDragging(false);\n }}\n onDrop={async (e) => {\n e.preventDefault();\n setDragging(false);\n enqueue(await filesFromDrop(e.dataTransfer));\n }}\n >\n <CloudIcon />\n <div>\n <p className=\"sf-drop__title\">Drag & drop files or folders here</p>\n <p className=\"sf-muted\">Click anywhere to choose {mode === \"folder\" ? \"a folder\" : \"files\"}</p>\n {pending.length > 0 && (\n <p className=\"sf-drop__count\">\n {pending.length} item{pending.length === 1 ? \"\" : \"s\"} queued\n </p>\n )}\n </div>\n </div>\n <input ref={fileInput} type=\"file\" multiple hidden onChange={fromInput} />\n <input\n ref={folderInput}\n type=\"file\"\n multiple\n hidden\n onChange={fromInput}\n {...({ webkitdirectory: \"\", directory: \"\" } as any)}\n />\n\n <div className=\"sf-row\">\n <FolderSelect label=\"Upload into\" folders={folders} value={target} onChange={setTarget} />\n <button type=\"button\" className=\"sf-btn sf-btn--primary\" disabled={busy || !pending.length} onClick={uploadAll}>\n {busy ? \"Uploading…\" : `Upload ${pending.length}`}\n </button>\n {queue.length > 0 && !busy && (\n <button type=\"button\" className=\"sf-btn\" onClick={() => setQueue([])}>\n Clear\n </button>\n )}\n </div>\n\n {message && (\n <p className={message.includes(\"failed\") ? \"sf-error\" : \"sf-muted\"} role=\"status\">\n {message}\n </p>\n )}\n\n {queue.length > 0 && (\n <ul className=\"sf-queue\">\n {queue.map((q, i) => (\n <li key={`${q.relPath}-${i}`}>\n <span className=\"sf-queue__name\">{joinTarget(target, q.relPath)}</span>\n {q.error ? (\n <span className=\"sf-error\">{q.error}</span>\n ) : (\n <span className=\"sf-row\">\n <progress max={1} value={q.progress} />\n <span className=\"sf-muted\">{Math.round(q.progress * 100)}%</span>\n </span>\n )}\n </li>\n ))}\n </ul>\n )}\n </section>\n );\n}\n","import React, { useState } from \"react\";\n\nexport function CopyButton({ text, label = \"Copy link\" }: { text: string; label?: string }) {\n const [copied, setCopied] = useState(false);\n const copy = async () => {\n try {\n await navigator.clipboard.writeText(text);\n } catch {\n const ta = document.createElement(\"textarea\");\n ta.value = text;\n document.body.appendChild(ta);\n ta.select();\n document.execCommand(\"copy\");\n ta.remove();\n }\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n return (\n <button type=\"button\" className=\"sf-btn\" onClick={copy}>\n {copied ? \"Copied\" : label}\n </button>\n );\n}\n","import React, { useEffect, useState } from \"react\";\nimport type { SecureFile, ShareUpdate } from \"./types\";\nimport { CopyButton } from \"./CopyButton\";\n\ntype PasswordMode = \"keep\" | \"set\" | \"remove\";\n\nexport function ShareDialog({\n file,\n onClose,\n onSave,\n}: {\n file: SecureFile;\n onClose: () => void;\n onSave: (update: ShareUpdate) => Promise<void>;\n}) {\n const [shareable, setShareable] = useState(file.shareable);\n const [limit, setLimit] = useState(file.download_limit ? String(file.download_limit) : \"\");\n const [pwMode, setPwMode] = useState<PasswordMode>(file.has_password ? \"keep\" : \"remove\");\n const [password, setPassword] = useState(\"\");\n const [resetCount, setResetCount] = useState(false);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => e.key === \"Escape\" && onClose();\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [onClose]);\n\n const limitValid = limit === \"\" || /^\\d+$/.test(limit);\n const passwordValid = pwMode !== \"set\" || password.length > 0;\n\n const save = async () => {\n setSaving(true);\n setError(null);\n try {\n const update: ShareUpdate = { id: file.id, shareable };\n if (shareable) {\n update.download_limit = limit === \"\" ? null : Number(limit);\n if (pwMode === \"set\") update.password = password;\n else if (pwMode === \"remove\" && file.has_password) update.password = \"\";\n if (resetCount) update.reset_count = true;\n }\n await onSave(update);\n onClose();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setSaving(false);\n }\n };\n\n return (\n <div className=\"sf-overlay\" onMouseDown={(e) => e.target === e.currentTarget && onClose()}>\n <div className=\"sf-dialog\" role=\"dialog\" aria-modal=\"true\" aria-label={`Share settings for ${file.filename}`}>\n <header className=\"sf-dialog__head\">\n <h3>Share settings</h3>\n <button type=\"button\" className=\"sf-icon-btn\" aria-label=\"Close\" onClick={onClose}>\n ✕\n </button>\n </header>\n <p className=\"sf-muted\">{file.filepath}</p>\n\n <label className=\"sf-check\">\n <input type=\"checkbox\" checked={shareable} onChange={(e) => setShareable(e.target.checked)} />\n Anyone with the link can download\n </label>\n\n <fieldset disabled={!shareable} className=\"sf-fieldset\">\n <label className=\"sf-field\">\n <span>Download limit (blank = unlimited)</span>\n <input\n className=\"sf-input\"\n inputMode=\"numeric\"\n value={limit}\n onChange={(e) => setLimit(e.target.value.trim())}\n placeholder=\"unlimited\"\n />\n {!limitValid && <span className=\"sf-error\">Enter a whole number</span>}\n </label>\n <p className=\"sf-muted\">\n Downloaded {file.download_count} time{file.download_count === 1 ? \"\" : \"s\"}\n {file.download_limit ? ` of ${file.download_limit}` : \"\"}.{\" \"}\n <label className=\"sf-check sf-check--inline\">\n <input type=\"checkbox\" checked={resetCount} onChange={(e) => setResetCount(e.target.checked)} />\n reset count\n </label>\n </p>\n\n <div className=\"sf-field\">\n <span>Password</span>\n <div className=\"sf-row\">\n {file.has_password && (\n <label className=\"sf-check sf-check--inline\">\n <input type=\"radio\" checked={pwMode === \"keep\"} onChange={() => setPwMode(\"keep\")} />\n keep current\n </label>\n )}\n <label className=\"sf-check sf-check--inline\">\n <input type=\"radio\" checked={pwMode === \"set\"} onChange={() => setPwMode(\"set\")} />\n {file.has_password ? \"change\" : \"require password\"}\n </label>\n <label className=\"sf-check sf-check--inline\">\n <input type=\"radio\" checked={pwMode === \"remove\"} onChange={() => setPwMode(\"remove\")} />\n {file.has_password ? \"remove\" : \"none\"}\n </label>\n </div>\n {pwMode === \"set\" && (\n <input\n className=\"sf-input\"\n type=\"password\"\n autoComplete=\"new-password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"New password\"\n />\n )}\n </div>\n\n <div className=\"sf-field\">\n <span>Share link</span>\n <div className=\"sf-row\">\n <input className=\"sf-input\" readOnly value={file.share_url} onFocus={(e) => e.target.select()} />\n <CopyButton text={file.share_url} />\n </div>\n {!file.shareable && <span className=\"sf-muted\">The link works once you save with sharing on.</span>}\n </div>\n </fieldset>\n\n {error && <p className=\"sf-error\">{error}</p>}\n\n <footer className=\"sf-row sf-dialog__foot\">\n <button type=\"button\" className=\"sf-btn\" onClick={onClose}>\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"sf-btn sf-btn--primary\"\n disabled={saving || !limitValid || !passwordValid}\n onClick={save}\n >\n {saving ? \"Saving…\" : \"Save\"}\n </button>\n </footer>\n </div>\n </div>\n );\n}\n","import React, { useEffect, useState } from \"react\";\n\nexport function ConfirmButton({\n label,\n onConfirm,\n disabled,\n}: {\n label: string;\n onConfirm: () => void;\n disabled?: boolean;\n}) {\n const [armed, setArmed] = useState(false);\n useEffect(() => {\n if (!armed) return;\n const t = setTimeout(() => setArmed(false), 3000);\n return () => clearTimeout(t);\n }, [armed]);\n return (\n <button\n type=\"button\"\n className={`sf-btn sf-btn--danger${armed ? \" sf-btn--armed\" : \"\"}`}\n disabled={disabled}\n onClick={() => {\n if (armed) {\n setArmed(false);\n onConfirm();\n } else {\n setArmed(true);\n }\n }}\n >\n {armed ? \"Confirm\" : label}\n </button>\n );\n}\n","import React, { useCallback, useEffect, useState } from \"react\";\nimport type { SecureFilesApi } from \"./api\";\nimport type { BrowseResult, LinkRoot, RootChallenge } from \"./types\";\nimport { ConfirmButton } from \"./ConfirmButton\";\nimport { CopyButton } from \"./CopyButton\";\nimport { FolderSelect } from \"./FolderSelect\";\n\nfunction formatSize(bytes: number) {\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n let n = bytes;\n let i = 0;\n while (n >= 1024 && i < units.length - 1) {\n n /= 1024;\n i++;\n }\n return `${n.toFixed(i ? 1 : 0)} ${units[i]}`;\n}\n\nconst errText = (err: unknown) => (err instanceof Error ? err.message : String(err));\n\nfunction AddRoot({ api, onAdded }: { api: SecureFilesApi; onAdded: (roots: LinkRoot[]) => void }) {\n const [path, setPath] = useState(\"\");\n const [label, setLabel] = useState(\"\");\n const [challenge, setChallenge] = useState<RootChallenge | null>(null);\n const [signature, setSignature] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n\n const request = async () => {\n setBusy(true);\n setError(null);\n try {\n setChallenge((await api.requestRoot(path.trim())).challenge);\n setSignature(\"\");\n } catch (err) {\n setError(errText(err));\n } finally {\n setBusy(false);\n }\n };\n\n const confirm = async () => {\n if (!challenge) return;\n setBusy(true);\n setError(null);\n try {\n onAdded((await api.confirmRoot(challenge.nonce, signature, label)).roots);\n setChallenge(null);\n setPath(\"\");\n setLabel(\"\");\n setSignature(\"\");\n } catch (err) {\n setError(errText(err));\n } finally {\n setBusy(false);\n }\n };\n\n const minutesLeft = challenge ? Math.max(0, Math.round((challenge.expires * 1000 - Date.now()) / 60000)) : 0;\n\n return (\n <div className=\"sf-card\">\n <h4>Allow a directory</h4>\n {!challenge ? (\n <div className=\"sf-row sf-row--bottom\">\n <label className=\"sf-field\">\n <span>Absolute path on the server</span>\n <input\n className=\"sf-input\"\n value={path}\n onChange={(e) => setPath(e.target.value)}\n placeholder=\"/srv/shared/docs\"\n onKeyDown={(e) => e.key === \"Enter\" && path.trim() && request()}\n />\n </label>\n <label className=\"sf-field sf-field--narrow\">\n <span>Label (optional)</span>\n <input className=\"sf-input\" value={label} onChange={(e) => setLabel(e.target.value)} />\n </label>\n <button type=\"button\" className=\"sf-btn sf-btn--primary\" disabled={busy || !path.trim()} onClick={request}>\n Request\n </button>\n </div>\n ) : (\n <div className=\"sf-stack\">\n <p>\n Allowing <code>{challenge.message.split(\"|\")[3]}</code> requires a signature from a trusted SSH key. Run\n this where that key lives (expires in about {minutesLeft} min):\n </p>\n <div className=\"sf-row\">\n <textarea className=\"sf-input sf-code\" readOnly rows={3} value={challenge.command} />\n <CopyButton text={challenge.command} label=\"Copy command\" />\n </div>\n <label className=\"sf-field\">\n <span>Paste the full output (BEGIN … END SSH SIGNATURE)</span>\n <textarea\n className=\"sf-input sf-code\"\n rows={6}\n value={signature}\n onChange={(e) => setSignature(e.target.value)}\n placeholder=\"-----BEGIN SSH SIGNATURE-----\"\n />\n </label>\n <div className=\"sf-row\">\n <button\n type=\"button\"\n className=\"sf-btn sf-btn--primary\"\n disabled={busy || !signature.includes(\"END SSH SIGNATURE\")}\n onClick={confirm}\n >\n Verify & allow\n </button>\n <button type=\"button\" className=\"sf-btn\" onClick={() => setChallenge(null)}>\n Cancel\n </button>\n </div>\n </div>\n )}\n {error && <p className=\"sf-error\">{error}</p>}\n </div>\n );\n}\n\nfunction Browser({\n api,\n roots,\n folders,\n onLinked,\n}: {\n api: SecureFilesApi;\n roots: LinkRoot[];\n folders: string[];\n onLinked: () => void;\n}) {\n const [listing, setListing] = useState<BrowseResult | null>(null);\n const [picked, setPicked] = useState<Set<string>>(new Set());\n const [target, setTarget] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n const [result, setResult] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n\n const open = useCallback(\n async (path: string) => {\n setError(null);\n try {\n setListing(await api.browse(path));\n setPicked(new Set());\n } catch (err) {\n setError(errText(err));\n }\n },\n [api]\n );\n\n useEffect(() => {\n if (!listing && roots.length) open(roots[0].path);\n if (listing && !roots.some((r) => listing.path.startsWith(r.path))) setListing(null);\n }, [roots, listing, open]);\n\n const link = async () => {\n setBusy(true);\n setResult(null);\n try {\n const res = await api.link([...picked], target);\n const parts = [`Linked ${res.linked.length} file(s)`];\n if (res.errors.length) parts.push(`${res.errors.length} skipped: ${res.errors.map((e) => e.error).join(\"; \")}`);\n setResult(parts.join(\". \"));\n onLinked();\n if (listing) await open(listing.path);\n } catch (err) {\n setResult(errText(err));\n } finally {\n setBusy(false);\n }\n };\n\n if (!roots.length) return <p className=\"sf-muted\">Allow a directory above to browse and link its files.</p>;\n\n const linkable = listing?.files.filter((f) => !f.linked_id) ?? [];\n const relative = listing ? listing.path.slice(listing.root.length) || \"/\" : \"\";\n\n return (\n <div className=\"sf-card\">\n <h4>Link files</h4>\n <div className=\"sf-row\">\n <select\n className=\"sf-input sf-root-select\"\n value={listing?.root ?? \"\"}\n onChange={(e) => open(e.target.value)}\n >\n {roots.map((r) => (\n <option key={r.id} value={r.path}>\n {r.label ? `${r.label} (${r.path})` : r.path}\n </option>\n ))}\n </select>\n {listing && <code className=\"sf-muted\">{relative}</code>}\n </div>\n {error && <p className=\"sf-error\">{error}</p>}\n {listing && (\n <div className=\"sf-browser\">\n {listing.parent && (\n <button type=\"button\" className=\"sf-browser__dir\" onClick={() => open(listing.parent!)}>\n ↩ ..\n </button>\n )}\n {listing.dirs.map((d) => (\n <button key={d} type=\"button\" className=\"sf-browser__dir\" onClick={() => open(`${listing.path}/${d}`)}>\n 📁 {d}\n </button>\n ))}\n {listing.files.length > 0 && (\n <label className=\"sf-check sf-browser__all\">\n <input\n type=\"checkbox\"\n checked={linkable.length > 0 && linkable.every((f) => picked.has(f.path))}\n disabled={!linkable.length}\n onChange={(e) => setPicked(e.target.checked ? new Set(linkable.map((f) => f.path)) : new Set())}\n />\n Select all files here\n </label>\n )}\n {listing.files.map((f) => (\n <label key={f.path} className={`sf-check sf-browser__file${f.linked_id ? \" sf-muted\" : \"\"}`}>\n <input\n type=\"checkbox\"\n disabled={!!f.linked_id}\n checked={picked.has(f.path)}\n onChange={(e) =>\n setPicked((p) => {\n const next = new Set(p);\n e.target.checked ? next.add(f.path) : next.delete(f.path);\n return next;\n })\n }\n />\n <span className=\"sf-browser__name\">{f.name}</span>\n <span className=\"sf-muted\">{f.linked_id ? \"already linked\" : formatSize(f.size)}</span>\n </label>\n ))}\n {!listing.dirs.length && !listing.files.length && <p className=\"sf-muted\">Empty directory</p>}\n {listing.truncated && <p className=\"sf-muted\">Showing the first 5000 entries.</p>}\n </div>\n )}\n <div className=\"sf-row sf-row--bottom\">\n <FolderSelect label=\"Show in Secure Files under\" folders={folders} value={target} onChange={setTarget} />\n <button type=\"button\" className=\"sf-btn sf-btn--primary\" disabled={busy || !picked.size} onClick={link}>\n {busy ? \"Linking…\" : `Link ${picked.size || \"\"}`.trim()}\n </button>\n </div>\n {result && <p className={result.includes(\"skipped\") ? \"sf-error\" : \"sf-muted\"}>{result}</p>}\n </div>\n );\n}\n\nexport function ServerFiles({\n api,\n folders,\n onLinked,\n}: {\n api: SecureFilesApi;\n folders: string[];\n onLinked: () => void;\n}) {\n const [roots, setRoots] = useState<LinkRoot[] | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const load = useCallback(async () => {\n try {\n setRoots((await api.roots()).roots);\n setError(null);\n } catch (err) {\n setError(errText(err));\n }\n }, [api]);\n\n return (\n <details className=\"sf-admin\" onToggle={(e) => (e.currentTarget as HTMLDetailsElement).open && !roots && load()}>\n <summary>Server files (admin)</summary>\n <div className=\"sf-stack\">\n <p className=\"sf-muted\">\n Link files that already live on the server instead of uploading copies. Only files inside allowed\n directories can be linked; removing a directory immediately disables its links. Deleting a linked entry\n never touches the original file. Available from the local network only.\n </p>\n {error && <p className=\"sf-error\">{error}</p>}\n {roots && (\n <>\n <div className=\"sf-card\">\n <h4>Allowed directories</h4>\n {roots.length === 0 ? (\n <p className=\"sf-muted\">None yet.</p>\n ) : (\n <ul className=\"sf-roots\">\n {roots.map((r) => (\n <li key={r.id}>\n <span>\n <code>{r.path}</code> {r.label && <span className=\"sf-muted\">— {r.label}</span>}\n {!r.exists && <span className=\"sf-error\"> (missing)</span>}\n </span>\n <ConfirmButton\n label=\"Remove\"\n onConfirm={async () => {\n try {\n setRoots((await api.removeRoot(r.id)).roots);\n onLinked();\n } catch (err) {\n setError(errText(err));\n }\n }}\n />\n </li>\n ))}\n </ul>\n )}\n </div>\n <AddRoot api={api} onAdded={setRoots} />\n <Browser api={api} roots={roots} folders={folders} onLinked={onLinked} />\n </>\n )}\n </div>\n </details>\n );\n}\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { createApi } from \"./api\";\nimport type { SecureFile, SecureFilesProps, ShareUpdate } from \"./types\";\nimport { UploadPanel } from \"./UploadPanel\";\nimport { ShareDialog } from \"./ShareDialog\";\nimport { CopyButton } from \"./CopyButton\";\nimport { ConfirmButton } from \"./ConfirmButton\";\nimport { ServerFiles } from \"./ServerFiles\";\nimport \"./styles.css\";\n\ninterface FolderNode {\n name: string;\n path: string;\n folders: Map<string, FolderNode>;\n files: SecureFile[];\n}\n\nfunction buildTree(files: SecureFile[]): FolderNode {\n const root: FolderNode = { name: \"\", path: \"\", folders: new Map(), files: [] };\n for (const f of files) {\n const parts = f.filepath.split(\"/\");\n let node = root;\n parts.slice(0, -1).forEach((part, i) => {\n if (!node.folders.has(part)) {\n node.folders.set(part, { name: part, path: parts.slice(0, i + 1).join(\"/\"), folders: new Map(), files: [] });\n }\n node = node.folders.get(part)!;\n });\n node.files.push(f);\n }\n return root;\n}\n\nfunction allFiles(node: FolderNode): SecureFile[] {\n return [...node.files, ...[...node.folders.values()].flatMap(allFiles)];\n}\n\nexport default function SecureFiles({ apiBase }: SecureFilesProps) {\n const api = useMemo(() => createApi(apiBase), [apiBase]);\n const [files, setFiles] = useState<SecureFile[]>([]);\n const [user, setUser] = useState<string | null>(null);\n const [isAdmin, setIsAdmin] = useState(false);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n const [search, setSearch] = useState(\"\");\n const [selected, setSelected] = useState<Set<number>>(new Set());\n const [collapsed, setCollapsed] = useState<Set<string>>(new Set());\n const [editing, setEditing] = useState<SecureFile | null>(null);\n const [busyIds, setBusyIds] = useState<Set<number>>(new Set());\n\n const load = useCallback(async () => {\n setError(null);\n try {\n const data = await api.list();\n setUser(data.user_name);\n setIsAdmin(data.is_admin);\n setFiles(data.files);\n setSelected((prev) => new Set([...prev].filter((id) => data.files.some((f) => f.id === id))));\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(false);\n }\n }, [api]);\n\n useEffect(() => {\n load();\n const onVisible = () => document.visibilityState === \"visible\" && load();\n document.addEventListener(\"visibilitychange\", onVisible);\n window.addEventListener(\"focus\", onVisible);\n return () => {\n document.removeEventListener(\"visibilitychange\", onVisible);\n window.removeEventListener(\"focus\", onVisible);\n };\n }, [load]);\n\n const run = async (ids: number[], action: () => Promise<unknown>) => {\n setBusyIds((s) => new Set([...s, ...ids]));\n setNotice(null);\n try {\n await action();\n } catch (err) {\n setNotice(err instanceof Error ? err.message : String(err));\n } finally {\n setBusyIds((s) => new Set([...s].filter((id) => !ids.includes(id))));\n }\n };\n\n const replaceFile = (file: SecureFile) => setFiles((fs) => fs.map((f) => (f.id === file.id ? file : f)));\n\n const saveShare = async (update: ShareUpdate) => {\n const { file } = await api.updateShare(update);\n replaceFile(file);\n };\n\n const download = (items: SecureFile[]) => {\n const ready = items.filter((f) => f.available);\n if (!ready.length) return;\n return run(\n ready.map((f) => f.id),\n () => api.download(ready.map((f) => f.id), ready.length === 1 ? ready[0].filename : \"downloads.zip\")\n );\n };\n\n const setShared = (items: SecureFile[], shareable: boolean) =>\n run(\n items.map((f) => f.id),\n async () => {\n for (const f of items) await saveShare({ id: f.id, shareable });\n }\n );\n\n const remove = (items: SecureFile[]) =>\n run(\n items.map((f) => f.id),\n async () => {\n const res = await api.remove(items.map((f) => f.id));\n if (res.errors.length) setNotice(`${res.errors.length} file(s) could not be deleted`);\n await load();\n }\n );\n\n const filtered = useMemo(() => {\n const q = search.trim().toLowerCase();\n return q ? files.filter((f) => f.filepath.toLowerCase().includes(q)) : files;\n }, [files, search]);\n\n const tree = useMemo(() => buildTree(filtered), [filtered]);\n\n const folders = useMemo(() => {\n const set = new Set<string>();\n for (const f of files) {\n const parts = f.filepath.split(\"/\").slice(0, -1);\n parts.forEach((_, i) => set.add(parts.slice(0, i + 1).join(\"/\")));\n }\n return [...set];\n }, [files]);\n\n const selectedFiles = files.filter((f) => selected.has(f.id));\n const toggle = (ids: number[], on: boolean) =>\n setSelected((prev) => {\n const next = new Set(prev);\n ids.forEach((id) => (on ? next.add(id) : next.delete(id)));\n return next;\n });\n const toggleFolder = (path: string) =>\n setCollapsed((c) => {\n const next = new Set(c);\n next.has(path) ? next.delete(path) : next.add(path);\n return next;\n });\n const allVisibleSelected = filtered.length > 0 && filtered.every((f) => selected.has(f.id));\n const searching = search.trim().length > 0;\n\n const renderFile = (f: SecureFile, depth: number) => {\n const busy = busyIds.has(f.id);\n return (\n <tr key={f.id} className={busy ? \"sf-busy\" : undefined}>\n <td className=\"sf-col-check\">\n <input\n type=\"checkbox\"\n aria-label={`Select ${f.filename}`}\n checked={selected.has(f.id)}\n onChange={(e) => toggle([f.id], e.target.checked)}\n />\n </td>\n <td style={{ paddingLeft: 10 + depth * 20 }}>\n <span className={f.available ? undefined : \"sf-strike\"}>{f.filename}</span>\n {f.linked && (\n <span className=\"sf-tag\" title={f.source_path ?? undefined}>\n linked\n </span>\n )}\n {!f.available && (\n <span\n className=\"sf-tag sf-tag--warn\"\n title={f.linked ? \"Source file is gone or its directory is no longer allowed\" : \"File is missing on disk\"}\n >\n missing\n </span>\n )}\n </td>\n <td>\n <button\n type=\"button\"\n className={`sf-pill${f.shareable ? \" sf-pill--on\" : \"\"}`}\n disabled={busy || !f.available}\n onClick={() => setShared([f], !f.shareable)}\n title={f.shareable ? \"Click to stop sharing\" : \"Click to share\"}\n >\n {f.shareable ? \"Shared\" : \"Private\"}\n </button>\n {f.shareable && f.has_password && <span title=\"Password protected\"> 🔒</span>}\n </td>\n <td>\n {f.download_count} / {f.download_limit ?? \"∞\"}\n </td>\n <td className=\"sf-col-actions\">\n <div className=\"sf-row sf-row--end\">\n <button type=\"button\" className=\"sf-btn\" disabled={busy || !f.available} onClick={() => download([f])}>\n Download\n </button>\n {f.shareable && f.available && <CopyButton text={f.share_url} />}\n <button\n type=\"button\"\n className=\"sf-icon-btn\"\n aria-label={`Share settings for ${f.filename}`}\n title=\"Share settings\"\n onClick={() => setEditing(f)}\n >\n ⚙️\n </button>\n <ConfirmButton label={f.linked ? \"Unlink\" : \"Delete\"} disabled={busy} onConfirm={() => remove([f])} />\n </div>\n </td>\n </tr>\n );\n };\n\n const renderFolder = (node: FolderNode, depth: number): React.ReactNode[] => {\n const rows: React.ReactNode[] = [];\n const subFolders = [...node.folders.values()].sort((a, b) => a.name.localeCompare(b.name));\n const ownFiles = [...node.files].sort((a, b) => a.filename.localeCompare(b.filename));\n for (const folder of subFolders) {\n const contents = allFiles(folder);\n const ids = contents.map((f) => f.id);\n const open = searching || !collapsed.has(folder.path);\n rows.push(\n <tr key={`dir:${folder.path}`} className=\"sf-dir\">\n <td className=\"sf-col-check\">\n <input\n type=\"checkbox\"\n aria-label={`Select folder ${folder.path}`}\n checked={ids.length > 0 && ids.every((id) => selected.has(id))}\n onChange={(e) => toggle(ids, e.target.checked)}\n />\n </td>\n <td colSpan={4} style={{ paddingLeft: 10 + depth * 20 }}>\n <button type=\"button\" className=\"sf-dir__toggle\" onClick={() => toggleFolder(folder.path)}>\n {open ? \"▾\" : \"▸\"} 📁 {folder.name} <span className=\"sf-muted\">({contents.length})</span>\n </button>\n </td>\n </tr>\n );\n if (open) rows.push(...renderFolder(folder, depth + 1));\n }\n rows.push(...ownFiles.map((f) => renderFile(f, depth)));\n return rows;\n };\n\n return (\n <div className=\"sf-root\">\n <header className=\"sf-head\">\n <h2>Secure Files</h2>\n {user && <span className=\"sf-muted\">Signed in as {user}</span>}\n </header>\n\n <UploadPanel api={api} folders={folders} onUploaded={load} />\n\n {isAdmin && <ServerFiles api={api} folders={folders} onLinked={load} />}\n\n <section className=\"sf-toolbar\">\n <input\n className=\"sf-input sf-search\"\n type=\"search\"\n placeholder=\"Search files…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n <div className=\"sf-row\">\n <span className=\"sf-muted\">{selected.size} selected</span>\n {folders.length > 0 && (\n <>\n <button type=\"button\" className=\"sf-btn\" onClick={() => setCollapsed(new Set())}>\n Expand all\n </button>\n <button type=\"button\" className=\"sf-btn\" onClick={() => setCollapsed(new Set(folders))}>\n Collapse all\n </button>\n </>\n )}\n <button type=\"button\" className=\"sf-btn\" disabled={!selected.size} onClick={() => download(selectedFiles)}>\n Download\n </button>\n <button type=\"button\" className=\"sf-btn\" disabled={!selected.size} onClick={() => setShared(selectedFiles, true)}>\n Share\n </button>\n <button type=\"button\" className=\"sf-btn\" disabled={!selected.size} onClick={() => setShared(selectedFiles, false)}>\n Unshare\n </button>\n <ConfirmButton label=\"Delete\" disabled={!selected.size} onConfirm={() => remove(selectedFiles)} />\n </div>\n </section>\n\n {notice && (\n <p className=\"sf-error\" role=\"alert\">\n {notice}\n </p>\n )}\n\n {loading ? (\n <p className=\"sf-muted\">Loading…</p>\n ) : error ? (\n <p className=\"sf-error\" role=\"alert\">\n {error}\n </p>\n ) : files.length === 0 ? (\n <p className=\"sf-muted\">No files yet — upload something above.</p>\n ) : (\n <div className=\"sf-table-wrap\">\n <table className=\"sf-table\">\n <thead>\n <tr>\n <th className=\"sf-col-check\">\n <input\n type=\"checkbox\"\n aria-label=\"Select all\"\n checked={allVisibleSelected}\n onChange={(e) => toggle(filtered.map((f) => f.id), e.target.checked)}\n />\n </th>\n <th>Name</th>\n <th>Sharing</th>\n <th>Downloads</th>\n <th className=\"sf-col-actions\">Actions</th>\n </tr>\n </thead>\n <tbody>{renderFolder(tree, 0)}</tbody>\n </table>\n </div>\n )}\n\n {editing && (\n <ShareDialog\n key={editing.id}\n file={files.find((f) => f.id === editing.id) ?? editing}\n onClose={() => setEditing(null)}\n onSave={saveShare}\n />\n )}\n </div>\n );\n}\n"],"names":["_jsxs","_jsx","_Fragment"],"mappings":"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","x_google_ignoreList":[7]}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/api.ts","../src/FolderSelect.tsx","../src/UploadPanel.tsx","../src/CopyButton.tsx","../src/ShareDialog.tsx","../src/ConfirmButton.tsx","../src/ServerFiles.tsx","../node_modules/style-inject/dist/style-inject.es.js","../src/SecureFiles.tsx"],"sourcesContent":["import type { BrowseResult, LinkRoot, RootChallenge, SecureFile, ShareUpdate } from \"./types\";\n\nexport const DEFAULT_API_BASE = \"https://api.abstractendeavors.com\";\n\nexport class ApiError extends Error {\n constructor(message: string, public status: number) {\n super(message);\n }\n}\n\nasync function errorFrom(res: Response): Promise<ApiError> {\n let message = `${res.status} ${res.statusText}`;\n try {\n const body = await res.json();\n message = body?.message || body?.error || message;\n } catch {\n /* non-JSON error body */\n }\n if (res.status === 401) message = \"Please log in to use Secure Files.\";\n return new ApiError(message, res.status);\n}\n\nexport function createApi(apiBase: string = DEFAULT_API_BASE) {\n const root = `${apiBase.replace(/\\/+$/, \"\")}/secure-files`;\n\n async function json<T>(path: string, init: RequestInit = {}): Promise<T> {\n const res = await fetch(`${root}${path}`, {\n credentials: \"include\",\n ...init,\n headers: { Accept: \"application/json\", ...(init.body ? { \"Content-Type\": \"application/json\" } : {}) },\n });\n if (!res.ok) throw await errorFrom(res);\n return res.json();\n }\n\n return {\n list: () => json<{ user_name: string; is_admin: boolean; files: SecureFile[] }>(\"/userInfo\"),\n\n roots: () => json<{ roots: LinkRoot[] }>(\"/admin/roots\"),\n\n requestRoot: (path: string) =>\n json<{ challenge: RootChallenge }>(\"/admin/roots\", { method: \"POST\", body: JSON.stringify({ path }) }),\n\n confirmRoot: (nonce: string, signature: string, label?: string) =>\n json<{ roots: LinkRoot[] }>(\"/admin/roots/confirm\", {\n method: \"POST\",\n body: JSON.stringify({ nonce, signature, label }),\n }),\n\n removeRoot: (id: number) => json<{ roots: LinkRoot[] }>(`/admin/roots/${id}`, { method: \"DELETE\" }),\n\n browse: (path: string) => json<BrowseResult>(`/admin/browse?path=${encodeURIComponent(path)}`),\n\n link: (paths: string[], folder: string) =>\n json<{ linked: string[]; errors: { path: string; error: string }[] }>(\"/admin/link\", {\n method: \"POST\",\n body: JSON.stringify({ paths, folder }),\n }),\n\n updateShare: (update: ShareUpdate) =>\n json<{ file: SecureFile }>(\"/files/share\", { method: \"PATCH\", body: JSON.stringify(update) }),\n\n remove: (ids: number[]) =>\n json<{ removed: number[]; errors: { id: number; error: string }[] }>(\"/remove\", {\n method: \"POST\",\n body: JSON.stringify({ ids }),\n }),\n\n /** Hand the download to the browser so it streams to disk (native progress + resume, no memory limit). */\n download(ids: number[]): void {\n const a = document.createElement(\"a\");\n a.href = `${root}/download?ids=${ids.join(\",\")}`;\n a.rel = \"noopener\";\n document.body.appendChild(a);\n a.click();\n a.remove();\n },\n\n upload(file: File, relPath: string, onProgress?: (fraction: number) => void): Promise<void> {\n return new Promise((resolve, reject) => {\n const form = new FormData();\n form.append(\"file\", file);\n form.append(\"rel_path\", relPath);\n const xhr = new XMLHttpRequest();\n xhr.open(\"POST\", `${root}/upload`);\n xhr.withCredentials = true;\n xhr.upload.onprogress = (e) => {\n if (e.lengthComputable) onProgress?.(e.loaded / e.total);\n };\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) return resolve();\n let message = `Upload failed (${xhr.status})`;\n try {\n message = JSON.parse(xhr.responseText)?.message || message;\n } catch {\n /* non-JSON */\n }\n if (xhr.status === 401) message = \"Please log in to use Secure Files.\";\n reject(new ApiError(message, xhr.status));\n };\n xhr.onerror = () => reject(new ApiError(\"Network error during upload\", 0));\n xhr.send(form);\n });\n },\n };\n}\n\nexport type SecureFilesApi = ReturnType<typeof createApi>;\n","import React, { useState } from \"react\";\n\nconst NEW_FOLDER = \"__new__\";\n\nexport function FolderSelect({\n label,\n folders,\n value,\n onChange,\n}: {\n label: string;\n folders: string[];\n value: string;\n onChange: (folder: string) => void;\n}) {\n const [creating, setCreating] = useState(false);\n const [draft, setDraft] = useState(\"\");\n const [extra, setExtra] = useState<string[]>([]);\n const options = [...new Set([...folders, ...extra, ...(value ? [value] : [])])].sort();\n\n const accept = () => {\n const clean = draft.trim().replace(/^\\/+|\\/+$/g, \"\");\n if (clean) {\n setExtra((e) => (e.includes(clean) ? e : [...e, clean]));\n onChange(clean);\n }\n setCreating(false);\n setDraft(\"\");\n };\n\n return (\n <div className=\"sf-field\">\n <span>{label}</span>\n {creating ? (\n <div className=\"sf-row\">\n <input\n className=\"sf-input\"\n autoFocus\n value={draft}\n placeholder=\"new-folder-name (use / for subfolders)\"\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") accept();\n if (e.key === \"Escape\") setCreating(false);\n }}\n />\n <button type=\"button\" className=\"sf-btn\" onClick={accept}>\n OK\n </button>\n </div>\n ) : (\n <select\n className=\"sf-input\"\n value={value}\n onChange={(e) => (e.target.value === NEW_FOLDER ? setCreating(true) : onChange(e.target.value))}\n >\n <option value=\"\">/ (top level)</option>\n {options.map((d) => (\n <option key={d} value={d}>\n {d}/\n </option>\n ))}\n <option value={NEW_FOLDER}>+ Create new directory…</option>\n </select>\n )}\n </div>\n );\n}\n","import React, { useRef, useState } from \"react\";\nimport type { SecureFilesApi } from \"./api\";\nimport { FolderSelect } from \"./FolderSelect\";\n\ninterface Queued {\n file: File;\n relPath: string;\n progress: number;\n error?: string;\n done?: boolean;\n}\n\nfunction readEntries(reader: any): Promise<any[]> {\n return new Promise((resolve, reject) => reader.readEntries(resolve, reject));\n}\n\nasync function walkEntry(entry: any, prefix: string, out: { file: File; relPath: string }[]) {\n if (entry.isFile) {\n const file: File = await new Promise((resolve, reject) => entry.file(resolve, reject));\n out.push({ file, relPath: prefix + file.name });\n } else if (entry.isDirectory) {\n const reader = entry.createReader();\n let batch: any[];\n do {\n batch = await readEntries(reader);\n for (const child of batch) await walkEntry(child, `${prefix}${entry.name}/`, out);\n } while (batch.length > 0);\n }\n}\n\nasync function filesFromDrop(dt: DataTransfer) {\n const out: { file: File; relPath: string }[] = [];\n const entries = Array.from(dt.items || [])\n .map((item) => (item as any).webkitGetAsEntry?.())\n .filter(Boolean);\n if (entries.length) {\n for (const entry of entries) await walkEntry(entry, \"\", out);\n } else {\n for (const file of Array.from(dt.files)) out.push({ file, relPath: file.name });\n }\n return out;\n}\n\nfunction joinTarget(target: string, relPath: string) {\n const clean = target.trim().replace(/^\\/+|\\/+$/g, \"\");\n return clean ? `${clean}/${relPath}` : relPath;\n}\n\nfunction CloudIcon() {\n return (\n <svg className=\"sf-drop__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5} aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 16.5V9.75m0 0 3 3m-3-3-3 3M6.75 19.5a4.5 4.5 0 0 1-1.41-8.775 5.25 5.25 0 0 1 10.233-2.33 3 3 0 0 1 3.758 3.848A3.752 3.752 0 0 1 18 19.5H6.75Z\"\n />\n </svg>\n );\n}\n\nexport function UploadPanel({\n api,\n folders,\n onUploaded,\n}: {\n api: SecureFilesApi;\n folders: string[];\n onUploaded: () => void;\n}) {\n const [queue, setQueue] = useState<Queued[]>([]);\n const [mode, setMode] = useState<\"files\" | \"folder\">(\"files\");\n const [target, setTarget] = useState(\"\");\n const [dragging, setDragging] = useState(false);\n const [busy, setBusy] = useState(false);\n const [message, setMessage] = useState<string | null>(null);\n const fileInput = useRef<HTMLInputElement>(null);\n const folderInput = useRef<HTMLInputElement>(null);\n\n const enqueue = (items: { file: File; relPath: string }[]) => {\n setMessage(null);\n setQueue((q) => {\n const kept = q.filter((x) => !x.done);\n const seen = new Set(kept.map((x) => x.relPath));\n return [...kept, ...items.filter((i) => !seen.has(i.relPath)).map((i) => ({ ...i, progress: 0 }))];\n });\n };\n\n const openPicker = () => (mode === \"folder\" ? folderInput : fileInput).current?.click();\n\n const fromInput = (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files || []);\n enqueue(files.map((file) => ({ file, relPath: (file as any).webkitRelativePath || file.name })));\n e.target.value = \"\";\n };\n\n const uploadAll = async () => {\n setBusy(true);\n setMessage(null);\n let failed = 0;\n for (let i = 0; i < queue.length; i++) {\n const item = queue[i];\n if (item.done) continue;\n const set = (patch: Partial<Queued>) =>\n setQueue((q) => q.map((x, idx) => (idx === i ? { ...x, ...patch } : x)));\n try {\n await api.upload(item.file, joinTarget(target, item.relPath), (p) => set({ progress: p }));\n set({ progress: 1, done: true, error: undefined });\n } catch (err) {\n failed++;\n set({ error: err instanceof Error ? err.message : String(err) });\n }\n }\n setBusy(false);\n setMessage(failed ? `${failed} upload(s) failed` : \"Upload complete\");\n if (!failed) setQueue([]);\n onUploaded();\n };\n\n const pending = queue.filter((q) => !q.done);\n\n return (\n <section className=\"sf-upload\">\n <div className=\"sf-row sf-mode\" role=\"radiogroup\" aria-label=\"Choose what clicking the upload area picks\">\n <label className=\"sf-check sf-check--inline\">\n <input type=\"radio\" checked={mode === \"files\"} onChange={() => setMode(\"files\")} /> Files\n </label>\n <label className=\"sf-check sf-check--inline\">\n <input type=\"radio\" checked={mode === \"folder\"} onChange={() => setMode(\"folder\")} /> Folder\n </label>\n <span className=\"sf-muted\">(drag-and-drop accepts either)</span>\n </div>\n\n <div\n className={`sf-drop${dragging ? \" sf-drop--active\" : \"\"}`}\n role=\"button\"\n tabIndex={0}\n aria-label={`Upload area: click to choose ${mode === \"folder\" ? \"a folder\" : \"files\"}, or drop files or folders`}\n onClick={openPicker}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n openPicker();\n }\n }}\n onDragEnter={(e) => {\n e.preventDefault();\n setDragging(true);\n }}\n onDragOver={(e) => e.preventDefault()}\n onDragLeave={(e) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node)) setDragging(false);\n }}\n onDrop={async (e) => {\n e.preventDefault();\n setDragging(false);\n enqueue(await filesFromDrop(e.dataTransfer));\n }}\n >\n <CloudIcon />\n <div>\n <p className=\"sf-drop__title\">Drag & drop files or folders here</p>\n <p className=\"sf-muted\">Click anywhere to choose {mode === \"folder\" ? \"a folder\" : \"files\"}</p>\n {pending.length > 0 && (\n <p className=\"sf-drop__count\">\n {pending.length} item{pending.length === 1 ? \"\" : \"s\"} queued\n </p>\n )}\n </div>\n </div>\n <input ref={fileInput} type=\"file\" multiple hidden onChange={fromInput} />\n <input\n ref={folderInput}\n type=\"file\"\n multiple\n hidden\n onChange={fromInput}\n {...({ webkitdirectory: \"\", directory: \"\" } as any)}\n />\n\n <div className=\"sf-row\">\n <FolderSelect label=\"Upload into\" folders={folders} value={target} onChange={setTarget} />\n <button type=\"button\" className=\"sf-btn sf-btn--primary\" disabled={busy || !pending.length} onClick={uploadAll}>\n {busy ? \"Uploading…\" : `Upload ${pending.length}`}\n </button>\n {queue.length > 0 && !busy && (\n <button type=\"button\" className=\"sf-btn\" onClick={() => setQueue([])}>\n Clear\n </button>\n )}\n </div>\n\n {message && (\n <p className={message.includes(\"failed\") ? \"sf-error\" : \"sf-muted\"} role=\"status\">\n {message}\n </p>\n )}\n\n {queue.length > 0 && (\n <ul className=\"sf-queue\">\n {queue.map((q, i) => (\n <li key={`${q.relPath}-${i}`}>\n <span className=\"sf-queue__name\">{joinTarget(target, q.relPath)}</span>\n {q.error ? (\n <span className=\"sf-error\">{q.error}</span>\n ) : (\n <span className=\"sf-row\">\n <progress max={1} value={q.progress} />\n <span className=\"sf-muted\">{Math.round(q.progress * 100)}%</span>\n </span>\n )}\n </li>\n ))}\n </ul>\n )}\n </section>\n );\n}\n","import React, { useState } from \"react\";\n\nexport function CopyButton({ text, label = \"Copy link\" }: { text: string; label?: string }) {\n const [copied, setCopied] = useState(false);\n const copy = async () => {\n try {\n await navigator.clipboard.writeText(text);\n } catch {\n const ta = document.createElement(\"textarea\");\n ta.value = text;\n document.body.appendChild(ta);\n ta.select();\n document.execCommand(\"copy\");\n ta.remove();\n }\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n return (\n <button type=\"button\" className=\"sf-btn\" onClick={copy}>\n {copied ? \"Copied\" : label}\n </button>\n );\n}\n","import React, { useEffect, useState } from \"react\";\nimport type { SecureFile, ShareUpdate } from \"./types\";\nimport { CopyButton } from \"./CopyButton\";\n\ntype PasswordMode = \"keep\" | \"set\" | \"remove\";\n\nexport function ShareDialog({\n file,\n onClose,\n onSave,\n}: {\n file: SecureFile;\n onClose: () => void;\n onSave: (update: ShareUpdate) => Promise<void>;\n}) {\n const [shareable, setShareable] = useState(file.shareable);\n const [limit, setLimit] = useState(file.download_limit ? String(file.download_limit) : \"\");\n const [pwMode, setPwMode] = useState<PasswordMode>(file.has_password ? \"keep\" : \"remove\");\n const [password, setPassword] = useState(\"\");\n const [resetCount, setResetCount] = useState(false);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => e.key === \"Escape\" && onClose();\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [onClose]);\n\n const limitValid = limit === \"\" || /^\\d+$/.test(limit);\n const passwordValid = pwMode !== \"set\" || password.length > 0;\n\n const save = async () => {\n setSaving(true);\n setError(null);\n try {\n const update: ShareUpdate = { id: file.id, shareable };\n if (shareable) {\n update.download_limit = limit === \"\" ? null : Number(limit);\n if (pwMode === \"set\") update.password = password;\n else if (pwMode === \"remove\" && file.has_password) update.password = \"\";\n if (resetCount) update.reset_count = true;\n }\n await onSave(update);\n onClose();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setSaving(false);\n }\n };\n\n return (\n <div className=\"sf-overlay\" onMouseDown={(e) => e.target === e.currentTarget && onClose()}>\n <div className=\"sf-dialog\" role=\"dialog\" aria-modal=\"true\" aria-label={`Share settings for ${file.filename}`}>\n <header className=\"sf-dialog__head\">\n <h3>Share settings</h3>\n <button type=\"button\" className=\"sf-icon-btn\" aria-label=\"Close\" onClick={onClose}>\n ✕\n </button>\n </header>\n <p className=\"sf-muted\">{file.filepath}</p>\n\n <label className=\"sf-check\">\n <input type=\"checkbox\" checked={shareable} onChange={(e) => setShareable(e.target.checked)} />\n Anyone with the link can download\n </label>\n\n <fieldset disabled={!shareable} className=\"sf-fieldset\">\n <label className=\"sf-field\">\n <span>Download limit (blank = unlimited)</span>\n <input\n className=\"sf-input\"\n inputMode=\"numeric\"\n value={limit}\n onChange={(e) => setLimit(e.target.value.trim())}\n placeholder=\"unlimited\"\n />\n {!limitValid && <span className=\"sf-error\">Enter a whole number</span>}\n </label>\n <p className=\"sf-muted\">\n Downloaded {file.download_count} time{file.download_count === 1 ? \"\" : \"s\"}\n {file.download_limit ? ` of ${file.download_limit}` : \"\"}.{\" \"}\n <label className=\"sf-check sf-check--inline\">\n <input type=\"checkbox\" checked={resetCount} onChange={(e) => setResetCount(e.target.checked)} />\n reset count\n </label>\n </p>\n\n <div className=\"sf-field\">\n <span>Password</span>\n <div className=\"sf-row\">\n {file.has_password && (\n <label className=\"sf-check sf-check--inline\">\n <input type=\"radio\" checked={pwMode === \"keep\"} onChange={() => setPwMode(\"keep\")} />\n keep current\n </label>\n )}\n <label className=\"sf-check sf-check--inline\">\n <input type=\"radio\" checked={pwMode === \"set\"} onChange={() => setPwMode(\"set\")} />\n {file.has_password ? \"change\" : \"require password\"}\n </label>\n <label className=\"sf-check sf-check--inline\">\n <input type=\"radio\" checked={pwMode === \"remove\"} onChange={() => setPwMode(\"remove\")} />\n {file.has_password ? \"remove\" : \"none\"}\n </label>\n </div>\n {pwMode === \"set\" && (\n <input\n className=\"sf-input\"\n type=\"password\"\n autoComplete=\"new-password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"New password\"\n />\n )}\n </div>\n\n <div className=\"sf-field\">\n <span>Share link</span>\n <div className=\"sf-row\">\n <input className=\"sf-input\" readOnly value={file.share_url} onFocus={(e) => e.target.select()} />\n <CopyButton text={file.share_url} />\n </div>\n {!file.shareable && <span className=\"sf-muted\">The link works once you save with sharing on.</span>}\n </div>\n </fieldset>\n\n {error && <p className=\"sf-error\">{error}</p>}\n\n <footer className=\"sf-row sf-dialog__foot\">\n <button type=\"button\" className=\"sf-btn\" onClick={onClose}>\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"sf-btn sf-btn--primary\"\n disabled={saving || !limitValid || !passwordValid}\n onClick={save}\n >\n {saving ? \"Saving…\" : \"Save\"}\n </button>\n </footer>\n </div>\n </div>\n );\n}\n","import React, { useEffect, useState } from \"react\";\n\nexport function ConfirmButton({\n label,\n onConfirm,\n disabled,\n}: {\n label: string;\n onConfirm: () => void;\n disabled?: boolean;\n}) {\n const [armed, setArmed] = useState(false);\n useEffect(() => {\n if (!armed) return;\n const t = setTimeout(() => setArmed(false), 3000);\n return () => clearTimeout(t);\n }, [armed]);\n return (\n <button\n type=\"button\"\n className={`sf-btn sf-btn--danger${armed ? \" sf-btn--armed\" : \"\"}`}\n disabled={disabled}\n onClick={() => {\n if (armed) {\n setArmed(false);\n onConfirm();\n } else {\n setArmed(true);\n }\n }}\n >\n {armed ? \"Confirm\" : label}\n </button>\n );\n}\n","import React, { useCallback, useEffect, useState } from \"react\";\nimport type { SecureFilesApi } from \"./api\";\nimport type { BrowseResult, LinkRoot, RootChallenge } from \"./types\";\nimport { ConfirmButton } from \"./ConfirmButton\";\nimport { CopyButton } from \"./CopyButton\";\nimport { FolderSelect } from \"./FolderSelect\";\n\nfunction formatSize(bytes: number) {\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n let n = bytes;\n let i = 0;\n while (n >= 1024 && i < units.length - 1) {\n n /= 1024;\n i++;\n }\n return `${n.toFixed(i ? 1 : 0)} ${units[i]}`;\n}\n\nconst errText = (err: unknown) => (err instanceof Error ? err.message : String(err));\n\nfunction AddRoot({ api, onAdded }: { api: SecureFilesApi; onAdded: (roots: LinkRoot[]) => void }) {\n const [path, setPath] = useState(\"\");\n const [label, setLabel] = useState(\"\");\n const [challenge, setChallenge] = useState<RootChallenge | null>(null);\n const [signature, setSignature] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n\n const request = async () => {\n setBusy(true);\n setError(null);\n try {\n setChallenge((await api.requestRoot(path.trim())).challenge);\n setSignature(\"\");\n } catch (err) {\n setError(errText(err));\n } finally {\n setBusy(false);\n }\n };\n\n const confirm = async () => {\n if (!challenge) return;\n setBusy(true);\n setError(null);\n try {\n onAdded((await api.confirmRoot(challenge.nonce, signature, label)).roots);\n setChallenge(null);\n setPath(\"\");\n setLabel(\"\");\n setSignature(\"\");\n } catch (err) {\n setError(errText(err));\n } finally {\n setBusy(false);\n }\n };\n\n const minutesLeft = challenge ? Math.max(0, Math.round((challenge.expires * 1000 - Date.now()) / 60000)) : 0;\n\n return (\n <div className=\"sf-card\">\n <h4>Allow a directory</h4>\n {!challenge ? (\n <div className=\"sf-row sf-row--bottom\">\n <label className=\"sf-field\">\n <span>Absolute path on the server</span>\n <input\n className=\"sf-input\"\n value={path}\n onChange={(e) => setPath(e.target.value)}\n placeholder=\"/srv/shared/docs\"\n onKeyDown={(e) => e.key === \"Enter\" && path.trim() && request()}\n />\n </label>\n <label className=\"sf-field sf-field--narrow\">\n <span>Label (optional)</span>\n <input className=\"sf-input\" value={label} onChange={(e) => setLabel(e.target.value)} />\n </label>\n <button type=\"button\" className=\"sf-btn sf-btn--primary\" disabled={busy || !path.trim()} onClick={request}>\n Request\n </button>\n </div>\n ) : (\n <div className=\"sf-stack\">\n <p>\n Allowing <code>{challenge.message.split(\"|\")[3]}</code> requires a signature from a trusted SSH key. Run\n this where that key lives (expires in about {minutesLeft} min):\n </p>\n <div className=\"sf-row\">\n <textarea className=\"sf-input sf-code\" readOnly rows={3} value={challenge.command} />\n <CopyButton text={challenge.command} label=\"Copy command\" />\n </div>\n <label className=\"sf-field\">\n <span>Paste the full output (BEGIN … END SSH SIGNATURE)</span>\n <textarea\n className=\"sf-input sf-code\"\n rows={6}\n value={signature}\n onChange={(e) => setSignature(e.target.value)}\n placeholder=\"-----BEGIN SSH SIGNATURE-----\"\n />\n </label>\n <div className=\"sf-row\">\n <button\n type=\"button\"\n className=\"sf-btn sf-btn--primary\"\n disabled={busy || !signature.includes(\"END SSH SIGNATURE\")}\n onClick={confirm}\n >\n Verify & allow\n </button>\n <button type=\"button\" className=\"sf-btn\" onClick={() => setChallenge(null)}>\n Cancel\n </button>\n </div>\n </div>\n )}\n {error && <p className=\"sf-error\">{error}</p>}\n </div>\n );\n}\n\nfunction Browser({\n api,\n roots,\n folders,\n onLinked,\n}: {\n api: SecureFilesApi;\n roots: LinkRoot[];\n folders: string[];\n onLinked: () => void;\n}) {\n const [listing, setListing] = useState<BrowseResult | null>(null);\n const [picked, setPicked] = useState<Set<string>>(new Set());\n const [target, setTarget] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n const [result, setResult] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n\n const open = useCallback(\n async (path: string) => {\n setError(null);\n try {\n setListing(await api.browse(path));\n setPicked(new Set());\n } catch (err) {\n setError(errText(err));\n }\n },\n [api]\n );\n\n useEffect(() => {\n if (!listing && roots.length) open(roots[0].path);\n if (listing && !roots.some((r) => listing.path.startsWith(r.path))) setListing(null);\n }, [roots, listing, open]);\n\n const togglePick = (path: string, on: boolean) =>\n setPicked((p) => {\n const next = new Set(p);\n on ? next.add(path) : next.delete(path);\n return next;\n });\n\n const link = async () => {\n setBusy(true);\n setResult(null);\n try {\n const res = await api.link([...picked], target);\n const parts = [`Linked ${res.linked.length} file(s)`];\n if (res.errors.length) parts.push(`${res.errors.length} skipped: ${res.errors.map((e) => e.error).join(\"; \")}`);\n setResult(parts.join(\". \"));\n onLinked();\n if (listing) await open(listing.path);\n } catch (err) {\n setResult(errText(err));\n } finally {\n setBusy(false);\n }\n };\n\n if (!roots.length) return <p className=\"sf-muted\">Allow a directory above to browse and link its files.</p>;\n\n const linkable = [\n ...(listing?.dirs.filter((d) => !d.linked_id) ?? []),\n ...(listing?.files.filter((f) => !f.linked_id) ?? []),\n ];\n const relative = listing ? listing.path.slice(listing.root.length) || \"/\" : \"\";\n\n return (\n <div className=\"sf-card\">\n <h4>Link files or folders</h4>\n <div className=\"sf-row\">\n <select\n className=\"sf-input sf-root-select\"\n value={listing?.root ?? \"\"}\n onChange={(e) => open(e.target.value)}\n >\n {roots.map((r) => (\n <option key={r.id} value={r.path}>\n {r.label ? `${r.label} (${r.path})` : r.path}\n </option>\n ))}\n </select>\n {listing && <code className=\"sf-muted\">{relative}</code>}\n </div>\n {error && <p className=\"sf-error\">{error}</p>}\n {listing && (\n <div className=\"sf-browser\">\n {listing.parent && (\n <button type=\"button\" className=\"sf-browser__dir\" onClick={() => open(listing.parent!)}>\n ↩ ..\n </button>\n )}\n {listing.dirs.map((d) => (\n <div key={d.path} className={`sf-browser__row${d.linked_id ? \" sf-muted\" : \"\"}`}>\n <input\n type=\"checkbox\"\n aria-label={`Select folder ${d.name}`}\n disabled={!!d.linked_id}\n checked={picked.has(d.path)}\n onChange={(e) => togglePick(d.path, e.target.checked)}\n />\n <button type=\"button\" className=\"sf-browser__dir\" onClick={() => open(d.path)} title=\"Open folder\">\n 📁 {d.name}\n </button>\n <span className=\"sf-muted\">{d.linked_id ? \"already linked\" : \"folder → .tar\"}</span>\n </div>\n ))}\n {linkable.length > 0 && (\n <label className=\"sf-check sf-browser__all\">\n <input\n type=\"checkbox\"\n checked={linkable.length > 0 && linkable.every((f) => picked.has(f.path))}\n disabled={!linkable.length}\n onChange={(e) => setPicked(e.target.checked ? new Set(linkable.map((f) => f.path)) : new Set())}\n />\n Select everything here\n </label>\n )}\n {listing.files.map((f) => (\n <label key={f.path} className={`sf-check sf-browser__file${f.linked_id ? \" sf-muted\" : \"\"}`}>\n <input\n type=\"checkbox\"\n disabled={!!f.linked_id}\n checked={picked.has(f.path)}\n onChange={(e) => togglePick(f.path, e.target.checked)}\n />\n <span className=\"sf-browser__name\">{f.name}</span>\n <span className=\"sf-muted\">{f.linked_id ? \"already linked\" : formatSize(f.size)}</span>\n </label>\n ))}\n {!listing.dirs.length && !listing.files.length && <p className=\"sf-muted\">Empty directory</p>}\n {listing.truncated && <p className=\"sf-muted\">Showing the first 5000 entries.</p>}\n </div>\n )}\n <div className=\"sf-row sf-row--bottom\">\n <FolderSelect label=\"Show in Secure Files under\" folders={folders} value={target} onChange={setTarget} />\n <button type=\"button\" className=\"sf-btn sf-btn--primary\" disabled={busy || !picked.size} onClick={link}>\n {busy ? \"Linking…\" : `Link ${picked.size || \"\"}`.trim()}\n </button>\n </div>\n {result && <p className={result.includes(\"skipped\") ? \"sf-error\" : \"sf-muted\"}>{result}</p>}\n </div>\n );\n}\n\nexport function ServerFiles({\n api,\n folders,\n onLinked,\n}: {\n api: SecureFilesApi;\n folders: string[];\n onLinked: () => void;\n}) {\n const [roots, setRoots] = useState<LinkRoot[] | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const load = useCallback(async () => {\n try {\n setRoots((await api.roots()).roots);\n setError(null);\n } catch (err) {\n setError(errText(err));\n }\n }, [api]);\n\n return (\n <details className=\"sf-admin\" onToggle={(e) => (e.currentTarget as HTMLDetailsElement).open && !roots && load()}>\n <summary>Server files (admin)</summary>\n <div className=\"sf-stack\">\n <p className=\"sf-muted\">\n Link files or whole folders that already live on the server instead of uploading copies. A linked folder\n downloads as one uncompressed .tar with an exact size, and interrupted downloads can be resumed. Only\n items inside allowed directories can be linked; removing a directory immediately disables its links.\n Deleting a linked entry never touches the original. Available from the local network only.\n </p>\n {error && <p className=\"sf-error\">{error}</p>}\n {roots && (\n <>\n <div className=\"sf-card\">\n <h4>Allowed directories</h4>\n {roots.length === 0 ? (\n <p className=\"sf-muted\">None yet.</p>\n ) : (\n <ul className=\"sf-roots\">\n {roots.map((r) => (\n <li key={r.id}>\n <span>\n <code>{r.path}</code> {r.label && <span className=\"sf-muted\">— {r.label}</span>}\n {!r.exists && <span className=\"sf-error\"> (missing)</span>}\n </span>\n <ConfirmButton\n label=\"Remove\"\n onConfirm={async () => {\n try {\n setRoots((await api.removeRoot(r.id)).roots);\n onLinked();\n } catch (err) {\n setError(errText(err));\n }\n }}\n />\n </li>\n ))}\n </ul>\n )}\n </div>\n <AddRoot api={api} onAdded={setRoots} />\n <Browser api={api} roots={roots} folders={folders} onLinked={onLinked} />\n </>\n )}\n </div>\n </details>\n );\n}\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { createApi } from \"./api\";\nimport type { SecureFile, SecureFilesProps, ShareUpdate } from \"./types\";\nimport { UploadPanel } from \"./UploadPanel\";\nimport { ShareDialog } from \"./ShareDialog\";\nimport { CopyButton } from \"./CopyButton\";\nimport { ConfirmButton } from \"./ConfirmButton\";\nimport { ServerFiles } from \"./ServerFiles\";\nimport \"./styles.css\";\n\ninterface FolderNode {\n name: string;\n path: string;\n folders: Map<string, FolderNode>;\n files: SecureFile[];\n}\n\nfunction buildTree(files: SecureFile[]): FolderNode {\n const root: FolderNode = { name: \"\", path: \"\", folders: new Map(), files: [] };\n for (const f of files) {\n const parts = f.filepath.split(\"/\");\n let node = root;\n parts.slice(0, -1).forEach((part, i) => {\n if (!node.folders.has(part)) {\n node.folders.set(part, { name: part, path: parts.slice(0, i + 1).join(\"/\"), folders: new Map(), files: [] });\n }\n node = node.folders.get(part)!;\n });\n node.files.push(f);\n }\n return root;\n}\n\nfunction allFiles(node: FolderNode): SecureFile[] {\n return [...node.files, ...[...node.folders.values()].flatMap(allFiles)];\n}\n\nexport default function SecureFiles({ apiBase }: SecureFilesProps) {\n const api = useMemo(() => createApi(apiBase), [apiBase]);\n const [files, setFiles] = useState<SecureFile[]>([]);\n const [user, setUser] = useState<string | null>(null);\n const [isAdmin, setIsAdmin] = useState(false);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n const [search, setSearch] = useState(\"\");\n const [selected, setSelected] = useState<Set<number>>(new Set());\n const [collapsed, setCollapsed] = useState<Set<string>>(new Set());\n const [editing, setEditing] = useState<SecureFile | null>(null);\n const [busyIds, setBusyIds] = useState<Set<number>>(new Set());\n\n const load = useCallback(async () => {\n setError(null);\n try {\n const data = await api.list();\n setUser(data.user_name);\n setIsAdmin(data.is_admin);\n setFiles(data.files);\n setSelected((prev) => new Set([...prev].filter((id) => data.files.some((f) => f.id === id))));\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(false);\n }\n }, [api]);\n\n useEffect(() => {\n load();\n const onVisible = () => document.visibilityState === \"visible\" && load();\n document.addEventListener(\"visibilitychange\", onVisible);\n window.addEventListener(\"focus\", onVisible);\n return () => {\n document.removeEventListener(\"visibilitychange\", onVisible);\n window.removeEventListener(\"focus\", onVisible);\n };\n }, [load]);\n\n const run = async (ids: number[], action: () => Promise<unknown>) => {\n setBusyIds((s) => new Set([...s, ...ids]));\n setNotice(null);\n try {\n await action();\n } catch (err) {\n setNotice(err instanceof Error ? err.message : String(err));\n } finally {\n setBusyIds((s) => new Set([...s].filter((id) => !ids.includes(id))));\n }\n };\n\n const replaceFile = (file: SecureFile) => setFiles((fs) => fs.map((f) => (f.id === file.id ? file : f)));\n\n const saveShare = async (update: ShareUpdate) => {\n const { file } = await api.updateShare(update);\n replaceFile(file);\n };\n\n const download = (items: SecureFile[]) => {\n const ready = items.filter((f) => f.available);\n if (!ready.length) return;\n api.download(ready.map((f) => f.id));\n };\n\n const setShared = (items: SecureFile[], shareable: boolean) =>\n run(\n items.map((f) => f.id),\n async () => {\n for (const f of items) await saveShare({ id: f.id, shareable });\n }\n );\n\n const remove = (items: SecureFile[]) =>\n run(\n items.map((f) => f.id),\n async () => {\n const res = await api.remove(items.map((f) => f.id));\n if (res.errors.length) setNotice(`${res.errors.length} file(s) could not be deleted`);\n await load();\n }\n );\n\n const filtered = useMemo(() => {\n const q = search.trim().toLowerCase();\n return q ? files.filter((f) => f.filepath.toLowerCase().includes(q)) : files;\n }, [files, search]);\n\n const tree = useMemo(() => buildTree(filtered), [filtered]);\n\n const folders = useMemo(() => {\n const set = new Set<string>();\n for (const f of files) {\n const parts = f.filepath.split(\"/\").slice(0, -1);\n parts.forEach((_, i) => set.add(parts.slice(0, i + 1).join(\"/\")));\n }\n return [...set];\n }, [files]);\n\n const selectedFiles = files.filter((f) => selected.has(f.id));\n const toggle = (ids: number[], on: boolean) =>\n setSelected((prev) => {\n const next = new Set(prev);\n ids.forEach((id) => (on ? next.add(id) : next.delete(id)));\n return next;\n });\n const toggleFolder = (path: string) =>\n setCollapsed((c) => {\n const next = new Set(c);\n next.has(path) ? next.delete(path) : next.add(path);\n return next;\n });\n const allVisibleSelected = filtered.length > 0 && filtered.every((f) => selected.has(f.id));\n const searching = search.trim().length > 0;\n\n const renderFile = (f: SecureFile, depth: number) => {\n const busy = busyIds.has(f.id);\n return (\n <tr key={f.id} className={busy ? \"sf-busy\" : undefined}>\n <td className=\"sf-col-check\">\n <input\n type=\"checkbox\"\n aria-label={`Select ${f.filename}`}\n checked={selected.has(f.id)}\n onChange={(e) => toggle([f.id], e.target.checked)}\n />\n </td>\n <td style={{ paddingLeft: 10 + depth * 20 }}>\n <span className={f.available ? undefined : \"sf-strike\"}>{f.filename}</span>\n {f.kind === \"folder\" && (\n <span className=\"sf-tag\" title=\"Downloads as one uncompressed, resumable .tar of the whole folder\">\n folder · .tar\n </span>\n )}\n {f.linked && (\n <span className=\"sf-tag\" title={f.source_path ?? undefined}>\n linked\n </span>\n )}\n {!f.available && (\n <span\n className=\"sf-tag sf-tag--warn\"\n title={f.linked ? \"Source file is gone or its directory is no longer allowed\" : \"File is missing on disk\"}\n >\n missing\n </span>\n )}\n </td>\n <td>\n <button\n type=\"button\"\n className={`sf-pill${f.shareable ? \" sf-pill--on\" : \"\"}`}\n disabled={busy || !f.available}\n onClick={() => setShared([f], !f.shareable)}\n title={f.shareable ? \"Click to stop sharing\" : \"Click to share\"}\n >\n {f.shareable ? \"Shared\" : \"Private\"}\n </button>\n {f.shareable && f.has_password && <span title=\"Password protected\"> 🔒</span>}\n </td>\n <td>\n {f.download_count} / {f.download_limit ?? \"∞\"}\n </td>\n <td className=\"sf-col-actions\">\n <div className=\"sf-row sf-row--end\">\n <button type=\"button\" className=\"sf-btn\" disabled={busy || !f.available} onClick={() => download([f])}>\n Download\n </button>\n {f.shareable && f.available && <CopyButton text={f.share_url} />}\n <button\n type=\"button\"\n className=\"sf-icon-btn\"\n aria-label={`Share settings for ${f.filename}`}\n title=\"Share settings\"\n onClick={() => setEditing(f)}\n >\n ⚙️\n </button>\n <ConfirmButton label={f.linked ? \"Unlink\" : \"Delete\"} disabled={busy} onConfirm={() => remove([f])} />\n </div>\n </td>\n </tr>\n );\n };\n\n const renderFolder = (node: FolderNode, depth: number): React.ReactNode[] => {\n const rows: React.ReactNode[] = [];\n const subFolders = [...node.folders.values()].sort((a, b) => a.name.localeCompare(b.name));\n const ownFiles = [...node.files].sort((a, b) => a.filename.localeCompare(b.filename));\n for (const folder of subFolders) {\n const contents = allFiles(folder);\n const ids = contents.map((f) => f.id);\n const open = searching || !collapsed.has(folder.path);\n rows.push(\n <tr key={`dir:${folder.path}`} className=\"sf-dir\">\n <td className=\"sf-col-check\">\n <input\n type=\"checkbox\"\n aria-label={`Select folder ${folder.path}`}\n checked={ids.length > 0 && ids.every((id) => selected.has(id))}\n onChange={(e) => toggle(ids, e.target.checked)}\n />\n </td>\n <td colSpan={4} style={{ paddingLeft: 10 + depth * 20 }}>\n <button type=\"button\" className=\"sf-dir__toggle\" onClick={() => toggleFolder(folder.path)}>\n {open ? \"▾\" : \"▸\"} 📁 {folder.name} <span className=\"sf-muted\">({contents.length})</span>\n </button>\n </td>\n </tr>\n );\n if (open) rows.push(...renderFolder(folder, depth + 1));\n }\n rows.push(...ownFiles.map((f) => renderFile(f, depth)));\n return rows;\n };\n\n return (\n <div className=\"sf-root\">\n <header className=\"sf-head\">\n <h2>Secure Files</h2>\n {user && <span className=\"sf-muted\">Signed in as {user}</span>}\n </header>\n\n <UploadPanel api={api} folders={folders} onUploaded={load} />\n\n {isAdmin && <ServerFiles api={api} folders={folders} onLinked={load} />}\n\n <section className=\"sf-toolbar\">\n <input\n className=\"sf-input sf-search\"\n type=\"search\"\n placeholder=\"Search files…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n <div className=\"sf-row\">\n <span className=\"sf-muted\">{selected.size} selected</span>\n {folders.length > 0 && (\n <>\n <button type=\"button\" className=\"sf-btn\" onClick={() => setCollapsed(new Set())}>\n Expand all\n </button>\n <button type=\"button\" className=\"sf-btn\" onClick={() => setCollapsed(new Set(folders))}>\n Collapse all\n </button>\n </>\n )}\n <button type=\"button\" className=\"sf-btn\" disabled={!selected.size} onClick={() => download(selectedFiles)}>\n Download\n </button>\n <button type=\"button\" className=\"sf-btn\" disabled={!selected.size} onClick={() => setShared(selectedFiles, true)}>\n Share\n </button>\n <button type=\"button\" className=\"sf-btn\" disabled={!selected.size} onClick={() => setShared(selectedFiles, false)}>\n Unshare\n </button>\n <ConfirmButton label=\"Delete\" disabled={!selected.size} onConfirm={() => remove(selectedFiles)} />\n </div>\n </section>\n\n {notice && (\n <p className=\"sf-error\" role=\"alert\">\n {notice}\n </p>\n )}\n\n {loading ? (\n <p className=\"sf-muted\">Loading…</p>\n ) : error ? (\n <p className=\"sf-error\" role=\"alert\">\n {error}\n </p>\n ) : files.length === 0 ? (\n <p className=\"sf-muted\">No files yet — upload something above.</p>\n ) : (\n <div className=\"sf-table-wrap\">\n <table className=\"sf-table\">\n <thead>\n <tr>\n <th className=\"sf-col-check\">\n <input\n type=\"checkbox\"\n aria-label=\"Select all\"\n checked={allVisibleSelected}\n onChange={(e) => toggle(filtered.map((f) => f.id), e.target.checked)}\n />\n </th>\n <th>Name</th>\n <th>Sharing</th>\n <th>Downloads</th>\n <th className=\"sf-col-actions\">Actions</th>\n </tr>\n </thead>\n <tbody>{renderFolder(tree, 0)}</tbody>\n </table>\n </div>\n )}\n\n {editing && (\n <ShareDialog\n key={editing.id}\n file={files.find((f) => f.id === editing.id) ?? editing}\n onClose={() => setEditing(null)}\n onSave={saveShare}\n />\n )}\n </div>\n );\n}\n"],"names":["_jsxs","_jsx","_Fragment"],"mappings":"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","x_google_ignoreList":[7]}
|
package/dist/types.d.ts
CHANGED
|
@@ -11,6 +11,8 @@ export interface SecureFile {
|
|
|
11
11
|
share_url: string;
|
|
12
12
|
/** true when the entry points at a file elsewhere on the server instead of an upload */
|
|
13
13
|
linked: boolean;
|
|
14
|
+
/** "folder" entries download as an uncompressed, resumable .tar of the whole directory */
|
|
15
|
+
kind: "file" | "folder";
|
|
14
16
|
source_path: string | null;
|
|
15
17
|
/** false when the file is missing on disk (or its allowed directory was removed) */
|
|
16
18
|
available: boolean;
|
|
@@ -31,7 +33,11 @@ export interface BrowseResult {
|
|
|
31
33
|
path: string;
|
|
32
34
|
root: string;
|
|
33
35
|
parent: string | null;
|
|
34
|
-
dirs:
|
|
36
|
+
dirs: {
|
|
37
|
+
name: string;
|
|
38
|
+
path: string;
|
|
39
|
+
linked_id: number | null;
|
|
40
|
+
}[];
|
|
35
41
|
files: {
|
|
36
42
|
name: string;
|
|
37
43
|
path: string;
|
package/package.json
CHANGED
package/src/SecureFiles.tsx
CHANGED
|
@@ -97,10 +97,7 @@ export default function SecureFiles({ apiBase }: SecureFilesProps) {
|
|
|
97
97
|
const download = (items: SecureFile[]) => {
|
|
98
98
|
const ready = items.filter((f) => f.available);
|
|
99
99
|
if (!ready.length) return;
|
|
100
|
-
|
|
101
|
-
ready.map((f) => f.id),
|
|
102
|
-
() => api.download(ready.map((f) => f.id), ready.length === 1 ? ready[0].filename : "downloads.zip")
|
|
103
|
-
);
|
|
100
|
+
api.download(ready.map((f) => f.id));
|
|
104
101
|
};
|
|
105
102
|
|
|
106
103
|
const setShared = (items: SecureFile[], shareable: boolean) =>
|
|
@@ -167,6 +164,11 @@ export default function SecureFiles({ apiBase }: SecureFilesProps) {
|
|
|
167
164
|
</td>
|
|
168
165
|
<td style={{ paddingLeft: 10 + depth * 20 }}>
|
|
169
166
|
<span className={f.available ? undefined : "sf-strike"}>{f.filename}</span>
|
|
167
|
+
{f.kind === "folder" && (
|
|
168
|
+
<span className="sf-tag" title="Downloads as one uncompressed, resumable .tar of the whole folder">
|
|
169
|
+
folder · .tar
|
|
170
|
+
</span>
|
|
171
|
+
)}
|
|
170
172
|
{f.linked && (
|
|
171
173
|
<span className="sf-tag" title={f.source_path ?? undefined}>
|
|
172
174
|
linked
|