You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
spa_instat_tv/src/hooks/useForm.tsx

138 lines
3.3 KiB

import type { ChangeEvent, FocusEvent } from 'react'
import {
useEffect,
useCallback,
} from 'react'
import trim from 'lodash/trim'
import { isValidEmail } from 'helpers/isValidEmail'
import { isValidPhone } from 'helpers/isValidPhone'
import { formatPhoneCode } from 'helpers/formatPhoneCode'
import type { SelectedCountry } from 'hooks/useCountries'
import { useCountries } from 'hooks/useCountries'
import { useCities } from 'hooks/useCities'
import { formIds } from 'config/form'
import { useForm } from 'features/FormStore'
import { useSubmitHandler } from 'features/Register/components/RegistrationStep/hooks/useSubmitHandler'
import { useLexicsStore } from 'features/LexicsStore'
type Name = 'name_rus' | 'name_eng'
export const useRegistrationForm = () => {
const {
readFormError,
readFormValue,
updateFormError,
updateFormValue,
} = useForm()
const {
countries,
selectedCountry,
setSelectedCountry,
} = useCountries()
const {
cities,
getCities,
onCitySelect,
resetCities,
resetSelectedCity,
selectedCity,
} = useCities()
const handleSubmit = useSubmitHandler({
selectedCity,
selectedCountry,
})
const { suffix } = useLexicsStore()
const onEmailBlur = useCallback(({ target }: FocusEvent<HTMLInputElement>) => {
const email = trim(target.value)
if (email && !isValidEmail(email)) {
updateFormError(formIds.email, 'error_invalid_email_format')
}
}, [updateFormError])
const onPhoneBlur = useCallback(({ target }: ChangeEvent<HTMLInputElement>) => {
const phone = target.value
if (phone && !isValidPhone(phone)) {
updateFormError(formIds.phone, 'error_invalid_phone_format')
}
}, [updateFormError])
const onCountrySelect = useCallback((
country: SelectedCountry,
updatePhoneCode: boolean = true,
) => {
setSelectedCountry(country)
const countryName = country ? country[`name_${suffix}` as Name] : ''
updateFormValue(formIds.country)(countryName)
updateFormValue(formIds.cityId)('')
updateFormValue(formIds.countryId)(`${country?.id}`)
resetCities()
resetSelectedCity()
if (updatePhoneCode) {
const code = country?.phone_code
? formatPhoneCode(country.phone_code)
: ''
updateFormValue(formIds.phone)(code)
}
}, [
resetCities,
resetSelectedCity,
setSelectedCountry,
updateFormValue,
suffix,
])
const onRegionOrCityChange = useCallback((fieldName: string) => (
({ target }: ChangeEvent<HTMLInputElement>) => {
if (selectedCountry) {
updateFormValue(fieldName)(target.value)
} else {
updateFormError(formIds.country, 'error_select_country_first')
}
}
), [
selectedCountry,
updateFormError,
updateFormValue,
])
const trimmedCity = trim(readFormValue(formIds.city))
useEffect(() => {
if (trimmedCity && selectedCountry?.id) {
getCities(trimmedCity, selectedCountry.id)
}
}, [
trimmedCity,
selectedCountry,
getCities,
])
return {
cities,
countries,
getCities,
handleSubmit,
onCitySelect,
onCountrySelect,
onEmailBlur,
onPhoneBlur,
onRegionOrCityChange,
readFormError,
readFormValue,
resetCities,
resetSelectedCity,
selectedCity,
updateFormError,
updateFormValue,
}
}