From b5487487f04e3b1fa1c039eeaca052d4d60c381f Mon Sep 17 00:00:00 2001 From: naarang Date: Wed, 22 Jan 2025 05:26:53 +0000 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20=EC=9C=A0=ED=95=99=EC=83=9D?= =?UTF-8?q?=20=EB=AC=B8=EC=84=9C=20=EC=BB=A8=ED=8E=8C,=20=EC=B5=9C?= =?UTF-8?q?=EC=A2=85=20=EC=83=9D=EC=84=B1=20=EC=8B=9C=20=EB=A1=9C=EB=94=A9?= =?UTF-8?q?=20ui=20=EC=A0=81=EC=9A=A9=20#127?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Document/DocumentCard.tsx | 20 ++++++- src/components/Document/DocumentCardList.tsx | 55 +++++++++++------- src/components/Information/StepIndicator.tsx | 13 ++--- .../PartTimePermitWriteForm.tsx | 9 ++- src/hooks/api/useDocument.ts | 20 ++++--- src/utils/document.ts | 56 +++++++++++++++++-- 6 files changed, 126 insertions(+), 47 deletions(-) diff --git a/src/components/Document/DocumentCard.tsx b/src/components/Document/DocumentCard.tsx index 08111ef4..fd0f5882 100644 --- a/src/components/Document/DocumentCard.tsx +++ b/src/components/Document/DocumentCard.tsx @@ -27,6 +27,7 @@ type DocumentCardProps = { title: string; type: string; onNext?: () => void; + setIsLoading: (value: boolean) => void; }; const TemporarySaveCard = ({ @@ -331,9 +332,24 @@ const DocumentCardDispenser = ({ documentInfo, title, type, + setIsLoading, }: DocumentCardProps) => { - const { mutate: submitDocument } = usePatchStatusSubmission(); - const { mutate: confirmDocument } = usePatchDocumentsStatusConfirmation(); + const { mutate: submitDocument } = usePatchStatusSubmission({ + onMutate: () => { + setIsLoading(true); + }, + onSettled: () => { + setIsLoading(false); + }, + }); + const { mutate: confirmDocument } = usePatchDocumentsStatusConfirmation({ + onMutate: () => { + setIsLoading(true); + }, + onSettled: () => { + setIsLoading(false); + }, + }); const navigate = useNavigate(); const { updateCurrentDocumentId } = useCurrentDocumentIdStore(); const handleDownload = (url: string) => { diff --git a/src/components/Document/DocumentCardList.tsx b/src/components/Document/DocumentCardList.tsx index d7523125..d82f7b54 100644 --- a/src/components/Document/DocumentCardList.tsx +++ b/src/components/Document/DocumentCardList.tsx @@ -6,6 +6,8 @@ import { usePatchDocumentsStatusConfirmation, usePatchStatusSubmission, } from '@/hooks/api/useDocument'; +import { useState } from 'react'; +import LoadingItem from '../Common/LoadingItem'; const DocumentCardList = ({ documents, @@ -13,6 +15,7 @@ const DocumentCardList = ({ documents: DocumentsSummaryResponse; }) => { const documentTypes = Object.values(DocumentType); + const [isLoading, setIsLoading] = useState(false); // patch api mutate 설정 (8.15 유학생이 서류 제출하기) const { mutate: patchStatusSubmission } = usePatchStatusSubmission(); @@ -31,27 +34,39 @@ const DocumentCardList = ({ }; return ( -
- {documentTypes.map((property, index) => - documents[property] ? ( - { - const document = documents[property]; - if (document && document.status) { - handleOnNext(document.id, document.status); - } - }} - /> - ) : ( - - ), + <> + {isLoading && ( +
e.preventDefault()} + > + +
)} -
+
+ {documentTypes.map((property, index) => + documents[property] ? ( + { + const document = documents[property]; + if (document && document.status) { + handleOnNext(document.id, document.status); + } + }} + setIsLoading={(value: boolean) => setIsLoading(value)} + /> + ) : ( + + ), + )} +
+ ); }; diff --git a/src/components/Information/StepIndicator.tsx b/src/components/Information/StepIndicator.tsx index b9756cfa..0a13008b 100644 --- a/src/components/Information/StepIndicator.tsx +++ b/src/components/Information/StepIndicator.tsx @@ -14,24 +14,20 @@ const StepIndicator = ({ length = 3, currentStep = 1, mainColor = '#FEF387', - backgroundColor = '#F4F4F9', + backgroundColor = '#FFFFFF', borderColor = '#F4F4F9', - textColor = '#ffffff', + textColor = '#222', + inactiveTextColor = '#BDBDBD', }: StepIndicatorProps) => { const steps = Array.from({ length }, (_, i) => i + 1); return ( -
+
{steps.map((step, index) => ( {/* Step Circle */}
= step ? mainColor : backgroundColor, border: currentStep >= step ? 'none' : `1px solid ${borderColor}`, + color: currentStep >= step ? textColor : inactiveTextColor, }} > {step} diff --git a/src/components/WriteDocuments/PartTimePermitWriteForm.tsx b/src/components/WriteDocuments/PartTimePermitWriteForm.tsx index f3d8fa27..ee697156 100644 --- a/src/components/WriteDocuments/PartTimePermitWriteForm.tsx +++ b/src/components/WriteDocuments/PartTimePermitWriteForm.tsx @@ -12,7 +12,7 @@ import { phone } from '@/constants/information'; import EmployerInfoSection from '@/components/Document/write/EmployerInfoSection'; import BottomButtonPanel from '@/components/Common/BottomButtonPanel'; import Button from '@/components/Common/Button'; -import { isNotEmpty } from '@/utils/document'; +import { validatePartTimePermit } from '@/utils/document'; import { formatPhoneNumber, parsePhoneNumber } from '@/utils/information'; import { usePostPartTimeEmployPermit, @@ -265,8 +265,11 @@ const PartTimePermitWriteForm = ({
- {/* 입력된 정보 중 빈 칸이 없다면 활성화 */} - {isNotEmpty(newDocumentData) && isNotEmpty(phoneNum) ? ( + {/* 입력된 정보의 유효성 검사 통과 시 활성화 */} + {validatePartTimePermit({ + ...newDocumentData, + phone_number: formatPhoneNumber(phoneNum), + }) ? (