// components/templates/TemplateCard.tsx import React from 'react'; import { View, TouchableOpacity, Platform } from 'react-native'; import { Text } from '@/components/ui/text'; import { Card, CardContent } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Trash2, Star, Play } from 'lucide-react-native'; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from '@/components/ui/alert-dialog'; import { Template, TemplateExerciseDisplay } from '@/types/templates'; import { useIconColor } from '@/lib/theme/iconUtils'; import { FIXED_COLORS } from '@/lib/theme/colors'; interface TemplateCardProps { template: Template; onPress: () => void; onDelete: (id: string) => void; onFavorite: () => void; onStartWorkout: () => void; } export function TemplateCard({ template, onPress, onDelete, onFavorite, onStartWorkout }: TemplateCardProps) { const [showDeleteAlert, setShowDeleteAlert] = React.useState(false); const lastUsed = template.metadata?.lastUsed ? new Date(template.metadata.lastUsed) : undefined; const { getIconProps, getIconColor } = useIconColor(); const { id, title, type, category, exercises, description, tags = [], source, isFavorite } = template; const handleConfirmDelete = () => { onDelete(id); setShowDeleteAlert(false); }; // Prevent event propagation when clicking on action buttons const handleStartWorkout = (e: any) => { if (e && e.stopPropagation) { e.stopPropagation(); } onStartWorkout(); }; const handleFavorite = (e: any) => { if (e && e.stopPropagation) { e.stopPropagation(); } onFavorite(); }; return ( <TouchableOpacity onPress={onPress} activeOpacity={0.7}> <Card className="mx-4"> <CardContent className="p-4"> <View className="flex-row justify-between items-start"> <View className="flex-1"> <View className="flex-row items-center gap-2 mb-1"> <Text className="text-lg font-semibold text-card-foreground"> {title} </Text> <Badge variant={source === 'local' ? 'outline' : 'secondary'} className="text-xs capitalize" > <Text>{source}</Text> </Badge> </View> <View className="flex-row gap-2"> <Badge variant="outline" className="text-xs capitalize"> <Text>{type}</Text> </Badge> <Text className="text-sm text-muted-foreground"> {category} </Text> </View> {exercises.length > 0 && ( <View className="mt-2"> <Text className="text-sm text-muted-foreground mb-1"> Exercises: </Text> <View className="gap-1"> {exercises.slice(0, 3).map((exercise, index) => ( <Text key={index} className="text-sm text-muted-foreground"> • {exercise.title} ({exercise.targetSets}×{exercise.targetReps}) </Text> ))} {exercises.length > 3 && ( <Text className="text-sm text-muted-foreground"> +{exercises.length - 3} more </Text> )} </View> </View> )} {description && ( <Text className="text-sm text-muted-foreground mt-2 native:pr-12"> {description} </Text> )} {tags.length > 0 && ( <View className="flex-row flex-wrap gap-2 mt-2"> {tags.map(tag => ( <Badge key={tag} variant="outline" className="text-xs"> <Text>{tag}</Text> </Badge> ))} </View> )} {lastUsed && ( <Text className="text-xs text-muted-foreground mt-2"> Last used: {lastUsed.toLocaleDateString()} </Text> )} </View> <View className="flex-row gap-1 native:absolute native:right-0 native:top-0 native:p-2"> <Button variant="ghost" size="icon" onPress={handleStartWorkout} className="native:h-10 native:w-10" accessibilityLabel="Start workout" > <Play size={20} {...getIconProps('primary')} /> </Button> <Button variant="ghost" size="icon" onPress={handleFavorite} className="native:h-10 native:w-10" accessibilityLabel={isFavorite ? "Remove from favorites" : "Add to favorites"} > <Star size={20} {...getIconProps(isFavorite ? 'primary' : 'muted')} fill={isFavorite ? getIconColor('primary') : "none"} /> </Button> <AlertDialog open={showDeleteAlert} onOpenChange={setShowDeleteAlert}> <AlertDialogTrigger asChild> <Button variant="ghost" size="icon" className="native:h-10 native:w-10 native:bg-muted/50 items-center justify-center" accessibilityLabel="Delete template" > <Trash2 size={20} {...getIconProps('destructive')} /> </Button> </AlertDialogTrigger> <AlertDialogContent> <AlertDialogHeader> <AlertDialogTitle> <Text className="text-xl font-semibold text-foreground">Delete Template</Text> </AlertDialogTitle> <AlertDialogDescription> <Text className="text-muted-foreground"> Are you sure you want to delete {title}? This action cannot be undone. </Text> </AlertDialogDescription> </AlertDialogHeader> <View className="flex-row justify-end gap-3"> <AlertDialogCancel asChild> <Button variant="outline" className="mr-2"> <Text>Cancel</Text> </Button> </AlertDialogCancel> <AlertDialogAction asChild> <Button variant="destructive" onPress={handleConfirmDelete} style={{ backgroundColor: FIXED_COLORS.destructive }} > <Text style={{ color: '#FFFFFF' }}>Delete</Text> </Button> </AlertDialogAction> </View> </AlertDialogContent> </AlertDialog> </View> </View> </CardContent> </Card> </TouchableOpacity> ); }