import React from 'react'; import { TouchableOpacity, Text, StyleSheet, ActivityIndicator, type TouchableOpacityProps, type ViewStyle, type TextStyle, } from 'react-native'; import { AppColors, BorderRadius, FontSizes, FontWeights, Spacing } from '@/constants/theme'; interface ButtonProps extends TouchableOpacityProps { title: string; variant?: 'primary' | 'secondary' | 'outline' | 'ghost'; size?: 'sm' | 'md' | 'lg'; loading?: boolean; fullWidth?: boolean; } export function Button({ title, variant = 'primary', size = 'md', loading = false, fullWidth = false, disabled, style, ...props }: ButtonProps) { const isDisabled = disabled || loading; const buttonStyles: ViewStyle[] = [ styles.base, styles[variant], styles[`size_${size}`], fullWidth && styles.fullWidth, isDisabled && styles.disabled, style as ViewStyle, ]; const textStyles: TextStyle[] = [ styles.text, styles[`text_${variant}`], styles[`text_${size}`], isDisabled && styles.textDisabled, ]; return ( {loading ? ( ) : ( {title} )} ); } const styles = StyleSheet.create({ base: { flexDirection: 'row', alignItems: 'center', justifyContent: 'center', borderRadius: BorderRadius.lg, }, primary: { backgroundColor: AppColors.primary, }, secondary: { backgroundColor: AppColors.surface, }, outline: { backgroundColor: 'transparent', borderWidth: 1, borderColor: AppColors.primary, }, ghost: { backgroundColor: 'transparent', }, size_sm: { paddingVertical: Spacing.sm, paddingHorizontal: Spacing.md, minHeight: 36, }, size_md: { paddingVertical: Spacing.sm + 4, paddingHorizontal: Spacing.lg, minHeight: 48, }, size_lg: { paddingVertical: Spacing.md, paddingHorizontal: Spacing.xl, minHeight: 56, }, fullWidth: { width: '100%', }, disabled: { opacity: 0.5, }, text: { fontWeight: FontWeights.semibold, }, text_primary: { color: AppColors.white, }, text_secondary: { color: AppColors.textPrimary, }, text_outline: { color: AppColors.primary, }, text_ghost: { color: AppColors.primary, }, text_sm: { fontSize: FontSizes.sm, }, text_md: { fontSize: FontSizes.base, }, text_lg: { fontSize: FontSizes.lg, }, textDisabled: { opacity: 0.7, }, });