Sergei 8bc9649146 WellNuo Lite v1.0.0 - simplified version for App Store review
- Removed voice input features
- Simplified profile page (only legal links and logout)
- Chat with AI context working
- Auto-select first beneficiary
- Dashboard WebView intact

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-24 17:13:13 -08:00

138 lines
2.7 KiB
TypeScript

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 (
<TouchableOpacity
style={buttonStyles}
disabled={isDisabled}
activeOpacity={0.7}
{...props}
>
{loading ? (
<ActivityIndicator
color={variant === 'primary' ? AppColors.white : AppColors.primary}
size="small"
/>
) : (
<Text style={textStyles}>{title}</Text>
)}
</TouchableOpacity>
);
}
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,
},
});