import React from 'react'; import type { AppGroup, RecordingStatus } from '../types'; import { formatDuration } from '../utils'; interface AppItemProps { app: AppGroup; recordings?: RecordingStatus[]; } export function AppItem({ app, recordings }: AppItemProps) { const [imgError, setImgError] = React.useState(false); const [isRecording, setIsRecording] = React.useState(false); const appName = app.rootApp.name || ''; const bundleId = app.rootApp.bundleIdentifier || ''; const firstLetter = appName.charAt(0).toUpperCase(); const isRunning = app.apps.some(a => a.isRunning); const recording = recordings?.find((r: RecordingStatus) => app.apps.some(a => a.processId === r.processId) ); const handleRecordClick = React.useCallback(() => { const recordingApp = app.apps.find(a => a.isRunning); if (!recordingApp) { return; } if (isRecording) { void fetch(`/api/apps/${recordingApp.processId}/stop`, { method: 'POST', }) .then(() => setIsRecording(false)) .catch(error => console.error('Failed to stop recording:', error)); } else { void fetch(`/api/apps/${recordingApp.processId}/record`, { method: 'POST', }) .then(() => setIsRecording(true)) .catch(error => console.error('Failed to start recording:', error)); } }, [app.apps, isRecording]); React.useEffect(() => { setIsRecording(!!recording); }, [recording]); const [duration, setDuration] = React.useState(0); React.useEffect(() => { if (recording) { const interval = setInterval(() => { setDuration(Date.now() - recording.startTime); }, 1000); return () => clearInterval(interval); } else { setDuration(0); } return () => {}; }, [recording]); return (
{imgError ? (
{firstLetter}
) : ( {appName} setImgError(true)} /> )}
{appName ? ( {appName} ) : ( Unnamed Application )} PID: {app.rootApp.processId} {recording ? formatDuration(duration) : '00:00:00'}
{bundleId}
{(isRunning || isRecording) && ( )}
); }