diff --git a/apps/as/src/entities/fnrs-cnsltn/api/queries.ts b/apps/as/src/entities/fnrs-cnsltn/api/queries.ts index 7e29ba38b..15f1c14d3 100644 --- a/apps/as/src/entities/fnrs-cnsltn/api/queries.ts +++ b/apps/as/src/entities/fnrs-cnsltn/api/queries.ts @@ -64,8 +64,11 @@ export function useSaveApplyFnrsCnsltnMng() { const queryClient = useQueryClient(); return useMutation({ mutationFn: (body: FnrsCnsltnApplySaveRequestDto) => fnrsCnsltnMngService.saveApply(body), - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: fnrsCnsltnKeys.all }); + onSuccess: (data) => { + if (data) { + queryClient.removeQueries({ queryKey: fnrsCnsltnKeys.detail(data) }); + } + queryClient.invalidateQueries({ queryKey: fnrsCnsltnKeys.all, refetchType: "all" }); }, }); } @@ -137,10 +140,8 @@ export function useSubmitSupplementFnrsCnsltnMng() { mutationFn: ({ id, body }: { id: string; body: FnrsCnsltnApplySaveRequestDto }) => fnrsCnsltnMngService.submitSupplement(id, body), onSuccess: (_data, { id }) => { - queryClient.invalidateQueries({ queryKey: fnrsCnsltnKeys.all }); - queryClient.invalidateQueries({ - queryKey: fnrsCnsltnKeys.detail(id), - }); + queryClient.removeQueries({ queryKey: fnrsCnsltnKeys.detail(id) }); + queryClient.invalidateQueries({ queryKey: fnrsCnsltnKeys.all, refetchType: "all" }); }, }); } diff --git a/apps/as/src/entities/instl-sncn/api/queries.ts b/apps/as/src/entities/instl-sncn/api/queries.ts index b01c0c892..dd32a5503 100644 --- a/apps/as/src/entities/instl-sncn/api/queries.ts +++ b/apps/as/src/entities/instl-sncn/api/queries.ts @@ -71,8 +71,11 @@ export function useInstlSncnSaveApply() { return useMutation({ mutationFn: (payload: InstlSncnApplySaveRequestDto) => instlSncnService.saveApply(payload), - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: instlSncnKeys.all }); + onSuccess: (data) => { + if (data) { + queryClient.removeQueries({ queryKey: instlSncnKeys.detail(data) }); + } + queryClient.invalidateQueries({ queryKey: instlSncnKeys.all, refetchType: "all" }); }, }); } @@ -110,8 +113,8 @@ export function useInstlSncnSubmitSupplement() { mutationFn: ({ id, payload }: { id: string; payload: InstlSncnApplySaveRequestDto }) => instlSncnService.submitSupplement(id, payload), onSuccess: (_, variables) => { - queryClient.invalidateQueries({ queryKey: instlSncnKeys.all }); - queryClient.invalidateQueries({ queryKey: instlSncnKeys.detail(variables.id) }); + queryClient.removeQueries({ queryKey: instlSncnKeys.detail(variables.id) }); + queryClient.invalidateQueries({ queryKey: instlSncnKeys.all, refetchType: "all" }); }, }); } diff --git a/apps/as/src/pages/fnrs-cnsltn/ui/fnrs-detail-gate.tsx b/apps/as/src/pages/fnrs-cnsltn/ui/fnrs-detail-gate.tsx index efe663ab3..9f4cb329b 100644 --- a/apps/as/src/pages/fnrs-cnsltn/ui/fnrs-detail-gate.tsx +++ b/apps/as/src/pages/fnrs-cnsltn/ui/fnrs-detail-gate.tsx @@ -12,7 +12,7 @@ interface FnrsDetailGateProps { function FnrsDetailGate({ id }: FnrsDetailGateProps) { const userInfo = useUserStore((state) => state.userInfo); - const { data, isLoading, isError } = useFnrsCnsltnMng(id); + const { data, isLoading, isFetching, isError } = useFnrsCnsltnMng(id); const canEdit = canEditPbadmsDoc({ docSeComCd: "FNRS", prgrsSttsComCd: data?.detDto?.prgrsSttsComCd, @@ -22,7 +22,7 @@ function FnrsDetailGate({ id }: FnrsDetailGateProps) { return ( state.userInfo); const { data, isLoading } = useFnrsCnsltnMng(id); - if (isLoading) { + const canEdit = canEditPbadmsDoc({ + docSeComCd: "FNRS", + prgrsSttsComCd: data?.detDto?.prgrsSttsComCd, + rgtr: data?.detDto?.rgtr, + loggedInUserUnqId: userInfo?.userUnqId, + }); + + useEffect(() => { + if (isLoading || !data?.detDto || !userInfo) return; + if (!canEdit) { + router.replace(withListQs(`/fnrs-cnsltn/${id}`)); + } + }, [canEdit, data?.detDto, id, isLoading, router, userInfo]); + + if (isLoading || (Boolean(data?.detDto) && !canEdit && Boolean(userInfo))) { return (
diff --git a/apps/as/src/pages/fnrs-cnsltn/ui/fnrs-form-page.tsx b/apps/as/src/pages/fnrs-cnsltn/ui/fnrs-form-page.tsx index 7c0f47f5d..cde3fd4c1 100644 --- a/apps/as/src/pages/fnrs-cnsltn/ui/fnrs-form-page.tsx +++ b/apps/as/src/pages/fnrs-cnsltn/ui/fnrs-form-page.tsx @@ -70,7 +70,9 @@ function FnrsFormPage({ mode, initialData, createDefaults }: FnrsFormPageProps) const [isSubmitting, setIsSubmitting] = useState(false); const [isPwrkCnsltnDocMngOpen, setIsPwrkCnsltnDocMngOpen] = useState(false); const isEditMode = mode === "edit"; - const isSplmntPrgrsStts = initialData?.detDto?.prgrsSttsComCd === "SL"; + const prgrsSttsComCd = initialData?.detDto?.prgrsSttsComCd ?? ""; + const isDraftStatus = !isEditMode || prgrsSttsComCd === "SV" || prgrsSttsComCd === ""; + const isSplmntPrgrsStts = isEditMode && prgrsSttsComCd === "SL"; const fnrsCnsltnDocNo = initialData?.detDto?.fnrsCnsltnDocNo; const { data: pwrkCnsltnData } = usePwrkCnsltnMngByUpDocNo( @@ -153,8 +155,9 @@ function FnrsFormPage({ mode, initialData, createDefaults }: FnrsFormPageProps) if (!result) return; alert("보완 완료 처리되었습니다."); - await queryClient.invalidateQueries({ queryKey: fnrsCnsltnKeys.all }); - router.push(withListQs(`/fnrs-cnsltn/${docNo}`)); + queryClient.removeQueries({ queryKey: fnrsCnsltnKeys.detail(docNo) }); + await queryClient.invalidateQueries({ queryKey: fnrsCnsltnKeys.all, refetchType: "all" }); + router.replace(withListQs(`/fnrs-cnsltn/${docNo}`)); } catch (error) { console.error("보완 완료 실패:", error); alert("보완 완료 처리 중 오류가 발생했습니다."); @@ -206,8 +209,9 @@ function FnrsFormPage({ mode, initialData, createDefaults }: FnrsFormPageProps) if (!fnrsCnsltnDocNo) return; alert("신청 완료되었습니다."); - await queryClient.invalidateQueries({ queryKey: fnrsCnsltnKeys.all }); - router.push(withListQs(`/fnrs-cnsltn/${fnrsCnsltnDocNo}`)); + queryClient.removeQueries({ queryKey: fnrsCnsltnKeys.detail(fnrsCnsltnDocNo) }); + await queryClient.invalidateQueries({ queryKey: fnrsCnsltnKeys.all, refetchType: "all" }); + router.replace(withListQs(`/fnrs-cnsltn/${fnrsCnsltnDocNo}`)); } catch (error) { console.error("신청 실패:", error); alert("신청 중 오류가 발생했습니다."); @@ -294,7 +298,27 @@ function FnrsFormPage({ mode, initialData, createDefaults }: FnrsFormPageProps) > 목록 - {!isSplmntPrgrsStts ? ( + {isSplmntPrgrsStts ? ( + <> + {hasCompletedDraft ? ( + + ) : null} + + + ) : isDraftStatus ? ( <> - ) : null} - - - )} + ) : null}
diff --git a/apps/as/src/pages/instl-sncn/ui/instl-detail-gate.tsx b/apps/as/src/pages/instl-sncn/ui/instl-detail-gate.tsx index 321f92940..1eaab2614 100644 --- a/apps/as/src/pages/instl-sncn/ui/instl-detail-gate.tsx +++ b/apps/as/src/pages/instl-sncn/ui/instl-detail-gate.tsx @@ -12,7 +12,7 @@ interface InstlSncnDetailGateProps { function InstlSncnDetailGate({ id }: InstlSncnDetailGateProps) { const userInfo = useUserStore((state) => state.userInfo); - const { data, isLoading, isError } = useInstlSncnDetail(id); + const { data, isLoading, isFetching, isError } = useInstlSncnDetail(id); const shouldRedirectToEdit = canEditPbadmsDoc({ docSeComCd: "INSTL", prgrsSttsComCd: data?.detDto.prgrsSttsComCd, @@ -22,7 +22,7 @@ function InstlSncnDetailGate({ id }: InstlSncnDetailGateProps) { return ( state.userInfo); const { data, isError, isLoading } = useInstlSncnDetail(id); - if (isLoading) { + const canEdit = canEditPbadmsDoc({ + docSeComCd: "INSTL", + prgrsSttsComCd: data?.detDto.prgrsSttsComCd, + rgtr: data?.detDto.rgtr, + loggedInUserUnqId: userInfo?.userUnqId, + }); + + useEffect(() => { + if (isLoading || !data?.detDto || !userInfo) return; + if (!canEdit) { + router.replace(withListQs(`/instl-sncn/${id}`)); + } + }, [canEdit, data?.detDto, id, isLoading, router, userInfo]); + + if (isLoading || (Boolean(data?.detDto) && !canEdit && Boolean(userInfo))) { return (
diff --git a/apps/as/src/pages/instl-sncn/ui/instl-form-page.tsx b/apps/as/src/pages/instl-sncn/ui/instl-form-page.tsx index d9335c032..6cbdba382 100644 --- a/apps/as/src/pages/instl-sncn/ui/instl-form-page.tsx +++ b/apps/as/src/pages/instl-sncn/ui/instl-form-page.tsx @@ -59,7 +59,9 @@ function InstlFormPage({ mode, initialData, createDefaults }: InstlFormPageProps const alert = useAlertStore((state) => state.setMessage); const [isSubmitting, setIsSubmitting] = useState(false); const isEditMode = mode === "edit"; - const isSplmntPrgrsStts = initialData?.detDto.prgrsSttsComCd === "SL"; + const prgrsSttsComCd = initialData?.detDto.prgrsSttsComCd ?? ""; + const isDraftStatus = !isEditMode || prgrsSttsComCd === "SV" || prgrsSttsComCd === ""; + const isSplmntPrgrsStts = isEditMode && prgrsSttsComCd === "SL"; const { data: essentialFiles = [] } = useEsntlAtchFileMngTree({ docSeComCd: "INSTL" }); @@ -115,8 +117,9 @@ function InstlFormPage({ mode, initialData, createDefaults }: InstlFormPageProps if (!result) return; alert("보완 완료 처리되었습니다."); - await queryClient.invalidateQueries({ queryKey: instlSncnKeys.all }); - router.push(withListQs(`/instl-sncn/${docNo}`)); + queryClient.removeQueries({ queryKey: instlSncnKeys.detail(docNo) }); + await queryClient.invalidateQueries({ queryKey: instlSncnKeys.all, refetchType: "all" }); + router.replace(withListQs(`/instl-sncn/${docNo}`)); } catch (error) { console.error("보완 완료 실패:", error); alert("보완 완료 처리 중 오류가 발생했습니다."); @@ -163,8 +166,9 @@ function InstlFormPage({ mode, initialData, createDefaults }: InstlFormPageProps if (!instlSncnDocNo) return; alert("신청 완료되었습니다."); - router.push(withListQs(`/instl-sncn/${instlSncnDocNo}`)); - queryClient.invalidateQueries({ queryKey: instlSncnKeys.all }); + queryClient.removeQueries({ queryKey: instlSncnKeys.detail(instlSncnDocNo) }); + await queryClient.invalidateQueries({ queryKey: instlSncnKeys.all, refetchType: "all" }); + router.replace(withListQs(`/instl-sncn/${instlSncnDocNo}`)); } catch (error) { console.error("신청 실패:", error); alert("신청 중 오류가 발생했습니다."); @@ -239,7 +243,15 @@ function InstlFormPage({ mode, initialData, createDefaults }: InstlFormPageProps > 목록 - {!isSplmntPrgrsStts ? ( + {isSplmntPrgrsStts ? ( + + ) : isDraftStatus ? ( <> - )} + ) : null}