import { useRouter } from 'expo-router';
import { FlatList, Pressable, StyleSheet, Text, View } from 'react-native';
import { useActivities, type ActivitySummary } from '@/db/queries';
export default function FeedScreen() {
const activities = useActivities();
if (activities.length === 0) {
return (
🚴
No activities yet
Go to Import to add a FIT, GPX, or TCX file.
);
}
return (
Feed
a.id}
renderItem={({ item }) => }
contentContainerStyle={styles.list}
/>
);
}
function ActivityCard({ activity }: { activity: ActivitySummary }) {
const router = useRouter();
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',
});
return (
router.push(`/activity/${activity.id}`)}
>
{sportIcon(activity.sport)}
{date}
{!activity.synced_at && activity.origin === 'local' && (
local
)}
{activity.title}
{km && }
{elev != null && }
);
}
function Stat({ label, value }: { label: string; value: string }) {
return (
{value}
{label}
);
}
function sportIcon(sport: string): string {
const icons: Record = {
cycling: '🚴', running: '🏃', hiking: '🥾', swimming: '🏊', walking: '🚶',
};
return icons[sport] ?? '🏅';
}
const styles = StyleSheet.create({
container: { flex: 1, backgroundColor: '#09090b' },
header: {
color: '#fff', fontSize: 22, fontWeight: '700',
paddingHorizontal: 16, paddingTop: 60, paddingBottom: 12,
},
list: { padding: 16, gap: 12 },
card: {
backgroundColor: '#18181b', borderRadius: 12,
padding: 16, borderWidth: 1, borderColor: '#27272a',
},
cardTop: { flexDirection: 'row', justifyContent: 'space-between', marginBottom: 6 },
sportIcon: { fontSize: 20 },
cardMeta: { flexDirection: 'row', alignItems: 'center', gap: 8 },
cardDate: { color: '#71717a', fontSize: 12 },
unsyncedBadge: {
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 },
empty: {
flex: 1, backgroundColor: '#09090b',
alignItems: 'center', justifyContent: 'center', padding: 32,
},
emptyIcon: { fontSize: 48, marginBottom: 16 },
emptyTitle: { color: '#f4f4f5', fontSize: 18, fontWeight: '600', marginBottom: 8 },
emptyBody: { color: '#71717a', fontSize: 14, textAlign: 'center', lineHeight: 20 },
});