import React, { useMemo, useState, useCallback, useEffect } from 'react'; const SECTIONS = [ { id: 'webdav', label: 'WebDAV', }, ]; const SettingsModal = ({ open, onClose, tokens = [], loading = false, creating = false, deletingId = null, onRefresh, onCreate, onDelete, createdToken = null, onDismissCreatedToken, }) => { const defaultSection = SECTIONS[0]?.id || 'webdav'; const [activeSection, setActiveSection] = useState(defaultSection); const [newTokenLabel, setNewTokenLabel] = useState(''); const [newTokenExpires, setNewTokenExpires] = useState(''); const [formError, setFormError] = useState(null); const handleBackdropClick = useCallback(() => { onClose?.(); }, [onClose]); const handleInnerClick = useCallback((event) => { event.stopPropagation(); }, []); useEffect(() => { if (!open) { setActiveSection(defaultSection); setNewTokenLabel(''); setNewTokenExpires(''); setFormError(null); } }, [open, defaultSection]); const formatDateTime = useCallback((value) => { if (!value) { return '—'; } const timestamp = new Date(value); if (Number.isNaN(timestamp.getTime())) { return value; } return timestamp.toLocaleString(); }, []); const handleRefresh = useCallback(() => { onRefresh?.(); }, [onRefresh]); const handleCopyToken = useCallback(() => { if (!createdToken) { return; } if (navigator?.clipboard?.writeText) { navigator.clipboard.writeText(createdToken).catch(() => {}); } }, [createdToken]); const handleDismissSecret = useCallback(() => { onDismissCreatedToken?.(); }, [onDismissCreatedToken]); const handleCreateToken = useCallback( async (event) => { event.preventDefault(); setFormError(null); let normalizedLabel = newTokenLabel.trim(); if (normalizedLabel.length === 0) { normalizedLabel = undefined; } let normalizedExpires; if (newTokenExpires) { const parsed = new Date(newTokenExpires); if (Number.isNaN(parsed.getTime())) { setFormError('Enter a valid expiration date.'); return; } normalizedExpires = parsed.toISOString(); } const result = await onCreate?.({ label: normalizedLabel, expires_at: normalizedExpires, }); if (result !== false) { setNewTokenLabel(''); setNewTokenExpires(''); setFormError(null); } }, [newTokenExpires, newTokenLabel, onCreate], ); const renderWebdavSection = useMemo(() => { const hasTokens = Array.isArray(tokens) && tokens.length > 0; return (
Copy this token now; you will not be able to view it again after closing this window.
{createdToken}
{formError}
: null} {loading && !hasTokens ? (Loading tokens…
) : null} {!loading && !hasTokens ? (No WebDAV tokens yet.
) : null} {hasTokens ? (| Label | Created | Last used | Expires | Actions |
|---|---|---|---|---|
| {token.label || '—'} | {formatDateTime(token.created_at)} | {formatDateTime(token.last_used_at)} | {formatDateTime(token.expires_at)} | {isRevoked ? ( Revoked ) : ( )} |
Select a settings section.
}