import { useRouter } from 'expo-router'; import { Pressable, StyleSheet, Text, View } from 'react-native'; import type { ActivitySummary } from '@/db/queries'; import { useTheme } from '@/ThemeContext'; export function ActivityCard({ activity, selecting, checked, onToggleSelect, onLongPress, }: { activity: ActivitySummary; selecting: boolean; checked: boolean; onToggleSelect: () => void; onLongPress: () => void; }) { const router = useRouter(); const theme = useTheme(); const km = activity.distance_m != null ? (activity.distance_m / 1000).toFixed(1) : null; const elev = activity.elevation_gain_m != null ? Math.round(activity.elevation_gain_m) : null; const date = new Date(activity.started_at).toLocaleDateString(undefined, { day: 'numeric', month: 'short', year: 'numeric', }); function handlePress() { if (selecting) onToggleSelect(); else router.push(`/activity/${activity.id}`); } return ( {selecting && ( {checked && } )} {sportIcon(activity.sport)} {date} {activity.origin === 'remote' ? cloud : !activity.synced_at && local } {activity.user_title ?? activity.title} {km && } {elev != null && } ); } export function Stat({ label, value }: { label: string; value: string }) { return ( {value} {label} ); } export function sportIcon(sport: string): string { const icons: Record = { cycling: '🚴', running: '🏃', hiking: '🥾', swimming: '🏊', walking: '🚶', }; return icons[sport] ?? '🏅'; } const styles = StyleSheet.create({ card: { backgroundColor: '#18181b', borderRadius: 12, padding: 16, borderWidth: 1, borderColor: '#27272a', }, cardTop: { flexDirection: 'row', justifyContent: 'space-between', marginBottom: 6 }, cardLeft: { flexDirection: 'row', alignItems: 'center', gap: 10 }, sportIcon: { fontSize: 20 }, cardMeta: { flexDirection: 'row', alignItems: 'center', gap: 8 }, cardDate: { color: '#71717a', fontSize: 12 }, remoteBadge: { fontSize: 10, borderWidth: 1, borderRadius: 4, paddingHorizontal: 4, }, localBadge: { color: '#a1a1aa', fontSize: 10, borderWidth: 1, borderColor: '#3f3f46', borderRadius: 4, paddingHorizontal: 4, }, cardTitle: { color: '#f4f4f5', fontSize: 15, fontWeight: '600', marginBottom: 10 }, cardStats: { flexDirection: 'row', gap: 16 }, stat: { flexDirection: 'row', alignItems: 'baseline', gap: 3 }, statValue: { color: '#f4f4f5', fontSize: 16, fontWeight: '600' }, statLabel: { color: '#71717a', fontSize: 12 }, checkbox: { width: 20, height: 20, borderRadius: 4, borderWidth: 1.5, borderColor: '#52525b', alignItems: 'center', justifyContent: 'center', }, checkmark: { color: '#fff', fontSize: 12, fontWeight: '700' }, });