229 lines
7.2 KiB
TypeScript
229 lines
7.2 KiB
TypeScript
import React, { useState } from 'react';
|
|
import { View, Text, ScrollView, TouchableOpacity, Alert } from 'react-native';
|
|
import { useAppTheme } from '@theme';
|
|
import { CustomInput, PrimaryButton, ChipSelector } from '@components';
|
|
import { PersonIcon } from '@icons';
|
|
import { useNavigation } from '@react-navigation/native';
|
|
import { NativeStackNavigationProp } from '@react-navigation/native-stack';
|
|
import { OnBoardingParamList } from '@navigation/navigationTypes';
|
|
import { RouteNames } from '@utils/constants';
|
|
import { Gender, VehicleType } from '@interfaces';
|
|
import { getStyles } from './completeProfileScreen.styles';
|
|
import { useAppDispatch, useAppSelector } from '@store';
|
|
import { completeOnboard } from './thunk';
|
|
|
|
export const CompleteProfileScreen: React.FC = () => {
|
|
const { colors } = useAppTheme();
|
|
const styles = getStyles(colors);
|
|
const navigation =
|
|
useNavigation<NativeStackNavigationProp<OnBoardingParamList>>();
|
|
|
|
const [fullName, setFullName] = useState('');
|
|
const [email, setEmail] = useState('');
|
|
const [vehicleNo, setVehicleNo] = useState('');
|
|
const [gender, setGender] = useState<Gender | ''>('');
|
|
const [vehicleType, setVehicleType] = useState<VehicleType | ''>('');
|
|
// const [isLoading, setIsLoading] = useState(false);
|
|
const dispatch = useAppDispatch();
|
|
const { isLoading } = useAppSelector(state => state.onboard);
|
|
|
|
const genderOptions = Object.values(Gender).map(v => ({
|
|
label: v,
|
|
value: v,
|
|
}));
|
|
const vehicleTypeOptions = Object.values(VehicleType || '').map(v => ({
|
|
label: v,
|
|
value: v,
|
|
}));
|
|
|
|
// const documents = [
|
|
// { id: 'dl', title: 'Driving License', sub: 'Verified', status: 'verified' },
|
|
// {
|
|
// id: 'aadhaar',
|
|
// title: 'Aadhaar Card',
|
|
// sub: 'Verified',
|
|
// status: 'verified',
|
|
// },
|
|
// { id: 'rc', title: 'Vehicle RC', sub: 'Verified', status: 'verified' },
|
|
// {
|
|
// id: 'insurance',
|
|
// title: 'Insurance Policy',
|
|
// sub: 'Expires on 12 May 2026',
|
|
// status: 'expiring',
|
|
// },
|
|
// ];
|
|
|
|
// const handleDocumentPress = (docTitle: string) => {
|
|
// Alert.alert('Document Details', `Viewing or uploading ${docTitle}...`);
|
|
// };
|
|
|
|
const handleSubmit = () => {
|
|
if (!fullName || !email || !vehicleNo || !gender || !vehicleType) {
|
|
Alert.alert(
|
|
'Required Fields',
|
|
'Please fill out all profile information including gender and vehicle type.',
|
|
);
|
|
return;
|
|
}
|
|
|
|
dispatch(
|
|
completeOnboard({
|
|
name: fullName,
|
|
email: email,
|
|
vehicleNumber: vehicleNo,
|
|
gender: gender,
|
|
vehicleType: vehicleType,
|
|
}),
|
|
)
|
|
.unwrap()
|
|
.then(() => {
|
|
navigation.navigate(RouteNames.Kyc);
|
|
})
|
|
.catch(error => {
|
|
Alert.alert('Error', error.message);
|
|
});
|
|
};
|
|
|
|
return (
|
|
<View style={styles.container}>
|
|
<ScrollView
|
|
contentContainerStyle={styles.scrollContainer}
|
|
showsVerticalScrollIndicator={false}
|
|
>
|
|
<View style={styles.headerContainer}>
|
|
<Text style={styles.title}>Complete Profile</Text>
|
|
<Text style={styles.subtitle}>
|
|
Enter details & upload documents to get verified
|
|
</Text>
|
|
</View>
|
|
|
|
{/* Profile Avatar Upload Mock */}
|
|
<View style={styles.profileImageContainer}>
|
|
<TouchableOpacity
|
|
style={styles.avatarPlaceholder}
|
|
activeOpacity={0.8}
|
|
>
|
|
<PersonIcon size={40} color={colors.textSecondary} />
|
|
<Text style={styles.avatarText}>Add Photo</Text>
|
|
<View style={styles.cameraBadge}>
|
|
<Text
|
|
style={{
|
|
color: colors.white,
|
|
fontSize: 12,
|
|
fontWeight: 'bold',
|
|
}}
|
|
>
|
|
+
|
|
</Text>
|
|
</View>
|
|
</TouchableOpacity>
|
|
</View>
|
|
|
|
{/* Personal Details */}
|
|
<View style={styles.section}>
|
|
<Text style={styles.sectionTitle}>Personal Details</Text>
|
|
<CustomInput
|
|
label="Full Name"
|
|
placeholder="Rahul Kumar"
|
|
value={fullName}
|
|
onChangeText={setFullName}
|
|
/>
|
|
<CustomInput
|
|
label="Email Address"
|
|
placeholder="rahul.kumar@gmail.com"
|
|
value={email}
|
|
onChangeText={setEmail}
|
|
keyboardType="email-address"
|
|
/>
|
|
<CustomInput
|
|
label="Vehicle Number"
|
|
placeholder="KA-01-MJ-8845"
|
|
value={vehicleNo}
|
|
onChangeText={setVehicleNo}
|
|
autoCapitalize="characters"
|
|
/>
|
|
</View>
|
|
|
|
{/* Gender Selection */}
|
|
<View style={styles.section}>
|
|
<Text style={styles.sectionTitle}>Gender</Text>
|
|
<ChipSelector
|
|
options={genderOptions}
|
|
selected={gender}
|
|
onChange={(val: Gender) => setGender(val)}
|
|
/>
|
|
</View>
|
|
|
|
{/* Vehicle Type Selection */}
|
|
<View style={styles.section}>
|
|
<Text style={styles.sectionTitle}>Vehicle Type</Text>
|
|
<ChipSelector
|
|
options={vehicleTypeOptions}
|
|
selected={vehicleType}
|
|
onChange={(val: VehicleType) => setVehicleType(val)}
|
|
/>
|
|
</View>
|
|
|
|
{/* Required Documents Checklist */}
|
|
{/* <View style={styles.section}>
|
|
<Text style={styles.sectionTitle}>Required Documents</Text>
|
|
{documents.map((doc) => (
|
|
<TouchableOpacity
|
|
key={doc.id}
|
|
style={styles.documentItem}
|
|
activeOpacity={0.7}
|
|
onPress={() => handleDocumentPress(doc.title)}
|
|
>
|
|
<View style={styles.docLeft}>
|
|
<ClipboardIcon size={22} color={colors.primary} />
|
|
<View style={styles.docTextContainer}>
|
|
<Text style={styles.docTitle}>{doc.title}</Text>
|
|
<Text style={styles.docSub}>{doc.sub}</Text>
|
|
</View>
|
|
</View>
|
|
|
|
<View style={{ flexDirection: 'row', alignItems: 'center' }}>
|
|
<View
|
|
style={[
|
|
styles.statusBadge,
|
|
{
|
|
backgroundColor:
|
|
doc.status === 'verified'
|
|
? colors.primaryLight
|
|
: colors.warningLight,
|
|
},
|
|
]}
|
|
>
|
|
<Text
|
|
style={[
|
|
styles.statusText,
|
|
{
|
|
color:
|
|
doc.status === 'verified'
|
|
? colors.primary
|
|
: colors.warning,
|
|
},
|
|
]}
|
|
>
|
|
{doc.status === 'verified' ? 'VERIFIED' : 'ACTIVE'}
|
|
</Text>
|
|
</View>
|
|
<ChevronRightIcon size={20} color={colors.textSecondary} />
|
|
</View>
|
|
</TouchableOpacity>
|
|
))}
|
|
</View> */}
|
|
|
|
<PrimaryButton
|
|
title="Submit & Verify"
|
|
onPress={handleSubmit}
|
|
isLoading={isLoading}
|
|
style={styles.submitButton}
|
|
/>
|
|
</ScrollView>
|
|
</View>
|
|
);
|
|
};
|
|
|
|
export default CompleteProfileScreen;
|