POWR/components/workout/FavoriteTemplate.tsx

91 lines
2.8 KiB
TypeScript
Raw Permalink Normal View History

2025-02-24 22:27:01 -05:00
// components/workout/FavoriteTemplate.tsx
import React from 'react';
import { View, TouchableOpacity } from 'react-native';
import { Text } from '@/components/ui/text';
import { Card, CardContent } from '@/components/ui/card';
import { Button } from '@/components/ui/button';
import { Star, Clock, Dumbbell } from 'lucide-react-native';
import type { GestureResponderEvent } from 'react-native';
interface FavoriteTemplateProps {
title: string;
exercises: Array<{
title: string;
sets: number;
reps: number;
}>;
duration?: number;
exerciseCount: number;
isFavorited?: boolean;
onPress?: () => void;
onFavoritePress?: () => void;
}
export default function FavoriteTemplate({
title,
exercises,
duration,
exerciseCount,
isFavorited = false,
onPress,
onFavoritePress
}: FavoriteTemplateProps) {
return (
<TouchableOpacity
activeOpacity={0.7}
onPress={onPress}
>
<Card>
<CardContent className="p-4">
<View className="flex-row justify-between items-start">
<View className="flex-1">
<Text className="text-lg font-semibold text-card-foreground mb-1">
{title}
</Text>
<Text className="text-sm text-muted-foreground mb-2">
{exercises.slice(0, 3).map(ex =>
`${ex.title} (${ex.sets}×${ex.reps})`
).join(', ')}
{exercises.length > 3 && '...'}
</Text>
<View className="flex-row items-center gap-4">
<View className="flex-row items-center gap-1">
<Dumbbell size={16} className="text-muted-foreground" />
<Text className="text-sm text-muted-foreground">
{exerciseCount} exercises
</Text>
</View>
{duration && (
<View className="flex-row items-center gap-1">
<Clock size={16} className="text-muted-foreground" />
<Text className="text-sm text-muted-foreground">
{duration} min
</Text>
</View>
)}
</View>
</View>
<Button
variant="ghost"
size="icon"
onPress={(e: GestureResponderEvent) => {
e.stopPropagation();
onFavoritePress?.();
}}
>
<Star
size={20}
className={isFavorited ? "text-primary" : "text-muted-foreground"}
fill={isFavorited ? "currentColor" : "none"}
/>
</Button>
</View>
</CardContent>
</Card>
</TouchableOpacity>
);
}