import { createUploadRequestAction, deleteOwnUploadAction, extendOwnUploadAction, userLogoutAction, } from '@/src/lib/actions.js'; import { all, runCleanupIfNeeded } from '@/src/lib/db.js'; import { sharedLinkName } from '@/src/lib/files.js'; import { formatBytes, formatCountdown, formatTimestamp, readSearchParam } from '@/src/lib/format.js'; import { ensureCsrfToken, requireAuthenticatedUser } from '@/src/lib/security.js'; import { CopyLinkButton } from '../_components/copy-link-button.js'; import { StatusMessage } from '../_components/status-message.js'; import { UploadProgressForm } from '../_components/upload-progress-form.js'; export const dynamic = 'force-dynamic'; export default async function DashboardPage({ searchParams }) { await runCleanupIfNeeded(); const user = await requireAuthenticatedUser(); const csrfToken = await ensureCsrfToken(); const uploads = await all( 'SELECT id, original_name, stored_name, size_bytes, uploaded_at, expires_at FROM uploads WHERE owner = ? ORDER BY uploaded_at DESC', [user.username] ); const uploadRequests = await all( `SELECT id, note, created_at, expires_at, completed_at, uploaded_original_name FROM upload_requests WHERE owner = ? ORDER BY created_at DESC LIMIT 200`, [user.username] ); const resolvedSearchParams = await searchParams; const error = readSearchParam(resolvedSearchParams, 'error'); const success = readSearchParam(resolvedSearchParams, 'success'); const totalBytes = uploads.reduce((total, item) => total + (Number(item.size_bytes) || 0), 0); const nowTs = Date.now(); return (

Dateiverwaltung

Angemeldet als {user.username}

{user.admin ? ( Adminbereich ) : null}

Neue Datei hochladen

Upload-Anfragen

Benachrichtigung erfolgt an deinen Benutzernamen (E-Mail-Adresse).

{uploadRequests.length === 0 ? (

Noch keine Upload-Anfragen.

) : (
{uploadRequests.map((entry) => { const requestPath = `/_request/${encodeURIComponent(entry.id)}`; const isCompleted = Number(entry.completed_at || 0) > 0; const isExpired = !isCompleted && Number(entry.expires_at || 0) <= nowTs; return ( ); })}
Anfrage Status Erstellt Gültig bis Ergebnis Aktionen
{entry.id} {entry.note ?
{entry.note}
: null}
{isCompleted ? 'Abgeschlossen' : isExpired ? 'Abgelaufen' : 'Offen'} {formatTimestamp(entry.created_at)} {formatTimestamp(entry.expires_at)} {entry.uploaded_original_name || '-'}
)}

Aktuelle Uploads

{uploads.length === 0 ? (

Noch keine Uploads.

) : (
{uploads.map((item) => { const shareName = sharedLinkName(item.stored_name); const sharePath = `/_share/${encodeURIComponent(shareName)}`; return ( ); })}
Datei Größe Hochgeladen Ablauf Aktionen
{item.original_name}
{item.stored_name}
{formatBytes(item.size_bytes)} {formatTimestamp(item.uploaded_at)}
{formatTimestamp(item.expires_at)}
Noch {formatCountdown(item.expires_at)}
)}
); }