import { useEffect, useState } from 'react'; import type { FileEntry, FileReadResponse } from '@hermes-mobile/shared'; import { useCompanion } from '../../api/CompanionContext.js'; function parentPath(path: string): string { if (path === '.') return '.'; const parts = path.split('/').filter(Boolean); parts.pop(); return parts.length ? parts.join('/') : '.'; } export function FilesScreen() { const { client } = useCompanion(); const [path, setPath] = useState('.'); const [entries, setEntries] = useState([]); const [activeFile, setActiveFile] = useState(null); const [draft, setDraft] = useState(''); const [status, setStatus] = useState(''); const [busy, setBusy] = useState(false); async function loadDirectory(nextPath = path): Promise { setBusy(true); setStatus(''); try { const response = await client.listFiles(nextPath); setPath(response.path); setEntries(response.entries); setActiveFile(null); setDraft(''); } catch (caughtError) { setStatus(caughtError instanceof Error ? caughtError.message : 'Unable to list files'); } finally { setBusy(false); } } async function openEntry(entry: FileEntry): Promise { if (entry.type === 'directory') { await loadDirectory(entry.path); return; } setBusy(true); setStatus(''); try { const response = await client.readFile(entry.path); setActiveFile(response); setDraft(response.content); } catch (caughtError) { setStatus(caughtError instanceof Error ? caughtError.message : 'Unable to read file'); } finally { setBusy(false); } } async function saveFile(): Promise { if (!activeFile) return; setBusy(true); try { const response = await client.writeFile(activeFile.path, draft); setStatus(`Saved ${response.bytesWritten} bytes to ${response.path}`); await openEntry({ name: activeFile.path, path: activeFile.path, type: 'file', size: 0, modifiedAt: new Date().toISOString() }); } catch (caughtError) { setStatus(caughtError instanceof Error ? caughtError.message : 'Unable to save file'); } finally { setBusy(false); } } useEffect(() => { void loadDirectory('.'); }, [client]); return (

Workspace

Files

{path}
{entries.map((entry) => ( ))}
{activeFile ? (

Editing

{activeFile.path}