import { Text } from '@/components/ui/text';
import { useColor } from '@/hooks/useColor';
import { BORDER_RADIUS, CORNERS, FONT_SIZE } from '@/theme/globals';
import React from 'react';
import { TextStyle, TouchableOpacity, View, ViewStyle } from 'react-native';
export interface RadioOption {
label: string;
value: string;
disabled?: boolean;
}
interface RadioGroupProps {
options: RadioOption[];
value?: string;
onValueChange?: (value: string) => void;
disabled?: boolean;
orientation?: 'vertical' | 'horizontal';
style?: ViewStyle;
optionStyle?: ViewStyle;
labelStyle?: TextStyle;
}
interface RadioButtonProps {
option: RadioOption;
selected: boolean;
onPress: () => void;
disabled?: boolean;
style?: ViewStyle;
labelStyle?: TextStyle;
}
export function RadioButton({
option,
selected,
onPress,
disabled = false,
style,
labelStyle,
}: RadioButtonProps) {
const primaryColor = useColor('primary');
const borderColor = useColor('border');
const textColor = useColor('text');
const mutedColor = useColor('textMuted');
const isDisabled = disabled || option.disabled;
const radioButtonStyle: ViewStyle = {
width: BORDER_RADIUS,
height: BORDER_RADIUS,
borderRadius: CORNERS,
borderWidth: 1.5,
borderColor: selected ? primaryColor : borderColor,
backgroundColor: 'transparent',
alignItems: 'center',
justifyContent: 'center',
marginRight: 12,
};
const innerCircleStyle: ViewStyle = {
width: 16,
height: 16,
borderRadius: CORNERS,
backgroundColor: selected ? primaryColor : 'transparent',
};
const containerStyle: ViewStyle = {
flexDirection: 'row',
alignItems: 'center',
paddingVertical: 4,
paddingHorizontal: 4,
opacity: isDisabled ? 0.5 : 1,
};
const textStyle: TextStyle = {
color: isDisabled ? mutedColor : textColor,
fontSize: FONT_SIZE,
fontWeight: '400',
lineHeight: 24,
};
return (
{option.label}
);
}
export function RadioGroup({
options,
value,
onValueChange,
disabled = false,
orientation = 'vertical',
style,
optionStyle,
labelStyle,
}: RadioGroupProps) {
const containerStyle: ViewStyle = {
flexDirection: orientation === 'horizontal' ? 'row' : 'column',
gap: orientation === 'horizontal' ? 16 : 4,
};
const handlePress = (optionValue: string) => {
if (onValueChange && !disabled) {
onValueChange(optionValue);
}
};
return (
{options.map((option) => (
handlePress(option.value)}
disabled={disabled}
style={optionStyle}
labelStyle={labelStyle}
/>
))}
);
}