fix: fix data not loading error when navigating PDF pages without not login

- 로그인 하지 않고 pdf 링크로 이동 시 데이터 로드 되지 않는 문제 해결
- 로그인 하지 않았을 때 pdf 다운로드 이후 메인 페이지로 이동하도록 수정
This commit is contained in:
Dayoung 2025-06-09 10:37:48 +09:00
parent a0beb8eca3
commit 763c9d37cf
6 changed files with 41 additions and 30 deletions

View File

@ -15,6 +15,7 @@ interface SessionParams {
storeId: string | null storeId: string | null
builderId: string | null builderId: string | null
isLoggedIn: string | null isLoggedIn: string | null
isPdf: boolean | null
} }
const checkT01Role = (survey: Survey): boolean => survey.SRL_NO !== '一時保存' const checkT01Role = (survey: Survey): boolean => survey.SRL_NO !== '一時保存'
@ -74,6 +75,7 @@ export async function GET(request: NextRequest, { params }: { params: Promise<{
storeId: searchParams.get('storeId'), storeId: searchParams.get('storeId'),
builderId: searchParams.get('builderId'), builderId: searchParams.get('builderId'),
isLoggedIn: searchParams.get('isLoggedIn'), isLoggedIn: searchParams.get('isLoggedIn'),
isPdf: searchParams.get('isPdf') === 'true' ? true : false,
} }
// @ts-ignore // @ts-ignore
const survey = await prisma.SD_SURVEY_SALES_BASIC_INFO.findFirst({ const survey = await prisma.SD_SURVEY_SALES_BASIC_INFO.findFirst({
@ -84,7 +86,7 @@ export async function GET(request: NextRequest, { params }: { params: Promise<{
DETAIL_INFO: true, DETAIL_INFO: true,
}, },
}) })
if (checkRole(survey, sessionParams)) { if (sessionParams.isPdf || checkRole(survey, sessionParams)) {
return NextResponse.json(survey) return NextResponse.json(survey)
} else { } else {
return NextResponse.json({ error: '該当物件の照会権限がありません。' }, { status: 403 }) return NextResponse.json({ error: '該当物件の照会権限がありません。' }, { status: 403 })

View File

@ -6,20 +6,27 @@ import { useParams, useRouter } from 'next/navigation'
import { useSurvey } from '@/hooks/useSurvey' import { useSurvey } from '@/hooks/useSurvey'
import { radioEtcData, roofMaterial, selectBoxOptions, supplementaryFacilities } from '../survey-sale/detail/RoofForm' import { radioEtcData, roofMaterial, selectBoxOptions, supplementaryFacilities } from '../survey-sale/detail/RoofForm'
import { useSpinnerStore } from '@/store/spinnerStore' import { useSpinnerStore } from '@/store/spinnerStore'
import { useSessionStore } from '@/store/session'
export default function SurveySaleDownloadPdf() { export default function SurveySaleDownloadPdf() {
const params = useParams() const params = useParams()
const id = params.id const id = params.id
const router = useRouter() const router = useRouter()
const { surveyDetail, isLoadingSurveyDetail } = useSurvey(Number(id)) const { surveyDetail, isLoadingSurveyDetail } = useSurvey(Number(id), true)
const { setIsShow } = useSpinnerStore() const { setIsShow } = useSpinnerStore()
const { session } = useSessionStore()
const targetRef = useRef<HTMLDivElement>(null) const targetRef = useRef<HTMLDivElement>(null)
const isGeneratedRef = useRef(false) const isGeneratedRef = useRef(false)
useEffect(() => { useEffect(() => {
if (isLoadingSurveyDetail || !surveyDetail || isGeneratedRef.current) return if (isLoadingSurveyDetail || isGeneratedRef.current) return
if (surveyDetail === null) {
alert('データが見つかりません。')
router.replace('/')
return
}
isGeneratedRef.current = true isGeneratedRef.current = true
handleDownPdf() handleDownPdf()
}, [surveyDetail?.id, isLoadingSurveyDetail]) }, [surveyDetail?.id, isLoadingSurveyDetail])
@ -48,11 +55,19 @@ export default function SurveySaleDownloadPdf() {
}, },
} }
generatePDF(targetRef, options).then(() => { generatePDF(targetRef, options)
setIsShow(false) .then(() => {
router.replace(`/survey-sale/${id}`) setIsShow(false)
alert('PDFの生成が完了しました。 ポップアップウィンドウからダウンロードしてください。') if (session?.isLoggedIn) {
}) router.replace(`/survey-sale/${id}`)
} else {
router.replace('/')
}
alert('PDFの生成が完了しました。 ポップアップウィンドウからダウンロードしてください。')
})
.catch((error: any) => {
console.error('error', error)
})
} }
return ( return (

View File

@ -4,15 +4,12 @@ import { useSurvey } from '@/hooks/useSurvey'
import { useParams, useRouter } from 'next/navigation' import { useParams, useRouter } from 'next/navigation'
import { useEffect } from 'react' import { useEffect } from 'react'
import DetailForm from './DetailForm' import DetailForm from './DetailForm'
import { useSessionStore } from '@/store/session'
export default function DataTable() { export default function DataTable() {
const params = useParams() const params = useParams()
const id = params.id const id = params.id
const router = useRouter() const router = useRouter()
const { session } = useSessionStore()
useEffect(() => { useEffect(() => {
if (Number.isNaN(Number(id))) { if (Number.isNaN(Number(id))) {
alert('間違ったアプローチです。') alert('間違ったアプローチです。')

View File

@ -74,7 +74,7 @@ export default function DetailForm() {
const modeset = Number(routeId) ? 'READ' : idParam ? 'EDIT' : 'CREATE' const modeset = Number(routeId) ? 'READ' : idParam ? 'EDIT' : 'CREATE'
const id = Number(routeId) ? Number(routeId) : Number(idParam) const id = Number(routeId) ? Number(routeId) : Number(idParam)
const { surveyDetail, isLoadingSurveyDetail, validateSurveyDetail } = useSurvey(Number(id)) const { surveyDetail, isLoadingSurveyDetail } = useSurvey(Number(id))
const { session } = useSessionStore() const { session } = useSessionStore()
const [mode, setMode] = useState<Mode>(modeset) const [mode, setMode] = useState<Mode>(modeset)
@ -103,9 +103,8 @@ export default function DetailForm() {
})) }))
}, [session?.isLoggedIn]) }, [session?.isLoggedIn])
// 설문 데이터 로딩 및 업데이트
useEffect(() => { useEffect(() => {
if (isLoadingSurveyDetail || !session?.isLoggedIn) return if (isLoadingSurveyDetail) return
if (surveyDetail && (mode === 'EDIT' || mode === 'READ')) { if (surveyDetail && (mode === 'EDIT' || mode === 'READ')) {
const { id, uptDt, regDt, detailInfo, ...rest } = surveyDetail const { id, uptDt, regDt, detailInfo, ...rest } = surveyDetail
setBasicInfoData((prev) => ({ setBasicInfoData((prev) => ({
@ -116,12 +115,9 @@ export default function DetailForm() {
if (detailInfo) { if (detailInfo) {
const { id, uptDt, regDt, basicInfoId, ...rest } = detailInfo const { id, uptDt, regDt, basicInfoId, ...rest } = detailInfo
setRoofInfoData(rest) setRoofInfoData(rest)
if (validateSurveyDetail(rest).trim() !== '') {
// validation logic here if needed
}
} }
} }
}, [mode, session?.isLoggedIn, isLoadingSurveyDetail]) }, [mode, isLoadingSurveyDetail, surveyDetail])
const data = { const data = {
basic: basicInfoData, basic: basicInfoData,

View File

@ -27,12 +27,7 @@ export default function ListTable() {
}, [pathname]) }, [pathname])
useEffect(() => { useEffect(() => {
if (!session.isLoggedIn || isLoadingSurveyList) return if (isLoadingSurveyList) return
// if ('status' in surveyList && surveyList.status === 403) {
// alert('権限がありません。')
// router.push('/survey-sale')
// return
// }
if ('count' in surveyList && surveyList.count > 0) { if ('count' in surveyList && surveyList.count > 0) {
if (offset > 0) { if (offset > 0) {
setHeldSurveyList((prev) => [...prev, ...surveyList.data]) setHeldSurveyList((prev) => [...prev, ...surveyList.data])
@ -44,7 +39,7 @@ export default function ListTable() {
setHeldSurveyList([]) setHeldSurveyList([])
setHasMore(false) setHasMore(false)
} }
}, [surveyList, offset, session.isLoggedIn]) }, [surveyList, offset, isLoadingSurveyList])
const handleDetailClick = (id: number) => { const handleDetailClick = (id: number) => {
router.push(`/survey-sale/${id}`) router.push(`/survey-sale/${id}`)

View File

@ -55,7 +55,10 @@ type ZipCode = {
kana3: string kana3: string
} }
export function useSurvey(id?: number): { export function useSurvey(
id?: number,
isPdf?: boolean,
): {
surveyList: { data: SurveyBasicInfo[]; count: number } | {} surveyList: { data: SurveyBasicInfo[]; count: number } | {}
surveyDetail: SurveyBasicInfo | null surveyDetail: SurveyBasicInfo | null
isLoadingSurveyList: boolean isLoadingSurveyList: boolean
@ -102,6 +105,9 @@ export function useSurvey(id?: number): {
return false return false
} }
} }
if (isPdf) {
return true
}
alert('ログインしていません。') alert('ログインしていません。')
return false return false
} }
@ -114,7 +120,7 @@ export function useSurvey(id?: number): {
queryKey: ['survey', 'list', keyword, searchOption, isMySurvey, sort, offset, session?.storeNm, session?.builderId, session?.role], queryKey: ['survey', 'list', keyword, searchOption, isMySurvey, sort, offset, session?.storeNm, session?.builderId, session?.role],
queryFn: async () => { queryFn: async () => {
if (!checkSession()) { if (!checkSession()) {
router.replace('/') router.replace('/login')
return { data: [], count: 0 } return { data: [], count: 0 }
} }
const resp = await axiosInstance(null).get<{ data: SurveyBasicInfo[]; count: number }>('/api/survey-sales', { const resp = await axiosInstance(null).get<{ data: SurveyBasicInfo[]; count: number }>('/api/survey-sales', {
@ -131,7 +137,6 @@ export function useSurvey(id?: number): {
}) })
return resp.data return resp.data
}, },
enabled: session?.isLoggedIn,
}) })
const surveyData = useMemo(() => { const surveyData = useMemo(() => {
if (!surveyListData) return { count: 0, data: [] } if (!surveyListData) return { count: 0, data: [] }
@ -144,7 +149,7 @@ export function useSurvey(id?: number): {
queryKey: ['survey', id], queryKey: ['survey', id],
queryFn: async () => { queryFn: async () => {
if (!checkSession()) { if (!checkSession()) {
router.replace('/survey-sale') router.replace('/login')
return null return null
} }
if (id === 0 || id === undefined) return null if (id === 0 || id === undefined) return null
@ -155,6 +160,7 @@ export function useSurvey(id?: number): {
storeId: session?.storeId, storeId: session?.storeId,
builderId: session?.builderId, builderId: session?.builderId,
isLoggedIn: session?.isLoggedIn, isLoggedIn: session?.isLoggedIn,
isPdf: isPdf,
}, },
}) })
return resp.data return resp.data
@ -164,7 +170,7 @@ export function useSurvey(id?: number): {
return null return null
} }
}, },
enabled: id !== 0 && id !== undefined && session?.isLoggedIn, enabled: id !== 0 && id !== undefined,
}) })
const { mutateAsync: createSurvey, isPending: isCreatingSurvey } = useMutation({ const { mutateAsync: createSurvey, isPending: isCreatingSurvey } = useMutation({