keyy1315 5120764108 feat: surveySale pdf 생성 방식 변경
- pdf 생성 시 response에 blob으로 반환하도록 방식 변경
- 제출 시 메일 href pdf 생성 페이지 링크에서 request url로 변경
2025-06-30 17:45:08 +09:00

162 lines
4.9 KiB
TypeScript

'use client'
import type { Mode, SurveyBasicRequest, SurveyDetailRequest } from '@/types/Survey'
import { useEffect, useState } from 'react'
import ButtonForm from './ButtonForm'
import BasicForm from './BasicForm'
import RoofForm from './RoofForm'
import { useParams, useRouter, useSearchParams, usePathname } from 'next/navigation'
import { useSurvey } from '@/hooks/useSurvey'
import { useSessionStore } from '@/store/session'
import DataTable from './DataTable'
import { usePopupController } from '@/store/popupController'
const roofInfoForm: SurveyDetailRequest = {
contractCapacity: null,
retailCompany: null,
supplementaryFacilities: null,
supplementaryFacilitiesEtc: null,
installationSystem: null,
installationSystemEtc: null,
constructionYear: null,
constructionYearEtc: null,
roofMaterial: null,
roofMaterialEtc: null,
roofShape: null,
roofShapeEtc: null,
roofSlope: null,
houseStructure: '1',
houseStructureEtc: null,
rafterMaterial: '1',
rafterMaterialEtc: null,
rafterSize: null,
rafterSizeEtc: null,
rafterPitch: null,
rafterPitchEtc: null,
rafterDirection: '1',
openFieldPlateKind: null,
openFieldPlateKindEtc: null,
openFieldPlateThickness: null,
leakTrace: false,
waterproofMaterial: null,
waterproofMaterialEtc: null,
insulationPresence: '1',
insulationPresenceEtc: null,
structureOrder: null,
structureOrderEtc: null,
installationAvailability: null,
installationAvailabilityEtc: null,
memo: null,
}
const basicInfoForm: SurveyBasicRequest = {
representative: '',
representativeId: null,
store: null,
storeId: null,
constructionPoint: null,
constructionPointId: null,
investigationDate: new Date().toLocaleDateString('en-CA'),
buildingName: null,
customerName: null,
postCode: null,
address: null,
addressDetail: null,
submissionStatus: false,
submissionDate: null,
submissionTargetId: null,
submissionTargetNm: null,
srlNo: null,
}
export default function DetailForm() {
const id = useParams().id
const modeset = !Number.isNaN(Number(id)) ? 'READ' : 'CREATE'
const { surveyDetail, isLoadingSurveyDetail } = useSurvey(Number(id), false)
const { session } = useSessionStore()
const searchParams = useSearchParams()
const popupController = usePopupController()
const router = useRouter()
const pathname = usePathname()
const [mode, setMode] = useState<Mode>(modeset)
const [basicInfoData, setBasicInfoData] = useState<SurveyBasicRequest>(() => ({
...basicInfoForm,
representative: session?.userNm ?? '',
representativeId: session?.userId ?? null,
store: session?.storeNm ?? null,
storeId: session?.storeId ?? null,
constructionPoint: session?.builderNm ?? null,
constructionPointId: session?.builderId ?? null,
}))
const [roofInfoData, setRoofInfoData] = useState<SurveyDetailRequest>(roofInfoForm)
/** route 에러 처리 - 잘못된 URL 접근 시 생성 페이지로 리다이렉트 */
useEffect(() => {
if (modeset === 'CREATE' && pathname !== '/survey-sale/regist') {
router.replace('/survey-sale/regist')
}
return
}, [modeset, id, pathname])
/** 제출 팝업 처리 - createSurvey 이후 popup 처리 시 노드 삽입 오류로 인해 별도 처리 */
useEffect(() => {
const show = searchParams.get('show')
if (show === 'true' && !isLoadingSurveyDetail) {
popupController.setSurveySaleSubmitPopup(true)
router.replace(pathname)
}
}, [searchParams, pathname, isLoadingSurveyDetail])
/** 세션 데이터가 변경될 때 기본 정보 업데이트 */
useEffect(() => {
if (!session?.isLoggedIn) return
setBasicInfoData((prev) => ({
...prev,
representative: session.userNm ?? '',
representativeId: session.userId ?? null,
store: session.storeNm ?? null,
storeId: session.storeId ?? null,
constructionPoint: session.builderNm ?? null,
constructionPointId: session.builderId ?? null,
}))
}, [session?.isLoggedIn])
/** 조사매물 상세 데이터 업데이트 */
useEffect(() => {
if (!isLoadingSurveyDetail && surveyDetail && (mode === 'EDIT' || mode === 'READ')) {
const { id, uptDt, regDt, detailInfo, ...rest } = surveyDetail
setBasicInfoData((prev) => ({
...prev,
...rest,
}))
if (detailInfo) {
const { id, uptDt, regDt, basicInfoId, ...rest } = detailInfo
setRoofInfoData(rest)
}
}
}, [mode, isLoadingSurveyDetail, surveyDetail])
const data = {
basic: basicInfoData,
roof: roofInfoData,
}
const buttonFormProps = { mode, setMode, data }
return (
<>
{mode === 'READ' && surveyDetail && <DataTable surveyDetail={surveyDetail} />}
<div className="sale-detail-toggle-wrap">
<BasicForm basicInfo={basicInfoData} setBasicInfo={setBasicInfoData} mode={mode} session={session} />
<RoofForm roofInfo={roofInfoData} setRoofInfo={setRoofInfoData} mode={mode} />
<ButtonForm {...buttonFormProps} />
</div>
</>
)
}