212 lines
5.8 KiB
TypeScript
212 lines
5.8 KiB
TypeScript
import React, { useState } from 'react';
|
|
import {
|
|
View,
|
|
Text,
|
|
KeyboardAvoidingView,
|
|
Platform,
|
|
ScrollView,
|
|
TouchableOpacity,
|
|
} from 'react-native';
|
|
import { useNavigation } from '@react-navigation/native';
|
|
import { StackNavigationProp } from '@react-navigation/stack';
|
|
import { getStyles } from './completeProfileScreen.styles';
|
|
import { CustomInput, PrimaryButton } from '@components';
|
|
import { useAppTheme } from '@theme';
|
|
import { AuthStackParamList } from '../../../navigation/authStack';
|
|
import { useAppDispatch } from '@store';
|
|
import { saveProfileData } from './reducer';
|
|
import { OnboardingStackParamList } from '@navigation/onboardingStack';
|
|
|
|
type NavProp = StackNavigationProp<
|
|
OnboardingStackParamList,
|
|
'CompleteProfileScreen'
|
|
>;
|
|
|
|
const LOCATION_LABELS = ['Home', 'Work', 'Other'];
|
|
|
|
export const CompleteProfileScreen: React.FC = () => {
|
|
const { colors } = useAppTheme();
|
|
const styles = getStyles(colors);
|
|
const navigation = useNavigation<NavProp>();
|
|
const dispatch = useAppDispatch();
|
|
|
|
const [name, setName] = useState('');
|
|
const [email, setEmail] = useState('');
|
|
const [gender, setGender] = useState<'MALE' | 'FEMALE' | 'OTHER'>('MALE');
|
|
|
|
const [addressLine1, setAddressLine1] = useState('');
|
|
const [houseNumber, setHouseNumber] = useState('');
|
|
const [landmark, setLandmark] = useState('');
|
|
const [city, setCity] = useState('');
|
|
const [state, setState] = useState('');
|
|
const [postalCode, setPostalCode] = useState('');
|
|
const [addressPhone, setAddressPhone] = useState('');
|
|
|
|
const [selectedLabel, setSelectedLabel] = useState('Home');
|
|
|
|
const handleSave = () => {
|
|
dispatch(
|
|
saveProfileData({
|
|
name,
|
|
email,
|
|
gender,
|
|
addressLine1,
|
|
houseNumber,
|
|
landmark,
|
|
city,
|
|
state,
|
|
postalCode,
|
|
addressPhone,
|
|
addressLabel: selectedLabel,
|
|
}),
|
|
);
|
|
navigation.navigate('PreferencesScreen');
|
|
};
|
|
|
|
return (
|
|
<KeyboardAvoidingView
|
|
style={styles.container}
|
|
behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
|
|
>
|
|
<ScrollView
|
|
contentContainerStyle={styles.scrollContainer}
|
|
showsVerticalScrollIndicator={false}
|
|
>
|
|
<Text style={styles.title}>Complete Profile</Text>
|
|
<Text style={styles.subtitle}>Tell us about yourself</Text>
|
|
|
|
<View style={styles.form}>
|
|
{/* Personal Information */}
|
|
|
|
<CustomInput
|
|
label="Full Name"
|
|
placeholder="John Doe"
|
|
value={name}
|
|
onChangeText={setName}
|
|
/>
|
|
|
|
<CustomInput
|
|
label="Email"
|
|
placeholder="john@example.com"
|
|
keyboardType="email-address"
|
|
autoCapitalize="none"
|
|
value={email}
|
|
onChangeText={setEmail}
|
|
/>
|
|
|
|
{/* Gender */}
|
|
|
|
<Text style={styles.labelText}>Gender</Text>
|
|
|
|
<View style={styles.labelRow}>
|
|
{['MALE', 'FEMALE', 'OTHER'].map(item => (
|
|
<TouchableOpacity
|
|
key={item}
|
|
style={[
|
|
styles.labelChip,
|
|
gender === item && styles.labelChipSelected,
|
|
]}
|
|
onPress={() => setGender(item as 'MALE' | 'FEMALE' | 'OTHER')}
|
|
>
|
|
<Text
|
|
style={[
|
|
styles.labelChipText,
|
|
gender === item && styles.labelChipTextSelected,
|
|
]}
|
|
>
|
|
{item.charAt(0) + item.slice(1).toLowerCase()}
|
|
</Text>
|
|
</TouchableOpacity>
|
|
))}
|
|
</View>
|
|
|
|
{/* Address */}
|
|
|
|
<CustomInput
|
|
label="Address Line 1"
|
|
placeholder="123 Main Street"
|
|
value={addressLine1}
|
|
onChangeText={setAddressLine1}
|
|
/>
|
|
|
|
<CustomInput
|
|
label="House / Flat Number"
|
|
placeholder="Apt 4B"
|
|
value={houseNumber}
|
|
onChangeText={setHouseNumber}
|
|
/>
|
|
|
|
<CustomInput
|
|
label="Landmark"
|
|
placeholder="Near Central Park"
|
|
value={landmark}
|
|
onChangeText={setLandmark}
|
|
/>
|
|
|
|
<CustomInput
|
|
label="City"
|
|
placeholder="New York"
|
|
value={city}
|
|
onChangeText={setCity}
|
|
/>
|
|
|
|
<CustomInput
|
|
label="State"
|
|
placeholder="NY"
|
|
value={state}
|
|
onChangeText={setState}
|
|
/>
|
|
|
|
<CustomInput
|
|
label="Postal Code"
|
|
placeholder="10001"
|
|
keyboardType="number-pad"
|
|
value={postalCode}
|
|
onChangeText={setPostalCode}
|
|
/>
|
|
|
|
<CustomInput
|
|
label="Phone Number"
|
|
placeholder="+1 9999999999"
|
|
keyboardType="phone-pad"
|
|
value={addressPhone}
|
|
onChangeText={setAddressPhone}
|
|
/>
|
|
|
|
{/* Location Label */}
|
|
|
|
<Text style={styles.labelText}>Location Label</Text>
|
|
|
|
<View style={styles.labelRow}>
|
|
{LOCATION_LABELS.map(label => (
|
|
<TouchableOpacity
|
|
key={label}
|
|
style={[
|
|
styles.labelChip,
|
|
selectedLabel === label && styles.labelChipSelected,
|
|
]}
|
|
onPress={() => setSelectedLabel(label)}
|
|
>
|
|
<Text
|
|
style={[
|
|
styles.labelChipText,
|
|
selectedLabel === label && styles.labelChipTextSelected,
|
|
]}
|
|
>
|
|
{label}
|
|
</Text>
|
|
</TouchableOpacity>
|
|
))}
|
|
</View>
|
|
</View>
|
|
|
|
<PrimaryButton
|
|
title="Save & Continue"
|
|
onPress={handleSave}
|
|
disabled={!name || !email}
|
|
/>
|
|
</ScrollView>
|
|
</KeyboardAvoidingView>
|
|
);
|
|
};
|