loan order working
This commit is contained in:
155
src/screens/Loan/CreateLoanOrderScreen.js
Normal file
155
src/screens/Loan/CreateLoanOrderScreen.js
Normal file
@@ -0,0 +1,155 @@
|
||||
import React, { useState, useEffect } from 'react';
|
||||
import { Text, StyleSheet, TouchableOpacity, ActivityIndicator, Alert, ScrollView, SafeAreaView } from 'react-native';
|
||||
import { Ionicons } from '@expo/vector-icons';
|
||||
import { useNavigation } from '@react-navigation/native';
|
||||
import { COLORS } from '../../constants/colors';
|
||||
import Input from '../../components/Input';
|
||||
import SelectInput from '../../components/SelectInput';
|
||||
import DateInput from '../../components/DateInput';
|
||||
import { API_CONFIG } from '../../constants/api';
|
||||
import apiService from '../../services/apiService';
|
||||
import { useAuth } from '../../contexts/AuthContext';
|
||||
import { StatusBar } from 'expo-status-bar';
|
||||
|
||||
const CreateLoanOrderScreen = () => {
|
||||
const navigation = useNavigation();
|
||||
const { user } = useAuth();
|
||||
|
||||
const [loanType, setLoanType] = useState('');
|
||||
const [loanAmount, setLoanAmount] = useState('');
|
||||
const [region, setRegion] = useState('');
|
||||
const [branchId, setBranchId] = useState('');
|
||||
const [customerName, setCustomerName] = useState('');
|
||||
const [customerSurname, setCustomerSurname] = useState('');
|
||||
const [customerPatro, setCustomerPatro] = useState('');
|
||||
const [passportSerie, setPassportSerie] = useState('');
|
||||
const [passportId, setPassportId] = useState('');
|
||||
const [bornAt, setBornAt] = useState('');
|
||||
const [phone, setPhone] = useState('');
|
||||
const [loading, setLoading] = useState(false);
|
||||
|
||||
const [loanTypeOptions, setLoanTypeOptions] = useState([]);
|
||||
const [regionOptions, setRegionOptions] = useState([]);
|
||||
const [passportSeriesOptions, setPassportSeriesOptions] = useState([]);
|
||||
const [branchesByRegion, setBranchesByRegion] = useState({});
|
||||
|
||||
useEffect(() => {
|
||||
if (user) {
|
||||
if (user.passport_serie) setPassportSerie(user.passport_serie);
|
||||
if (user.passport_id) setPassportId(String(user.passport_id));
|
||||
if (user.phone) setPhone(String(user.phone).slice(-8));
|
||||
if (user.region) setRegion(user.region);
|
||||
if (user.name) {
|
||||
const parts = user.name.split(' ');
|
||||
setCustomerName(parts[0]);
|
||||
setCustomerSurname(parts[1] || '');
|
||||
}
|
||||
}
|
||||
|
||||
const fetchEnums = async () => {
|
||||
try {
|
||||
const res = await fetch(`${API_CONFIG.BASE_URL}/base-app-enums`);
|
||||
const enums = await res.json();
|
||||
const regions = Object.entries(enums.regions || {}).map(([value, label]) => ({ value, label }));
|
||||
setRegionOptions(regions);
|
||||
const pSeries = Object.keys(enums.passport_series || {}).map((key) => ({ value: key, label: key }));
|
||||
setPassportSeriesOptions(pSeries);
|
||||
} catch {}
|
||||
};
|
||||
|
||||
const fetchLoanTypes = async () => {
|
||||
try {
|
||||
const res = await fetch(`${API_CONFIG.BASE_URL}/loan-types`);
|
||||
const list = await res.json();
|
||||
setLoanTypeOptions(list.map((lt) => ({ value: lt.id, label: lt.name })));
|
||||
} catch {}
|
||||
};
|
||||
|
||||
const fetchBranches = async () => {
|
||||
try {
|
||||
const res = await fetch(`${API_CONFIG.BASE_URL}/branches?groupBy=region`);
|
||||
const json = await res.json();
|
||||
setBranchesByRegion(json);
|
||||
} catch {}
|
||||
};
|
||||
|
||||
fetchEnums();
|
||||
fetchLoanTypes();
|
||||
fetchBranches();
|
||||
}, []);
|
||||
|
||||
const branchOptions = region && branchesByRegion[region] ? branchesByRegion[region].map((b) => ({ label: b.name, value: b.id })) : [];
|
||||
|
||||
const handleSubmit = async () => {
|
||||
if (!loanType || !loanAmount || !region || !branchId || !customerName || !customerSurname || !passportSerie || !passportId || !bornAt || !phone) {
|
||||
Alert.alert('Error', 'Fill all required fields');
|
||||
return;
|
||||
}
|
||||
|
||||
const payload = {
|
||||
loan_type: parseInt(loanType),
|
||||
loan_amount: parseInt(loanAmount),
|
||||
region,
|
||||
branch_id: parseInt(branchId),
|
||||
customer_name: customerName,
|
||||
customer_surname: customerSurname,
|
||||
customer_patronic_name: customerPatro || null,
|
||||
passport_serie: passportSerie,
|
||||
passport_id: passportId.trim(),
|
||||
born_at: bornAt,
|
||||
phone: parseInt(phone),
|
||||
};
|
||||
|
||||
setLoading(true);
|
||||
const res = await apiService.createLoanOrder(payload);
|
||||
setLoading(false);
|
||||
if (res.success) {
|
||||
Alert.alert('Success', res.message || 'Order created', [{ text: 'OK', onPress: () => navigation.goBack() }]);
|
||||
} else {
|
||||
Alert.alert('Error', res.error || 'Could not create');
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<SafeAreaView style={styles.container}>
|
||||
<StatusBar style="dark" />
|
||||
<TouchableOpacity style={styles.backBtn} onPress={() => navigation.goBack()}>
|
||||
<Ionicons name="arrow-back" size={24} color={COLORS.textPrimary} />
|
||||
</TouchableOpacity>
|
||||
|
||||
<ScrollView contentContainerStyle={{ paddingBottom: 40, paddingHorizontal: 24 }} showsVerticalScrollIndicator={false}>
|
||||
<Text style={styles.title}>Täze karz sargyt</Text>
|
||||
|
||||
<SelectInput label="Karzyň görnüşi" value={loanType} options={loanTypeOptions} onValueChange={setLoanType} placeholder="Saýla" />
|
||||
<Input label="Karz mukdary" placeholder="20000" value={loanAmount} onChangeText={setLoanAmount} keyboardType="numeric" />
|
||||
|
||||
<SelectInput label="Welaýat" value={region} options={regionOptions} onValueChange={(val) => { setRegion(val); setBranchId(''); }} placeholder="Saýla" />
|
||||
<SelectInput label="Şahamça" value={branchId} options={branchOptions} onValueChange={setBranchId} placeholder="Saýla" disabled={branchOptions.length === 0} />
|
||||
|
||||
<Input label="Ady" placeholder="Mahmyt" value={customerName} onChangeText={setCustomerName} />
|
||||
<Input label="Familiýasy" placeholder="Allaberdiyev" value={customerSurname} onChangeText={setCustomerSurname} />
|
||||
<Input label="Atasynyň ady" placeholder="" value={customerPatro} onChangeText={setCustomerPatro} />
|
||||
|
||||
<SelectInput label="Passport seriýasy" value={passportSerie} options={passportSeriesOptions} onValueChange={setPassportSerie} placeholder="Saýla" />
|
||||
<Input label="Passport nomeri" placeholder="100999" value={passportId} onChangeText={setPassportId} keyboardType="numeric" />
|
||||
|
||||
<DateInput label="Doglan senesi" value={bornAt} onChange={setBornAt} />
|
||||
<Input label="Telefon (+9936...)" value={phone} onChangeText={setPhone} keyboardType="numeric" />
|
||||
|
||||
<TouchableOpacity style={styles.submitBtn} onPress={handleSubmit} disabled={loading}>
|
||||
{loading ? <ActivityIndicator color={COLORS.white} /> : <Text style={styles.submitText}>Ýatda sakla</Text>}
|
||||
</TouchableOpacity>
|
||||
</ScrollView>
|
||||
</SafeAreaView>
|
||||
);
|
||||
};
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
container: { flex: 1, backgroundColor: COLORS.backgroundSecondary, paddingTop: 40 },
|
||||
backBtn: { marginBottom: 24, marginLeft: 24 },
|
||||
title: { fontSize: 24, fontWeight: 'bold', color: COLORS.textPrimary, marginBottom: 24 },
|
||||
submitBtn: { marginTop: 32, backgroundColor: COLORS.primary, paddingVertical: 16, borderRadius: 8, alignItems: 'center' },
|
||||
submitText: { color: COLORS.white, fontSize: 16, fontWeight: '600' },
|
||||
});
|
||||
|
||||
export default CreateLoanOrderScreen;
|
||||
Reference in New Issue
Block a user