import { View, StyleSheet, Pressable, Text, ActivityIndicator } from 'react-native'; import Animated, { FadeIn, useAnimatedStyle, withSpring } from 'react-native-reanimated'; import { useMemo } from 'react'; import Svg, { Path } from 'react-native-svg'; import * as Haptics from 'expo-haptics'; import { Colors, Font } from '../constants/theme'; export interface DownloadButtonProps { trackId: number; isDownloaded?: boolean; downloadProgress?: number; // 0-1 onDownload?: () => void; onDelete?: () => void; size?: 'sm' | 'md' | 'lg'; } export default function DownloadButton({ trackId, isDownloaded = false, downloadProgress = 0, onDownload, onDelete, size = 'md', }: DownloadButtonProps) { const sizing = useMemo(() => { const map = { sm: 20, md: 24, lg: 32 }; return map[size]; }, [size]); const handlePress = async () => { Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); if (isDownloaded) { onDelete?.(); } else { onDownload?.(); } }; const isLoading = downloadProgress > 0 && downloadProgress < 1; if (isLoading) { return ( {downloadProgress > 0.2 && ( {Math.round(downloadProgress * 100)}% )} ); } return ( [ styles.button, { width: sizing, height: sizing, opacity: pressed ? 0.6 : 1, }, ]} > {isDownloaded ? ( ) : ( )} ); } const styles = StyleSheet.create({ button: { justifyContent: 'center', alignItems: 'center', }, container: { justifyContent: 'center', alignItems: 'center', }, progress: { color: Colors.accent, fontFamily: Font.family.medium, marginTop: 2, }, });