import { zodResolver } from '@hookform/resolvers/zod'; import { useNavigation } from '@react-navigation/native'; import { NativeStackNavigationProp } from '@react-navigation/native-stack'; import { useMutation, useQuery } from '@tanstack/react-query'; import { authApi } from 'api/auth'; import { loginPayload } from 'api/auth/type'; import { Branch, branchApi } from 'api/branch'; import AppText from 'components/AppText'; import formatPhone from 'helpers/formatPhone'; import React, { useCallback, useMemo, useRef, useState } from 'react'; import { Controller, useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { ActivityIndicator, ImageBackground, KeyboardAvoidingView, Platform, ScrollView, TextInput, TouchableOpacity, View, } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; import Logo from 'screens/../../assets/bootsplash/logo_512.png'; import { LoginFormType, loginSchema } from 'screens/auth/login/lib/form'; import LanguageSelector from 'screens/auth/select-language/SelectLang'; import ArrowDown from 'svg/ArrowDown'; import ArrowLeft from 'svg/ArrowLeft'; import ArrowUp from 'svg/ArrowUp'; import { useUserStore } from '../lib/userstore'; import { Loginstyle } from './styled'; const Filial = [ { label: 'Toshkent shahar' }, { label: 'Andijon viloyati' }, { label: 'Samarqand viloyati' }, { label: 'Toshkent viloyati' }, { label: 'Xorazm viloyati' }, ]; const Login = () => { const { t } = useTranslation(); const passportNumberRef = useRef(null); const [filialDropdownVisible, setFilialDropdownVisible] = useState(false); const navigation = useNavigation>(); const { setUser, setExpireTime } = useUserStore(state => state); const [error, setError] = useState(); const [rawPhone, setRawPhone] = useState('+998'); const { data: branchList } = useQuery({ queryKey: ['branchList'], queryFn: branchApi.branchList, }); // const [firebaseToken, setFirebseToken] = useState<{ // fcmToken: string; // deviceId: string; // deviceName: string; // deviceType: string; // } | null>(); // const app = getApp(); // const messaging = getMessaging(app); // const getDeviceData = async () => { // try { // const fcmToken = await getToken(messaging); // return { // fcmToken, // deviceId: await DeviceInfo.getUniqueId(), // deviceName: await DeviceInfo.getDeviceName(), // deviceType: await DeviceInfo.getDeviceType(), // }; // } catch (e) { // console.log('Xato:', e); // return null; // } // }; // useEffect(() => { // getDeviceData().then(data => { // setFirebseToken(data); // }); // }, []); const { mutate, isPending } = useMutation({ mutationFn: (payload: loginPayload) => authApi.login(payload), onSuccess: res => { navigation.navigate('Login-Confirm'); setExpireTime(res.data.expireTime); }, onError: err => { setError('Xatolik yuz berdi'); console.dir(err); }, }); const { control, handleSubmit, setValue, formState: { errors }, } = useForm({ resolver: zodResolver(loginSchema), defaultValues: { phone: '', passportSeriya: '', passportNumber: '', }, }); const onSubmit = (data: LoginFormType) => { mutate({ branchId: data.branchId, phoneNumber: data.phone, passportSerial: `${data.passportSeriya.toUpperCase()}${ data.passportNumber }`, fcmToken: '', deviceId: '', deviceType: '', deviceName: '', }); // navigation.navigate('Login-Confirm'); setUser({ phoneNumber: data.phone, }); }; const handleBackNavigation = useCallback(() => { navigation.navigate('select-auth'); }, [navigation]); const handlePhoneChange = useCallback((text: string) => { const digits = text.replace(/\D/g, ''); const full = digits.startsWith('998') ? digits : `998${digits}`; setRawPhone(`+${full}`); setValue('phone', full, { shouldValidate: true }); }, []); const keyboardBehavior = useMemo( () => (Platform.OS === 'ios' ? 'padding' : 'height'), [], ); return ( {t('Tizimga kirish')} { const formatted = formatPhone(rawPhone); return ( {t('Telefon raqami')} {errors.phone && ( {t(errors.phone.message || '')} )} ); }} /> {t('Passport seriya raqami')} ( { onChange(text); if (text.length === 2) { passportNumberRef.current?.focus(); } }} placeholderTextColor="#D8DADC" /> )} /> ( { const onlyNumbers = text.replace(/[^0-9]/g, ''); onChange(onlyNumbers); }} placeholderTextColor="#D8DADC" /> )} /> {(errors.passportSeriya || errors.passportNumber) && ( {t(errors.passportSeriya?.message || '') || t(errors.passportNumber?.message || '')} )} ( {t('Filial')} setFilialDropdownVisible(prev => !prev) } > {branchList?.find(e => e.id === value)?.name || t('Filialni tanlang...')} {filialDropdownVisible ? ( ) : ( )} {filialDropdownVisible && ( {branchList && branchList.map((item: Branch) => ( { setValue('branchId', item.id); setFilialDropdownVisible(false); }} > {item.name} ))} )} {errors.branchId && ( {t(errors.branchId.message || '')} )} {error && ( {t(error)} )} )} /> {isPending ? ( ) : ( {t('Tizimga kirish')} )} {t('ID va kabinet yo’qmi?')} navigation.navigate('Register')} > {t('Ro’yxatdan o’tish')} ); }; export default Login;