243 lines
8.2 KiB
TypeScript

'use client'
import { useServey } from '@/hooks/useSurvey'
import { SurveyBasicRequest } from '@/types/Survey'
import { useRouter, useSearchParams } from 'next/navigation'
import { useState, useEffect } from 'react'
import { useSurveySaleTabState } from '@/store/surveySaleTabState'
import { usePopupController } from '@/store/popupController'
import { useAddressStore } from '@/store/addressStore'
const defaultBasicInfoForm: SurveyBasicRequest = {
representative: '',
store: null,
construction_point: null,
investigation_date: new Date().toLocaleDateString('en-CA'),
building_name: null,
customer_name: null,
post_code: null,
address: null,
address_detail: null,
submission_status: false,
submission_date: null,
}
const REQUIRED_FIELDS: (keyof SurveyBasicRequest)[] = ['representative', 'store', 'construction_point']
export default function BasicForm() {
const searchParams = useSearchParams()
const id = searchParams.get('id')
const router = useRouter()
const { setBasicInfoSelected } = useSurveySaleTabState()
const { surveyDetail, createSurvey, isCreatingSurvey, updateSurvey, isUpdatingSurvey } = useServey(Number(id))
const [basicInfoData, setBasicInfoData] = useState<SurveyBasicRequest>(defaultBasicInfoForm)
const { addressData } = useAddressStore()
const popupController = usePopupController()
useEffect(() => {
if (surveyDetail) {
const { id, updated_at, created_at, detail_info, ...rest } = surveyDetail
setBasicInfoData(rest)
}
if (addressData) {
setBasicInfoData({
...basicInfoData,
post_code: addressData.post_code,
address: addressData.address,
address_detail: addressData.address_detail,
})
}
setBasicInfoSelected()
}, [surveyDetail, addressData])
const focusInput = (input: keyof SurveyBasicRequest) => {
const inputElement = document.getElementById(input)
if (inputElement) {
inputElement.focus()
}
}
const validateSurvey = (basicInfoData: SurveyBasicRequest) => {
const emptyField = REQUIRED_FIELDS.find((field) => !basicInfoData[field])
if (emptyField) {
focusInput(emptyField)
return false
}
return true
}
const handleChange = (key: keyof SurveyBasicRequest, value: string) => {
setBasicInfoData({ ...basicInfoData, [key]: value })
}
const handleSave = async (isTemporary: boolean) => {
if (id) {
updateSurvey(basicInfoData)
router.push(`/survey-sale/${id}?tab=basic-info`)
}
if (isTemporary) {
const saveId = await createSurvey(basicInfoData)
alert('save success temporary id: ' + saveId)
router.push(`/survey-sale/${saveId}?tab=basic-info`)
} else {
if (validateSurvey(basicInfoData)) {
const saveId = await createSurvey(basicInfoData)
alert('save success id: ' + saveId)
router.push(`/survey-sale/${saveId}?tab=basic-info`)
}
}
}
if (isCreatingSurvey || isUpdatingSurvey) {
return <div>Loading...</div>
}
return (
<>
<div className="sale-frame">
<div className="data-form-wrap">
<div className="data-input-form-bx">
<div className="data-input-form-tit"></div>
<input
type="text"
className="input-frame"
id="representative"
value={basicInfoData.representative}
onChange={(e) => handleChange('representative', e.target.value)}
required
/>
</div>
<div className="data-input-form-bx">
<div className="data-input-form-tit"></div>
<input
type="text"
className="input-frame"
id="store"
value={basicInfoData.store ?? ''}
onChange={(e) => handleChange('store', e.target.value)}
required
/>
</div>
<div className="data-input-form-bx">
<div className="data-input-form-tit"></div>
<input
type="text"
className="input-frame"
id="construction_point"
value={basicInfoData.construction_point ?? ''}
onChange={(e) => handleChange('construction_point', e.target.value)}
required
/>
</div>
</div>
</div>
<div className="sale-frame">
<div className="data-form-wrap">
<div className="data-input-form-bx">
<div className="data-input-form-tit">調</div>
<div className="date-input">
<button className="date-btn">
<i className="date-icon"></i>
</button>
<input
type="date"
className="date-frame"
id="investigation_date"
value={basicInfoData.investigation_date ?? ''}
onChange={(e) => handleChange('investigation_date', e.target.value)}
/>
</div>
</div>
<div className="data-input-form-bx">
<div className="data-input-form-tit"></div>
<input
type="text"
className="input-frame"
id="building_name"
value={basicInfoData.building_name ?? ''}
onChange={(e) => handleChange('building_name', e.target.value)}
/>
</div>
<div className="data-input-form-bx">
<div className="data-input-form-tit"></div>
<input
type="text"
className="input-frame"
id="customer_name"
value={basicInfoData.customer_name ?? ''}
onChange={(e) => handleChange('customer_name', e.target.value)}
/>
</div>
<div className="data-input-form-bx">
<div className="data-input-form-tit"></div>
<div className="form-flex">
<div className="form-bx">
<input
type="text"
className="input-frame"
id="post_code"
value={basicInfoData.post_code ?? ''}
onChange={(e) => handleChange('post_code', e.target.value)}
/>
</div>
<div className="form-bx">
<select
className="select-form"
name="address"
id="address"
value={basicInfoData.address ?? ''}
onChange={(e) => handleChange('address', e.target.value)}
>
<option value=""></option>
<option value=""></option>
<option value=""></option>
<option value=""></option>
<option value=""></option>
</select>
</div>
</div>
<div className="form-btn">
<button className="btn-frame n-blue icon" onClick={() => popupController.setZipCodePopup(true)}>
便<i className="btn-arr"></i>
</button>
</div>
</div>
<div className="data-input-form-bx">
<div className="data-input-form-tit">, </div>
<input
type="text"
className="input-frame"
id="address_detail"
value={basicInfoData.address_detail ?? ''}
onChange={(e) => handleChange('address_detail', e.target.value)}
/>
</div>
</div>
<div className="btn-flex-wrap">
<div className="btn-bx">
<button className="btn-frame n-blue icon" onClick={() => handleSave(true)}>
<i className="btn-arr"></i>
</button>
</div>
<div className="btn-bx">
<button className="btn-frame red icon" onClick={() => handleSave(false)}>
<i className="btn-arr"></i>
</button>
</div>
<div className="btn-bx">
<button className="btn-frame n-blue icon" onClick={() => router.push('/survey-sale')}>
<i className="btn-arr"></i>
</button>
</div>
</div>
</div>
</>
)
}