Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
86 lines
2.3 KiB
TypeScript
86 lines
2.3 KiB
TypeScript
'use client'
|
|
import { Box, Chip, CircularProgress, Tooltip, Typography } from '@mui/material'
|
|
import CloudSyncIcon from '@mui/icons-material/CloudSync'
|
|
import CheckCircleIcon from '@mui/icons-material/CheckCircle'
|
|
import ErrorIcon from '@mui/icons-material/Error'
|
|
import ScheduleIcon from '@mui/icons-material/Schedule'
|
|
|
|
interface SyncStatusIndicatorProps {
|
|
status: 'synced' | 'syncing' | 'pending' | 'error'
|
|
pendingCount?: number
|
|
errorMessage?: string
|
|
}
|
|
|
|
export function SyncStatusIndicator({
|
|
status,
|
|
pendingCount = 0,
|
|
errorMessage
|
|
}: SyncStatusIndicatorProps) {
|
|
if (status === 'synced') {
|
|
return (
|
|
<Tooltip title="All changes synced">
|
|
<Chip
|
|
data-testid="sync-status-synced"
|
|
icon={<CheckCircleIcon sx={{ color: 'success.main' }} />}
|
|
label="Synced"
|
|
variant="outlined"
|
|
color="success"
|
|
size="small"
|
|
sx={{ fontWeight: 500 }}
|
|
/>
|
|
</Tooltip>
|
|
)
|
|
}
|
|
|
|
if (status === 'syncing') {
|
|
return (
|
|
<Tooltip title="Syncing with server">
|
|
<Chip
|
|
data-testid="sync-status-syncing"
|
|
icon={<CircularProgress size={16} />}
|
|
label="Syncing..."
|
|
variant="filled"
|
|
color="primary"
|
|
size="small"
|
|
sx={{ fontWeight: 500 }}
|
|
/>
|
|
</Tooltip>
|
|
)
|
|
}
|
|
|
|
if (status === 'pending') {
|
|
return (
|
|
<Tooltip title={`${pendingCount} highlights waiting to sync`}>
|
|
<Chip
|
|
data-testid="sync-status-pending"
|
|
icon={<ScheduleIcon sx={{ color: 'warning.main' }} />}
|
|
label={`${pendingCount} pending`}
|
|
variant="outlined"
|
|
color="warning"
|
|
size="small"
|
|
sx={{ fontWeight: 500 }}
|
|
/>
|
|
</Tooltip>
|
|
)
|
|
}
|
|
|
|
// error
|
|
return (
|
|
<Tooltip title={errorMessage || 'Sync failed'}>
|
|
<Box data-testid="sync-status-error" sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
|
|
<ErrorIcon sx={{ color: 'error.main', fontSize: 20 }} />
|
|
<Box>
|
|
<Typography variant="caption" color="error" sx={{ fontWeight: 600 }}>
|
|
Sync Error
|
|
</Typography>
|
|
{errorMessage && (
|
|
<Typography variant="caption" color="error" sx={{ display: 'block' }}>
|
|
{errorMessage}
|
|
</Typography>
|
|
)}
|
|
</Box>
|
|
</Box>
|
|
</Tooltip>
|
|
)
|
|
}
|