import { useState } from 'react' import { Link } from 'react-router-dom' import { ChevronLeft, FileText, RefreshCw } from 'lucide-react' import { api } from '../../api/client' import AccountPicker, { type PickedAccount } from './AccountPicker' export default function ApacheLogs() { const [selected, setSelected] = useState(null) const [logType, setLogType] = useState<'access' | 'error'>('access') const [lines, setLines] = useState([]) const [loading, setLoading] = useState(false) const [error, setError] = useState('') const fetchLogs = async (username: string, type: 'access' | 'error') => { setLoading(true); setError('') try { const r = await api.get(`/nixserver/webserver/accounts/${username}/logs/${type}`) setLines(r.data.data.lines ?? []) } catch (e: unknown) { setError((e as { response?: { data?: { error?: string } } })?.response?.data?.error ?? 'Failed to load logs') setLines([]) } finally { setLoading(false) } } const handleSelect = (acc: PickedAccount) => { setSelected(acc) setLines([]) setError('') fetchLogs(acc.username, logType) } const handleTabChange = (type: 'access' | 'error') => { setLogType(type) if (selected) fetchLogs(selected.username, type) } return (
Accounts / Apache Log Viewer

Apache Log Viewer

View Apache access and error logs per hosting account.

{selected && ( )}
{selected && (
/home/{selected.username}/logs/
{(['access', 'error'] as const).map(t => ( ))}
{error && (
{error}
)}
{loading ? (
Loading logs...
) : lines.length === 0 ? (
No log entries found
) : (
                    {lines.join('\n')}
                  
)}
{lines.length > 0 && (
Showing last {lines.length} lines
)}
)}
) }