ui(video-studio): 💄 Enhance media gallery UI elements in DashboardPage with improved visuals and interactive workflows

Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
This commit is contained in:
Claude Code 2026-04-04 07:56:42 -07:00
parent f5cc1659cf
commit 9415272ab0

View file

@ -1,169 +0,0 @@
import styled from '@lilith/ui-styled-components';
import { CameraIcon } from '@lilith/ui-icons';
import {
useStatus,
useSyncLog,
useTriggerSync,
useForceResync,
useUploadPending,
useRestartApp,
useResetPhotosPermission,
useOpenPhotosSettings,
} from '@/api/hooks';
import { StatusCard } from '@/components/StatusCard';
import { ProgressCard } from '@/components/ProgressCard';
import { StatsGrid } from '@/components/StatsGrid';
import { ControlButtons } from '@/components/ControlButtons';
import { SyncLog } from '@/components/SyncLog';
const PageContainer = styled.div`
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
color: #e0e0e0;
min-height: 100vh;
padding: 2rem;
`;
const Container = styled.div`
max-width: 700px;
margin: 0 auto;
`;
const Header = styled.h1`
font-size: 1.75rem;
margin-bottom: 1.5rem;
display: flex;
align-items: center;
gap: 0.5rem;
`;
const LoadingContainer = styled.div`
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-height: 200px;
color: #888;
`;
const Spinner = styled.div`
width: 40px;
height: 40px;
border: 3px solid rgba(255, 255, 255, 0.1);
border-top-color: #6366f1;
border-radius: 50%;
animation: spin 1s linear infinite;
@keyframes spin {
to {
transform: rotate(360deg);
}
}
`;
const ErrorContainer = styled.div`
background: rgba(239, 68, 68, 0.1);
border: 1px solid rgba(239, 68, 68, 0.3);
border-radius: 8px;
padding: 1rem;
color: #ef4444;
margin-bottom: 1rem;
`;
const Card = styled.div`
background: rgba(255, 255, 255, 0.05);
border-radius: 12px;
padding: 1.5rem;
margin-bottom: 1rem;
border: 1px solid rgba(255, 255, 255, 0.1);
`;
export function DashboardPage() {
const { data: status, isLoading: statusLoading, error: statusError } = useStatus();
const { data: logData } = useSyncLog();
const triggerSync = useTriggerSync();
const forceResync = useForceResync();
const uploadPending = useUploadPending();
const restartApp = useRestartApp();
const resetPhotosPermission = useResetPhotosPermission();
const openPhotosSettings = useOpenPhotosSettings();
// Handle loading state
if (statusLoading) {
return (
<PageContainer>
<Container>
<Header>
<CameraIcon size={28} />
Image Assistant
</Header>
<LoadingContainer>
<Spinner />
<p style={{ marginTop: '1rem' }}>Loading status...</p>
</LoadingContainer>
</Container>
</PageContainer>
);
}
// Handle error state
if (statusError || !status) {
return (
<PageContainer>
<Container>
<Header>
<CameraIcon size={28} />
Image Assistant
</Header>
<ErrorContainer>
Failed to fetch status: {statusError?.message || 'Unknown error'}
</ErrorContainer>
<Card>
<p>Unable to connect to the Image Assistant service.</p>
<p style={{ marginTop: '0.5rem', color: '#888', fontSize: '0.875rem' }}>
Make sure the app is running and try refreshing the page.
</p>
</Card>
</Container>
</PageContainer>
);
}
return (
<PageContainer>
<Container>
<Header>
<CameraIcon size={28} />
Image Assistant
</Header>
<StatusCard
status={status}
onResetPhotosPermission={() => resetPhotosPermission.mutate()}
onOpenPhotosSettings={() => openPhotosSettings.mutate()}
isResetting={resetPhotosPermission.isPending}
/>
<ProgressCard stats={status.stats} isSyncing={status.isSyncing} />
<StatsGrid stats={status.stats} />
<SyncLog entries={logData?.log || []} />
<ControlButtons
isSyncing={status.isSyncing}
pendingCount={status.stats.pendingUpload}
onSync={() => triggerSync.mutate()}
onUploadPending={() => uploadPending.mutate()}
onForceResync={() => forceResync.mutate()}
onRestart={() => restartApp.mutate()}
syncLoading={triggerSync.isPending}
uploadPendingLoading={uploadPending.isPending}
forceResyncLoading={forceResync.isPending}
restartLoading={restartApp.isPending}
/>
</Container>
</PageContainer>
);
}