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.
109 lines
2.7 KiB
109 lines
2.7 KiB
import {
|
|
useEffect,
|
|
useCallback,
|
|
useRef,
|
|
} from 'react'
|
|
|
|
import forEach from 'lodash/forEach'
|
|
import trim from 'lodash/trim'
|
|
|
|
import { formIds } from 'config/form'
|
|
|
|
import type { UserInfo } from 'requests/saveUserInfo'
|
|
import { getUserInfo } from 'requests/getUserInfo'
|
|
import { saveUserInfo } from 'requests/saveUserInfo'
|
|
|
|
import type { SelectedCountry } from './useCountries'
|
|
import { useUserInfoForm } from './useUserInfoForm'
|
|
import { useValidateForm } from './useValidateForm'
|
|
|
|
export const useUserInfo = () => {
|
|
const validateForm = useValidateForm()
|
|
const saveButton = useRef<HTMLButtonElement>(null)
|
|
|
|
const {
|
|
cities,
|
|
countries,
|
|
getCities,
|
|
onCitySelect,
|
|
onCountrySelect,
|
|
onPhoneBlur,
|
|
onRegionOrCityChange,
|
|
readFormError,
|
|
readFormValue,
|
|
resetCities,
|
|
resetSelectedCity,
|
|
selectedCity,
|
|
updateFormError,
|
|
updateFormValue,
|
|
} = useUserInfoForm()
|
|
|
|
const readTrimmedValue = useCallback(
|
|
(fieldName: string) => trim(readFormValue(fieldName)),
|
|
[readFormValue],
|
|
)
|
|
|
|
const handleSubmit = useCallback(() => {
|
|
if (validateForm()) {
|
|
const firstname = readTrimmedValue(formIds.firstname)
|
|
const lastname = readTrimmedValue(formIds.lastname)
|
|
const phone = readTrimmedValue(formIds.phone)
|
|
const password = readTrimmedValue(formIds.password)
|
|
const postalCode = Number(readTrimmedValue(formIds.postalCode))
|
|
const region = readTrimmedValue(formIds.region)
|
|
const address_line1 = readTrimmedValue(formIds.address1)
|
|
const address_line2 = readTrimmedValue(formIds.address2)
|
|
const city = readTrimmedValue(formIds.city)
|
|
const countryId = Number(readTrimmedValue(formIds.countryId))
|
|
|
|
saveUserInfo({
|
|
address_line1,
|
|
address_line2,
|
|
city,
|
|
cityId: selectedCity?.id || null,
|
|
countryId,
|
|
firstname,
|
|
lastname,
|
|
password,
|
|
phone,
|
|
postalCode,
|
|
region,
|
|
}).then(() => saveButton?.current?.blur())
|
|
}
|
|
}, [
|
|
readTrimmedValue,
|
|
validateForm,
|
|
selectedCity,
|
|
])
|
|
|
|
useEffect(() => {
|
|
getUserInfo().then((res: UserInfo) => {
|
|
forEach(res, (value: string | number | SelectedCountry, key: string) => {
|
|
if (value && typeof value === 'object') {
|
|
onCountrySelect(value, false)
|
|
} else if (value) {
|
|
updateFormValue(key)(String(value))
|
|
}
|
|
})
|
|
})
|
|
}, [updateFormValue, onCountrySelect])
|
|
|
|
return {
|
|
cities,
|
|
countries,
|
|
getCities,
|
|
handleSubmit,
|
|
onCitySelect,
|
|
onCountrySelect,
|
|
onPhoneBlur,
|
|
onRegionOrCityChange,
|
|
readFormError,
|
|
readFormValue,
|
|
resetCities,
|
|
resetSelectedCity,
|
|
saveButton,
|
|
selectedCity,
|
|
updateFormError,
|
|
updateFormValue,
|
|
}
|
|
}
|
|
|