diff --git a/src/apis/apiPath.ts b/src/apis/apiPath.ts index 85bf99a..0d22971 100644 --- a/src/apis/apiPath.ts +++ b/src/apis/apiPath.ts @@ -14,14 +14,17 @@ export const APIPath = { getForeigner: `${BASE_URL}/visa/:userId`, registerVisa: `${BASE_URL}/visa`, registerCompany: `${BASE_URL}/company`, - apply: '/api/application/', + apply: `${BASE_URL}/application/:recruitmentId`, + resume: `${BASE_URL}/resumes`, recruitmentsDetail: '/api/recruitments/:recruitmentId', getApplicantProfile: '/api/resumes/:resumeId/:applyId', closeRecruitment: `${BASE_URL}/recruitment/hiringClose/:recruitmentId`, + requiredFieldCheck: `${BASE_URL}/application`, }; export const getDynamicAPIPath = { downloadContract: (applyId: number) => APIPath.downloadContract.replace(':applyId', applyId.toString()), + apply: (recruitmentId: number) => APIPath.apply.replace(':recruitmentId', recruitmentId.toString()), getContract: (applyId: number) => APIPath.getContract.replace(':applyId', applyId.toString()), getMyRecruitments: (companyId: number) => APIPath.getMyRecruitments.replace(':companyId', companyId.toString()), getMyApplicants: (recruitmentId: number) => diff --git a/src/apis/apply/postApply.mock.ts b/src/apis/apply/postApply.mock.ts index 59c74ae..3afc661 100644 --- a/src/apis/apply/postApply.mock.ts +++ b/src/apis/apply/postApply.mock.ts @@ -1,8 +1,8 @@ import { http, HttpResponse } from 'msw'; -import { getApply } from '../apply/useApplyHook'; +import { APIPath } from '@/apis/apiPath'; export const postApplyMockHandler = [ - http.post(`${getApply()}/:id`, async ({ request, params }) => { + http.post(`${APIPath.apply}`, async ({ request, params }) => { const { id } = params; const req = await request.json(); return HttpResponse.json({ req, id }, { status: 201 }); diff --git a/src/apis/apply/useApplyHook.tsx b/src/apis/apply/useApplyHook.tsx index 036d0d1..52a5293 100644 --- a/src/apis/apply/useApplyHook.tsx +++ b/src/apis/apply/useApplyHook.tsx @@ -1,23 +1,23 @@ -import { APIPath } from '@/apis/apiPath'; +import { getDynamicAPIPath } from '@/apis/apiPath'; import { clientInstance } from '@/apis/instance'; import { useMutation } from '@tanstack/react-query'; -// import { useNavigate } from 'react-router-dom'; +import { useNavigate } from 'react-router-dom'; -export const getApply = () => `${APIPath.registerSign}`; +export const getApply = (recruitmentId: number) => `${getDynamicAPIPath.apply(recruitmentId)}`; -export const Apply = async ({ req, recruitmentId }: { req: string; recruitmentId: string }) => { - const response = await clientInstance.post(`${getApply()}/${recruitmentId}`, req); +export const Apply = async ({ req, recruitmentId }: { req: string; recruitmentId: number }) => { + const response = await clientInstance.post(`${getApply(recruitmentId)}`, req); return response.data; }; export const FetchApply = () => { - // const nav = useNavigate(); + const nav = useNavigate(); return useMutation({ - mutationFn: ({ data, recruitmentId }: { data: string; recruitmentId: string }) => + mutationFn: ({ data, recruitmentId }: { data: string; recruitmentId: number }) => Apply({ req: data, recruitmentId }), onSuccess: () => { - // nav('/'); + nav('/'); }, }); }; diff --git a/src/apis/recruitmentsDetail/cat.jpg b/src/apis/recruitmentsDetail/mock/cat.jpg similarity index 100% rename from src/apis/recruitmentsDetail/cat.jpg rename to src/apis/recruitmentsDetail/mock/cat.jpg diff --git a/src/apis/recruitmentsDetail/recruitmentsDetailList.ts b/src/apis/recruitmentsDetail/mock/recruitmentsDetailList.ts similarity index 100% rename from src/apis/recruitmentsDetail/recruitmentsDetailList.ts rename to src/apis/recruitmentsDetail/mock/recruitmentsDetailList.ts diff --git a/src/apis/recruitmentsDetail/recruitmentsDetailMockHandler.ts b/src/apis/recruitmentsDetail/mock/recruitmentsDetailMockHandler.ts similarity index 100% rename from src/apis/recruitmentsDetail/recruitmentsDetailMockHandler.ts rename to src/apis/recruitmentsDetail/mock/recruitmentsDetailMockHandler.ts diff --git a/src/apis/recruitmentsDetail/mock/requiredFieldCheckData.ts b/src/apis/recruitmentsDetail/mock/requiredFieldCheckData.ts new file mode 100644 index 0000000..d178429 --- /dev/null +++ b/src/apis/recruitmentsDetail/mock/requiredFieldCheckData.ts @@ -0,0 +1,5 @@ +export const requiredFieldCheckData = { + resumeExistence: true, + visaExistence: true, + foreignerIdNumberExistence: true, +}; diff --git a/src/apis/recruitmentsDetail/mock/requiredFieldCheckHandler.ts b/src/apis/recruitmentsDetail/mock/requiredFieldCheckHandler.ts new file mode 100644 index 0000000..6b3813c --- /dev/null +++ b/src/apis/recruitmentsDetail/mock/requiredFieldCheckHandler.ts @@ -0,0 +1,7 @@ +import { APIPath } from '@/apis/apiPath'; +import { requiredFieldCheckData } from './requiredFieldCheckData'; +import { http, HttpResponse } from 'msw'; + +export const requiredFieldCheckMockHandler = [ + http.get(APIPath.requiredFieldCheck, () => HttpResponse.json(requiredFieldCheckData)), +]; diff --git a/src/apis/recruitmentsDetail/useRequiredFieldCheck.ts b/src/apis/recruitmentsDetail/useRequiredFieldCheck.ts new file mode 100644 index 0000000..2a4ec7a --- /dev/null +++ b/src/apis/recruitmentsDetail/useRequiredFieldCheck.ts @@ -0,0 +1,15 @@ +import { APIPath } from '@/apis/apiPath'; +import { clientInstance } from '@/apis/instance'; +import { useQuery } from '@tanstack/react-query'; +import { type RequiredFieldCheckProps } from '@/pages/recruit/RecruitType'; + +const getRequiredFieldCheck = async () => { + const res = await clientInstance.get(APIPath.requiredFieldCheck); + return res.data; +}; + +export const useGetRequiredFieldCheck = (recruitmentId: number) => + useQuery({ + queryKey: ['RequiredFieldCheckProps', recruitmentId], + queryFn: () => getRequiredFieldCheck(), + }); diff --git a/src/apis/registerSign/useRegisterSign.ts b/src/apis/registerSign/useRegisterSign.ts index 778806a..193ca0f 100644 --- a/src/apis/registerSign/useRegisterSign.ts +++ b/src/apis/registerSign/useRegisterSign.ts @@ -1,7 +1,7 @@ import { APIPath } from '@/apis/apiPath'; import { clientInstance } from '@/apis/instance'; import { useMutation } from '@tanstack/react-query'; -// import { useNavigate } from 'react-router-dom'; +import { useNavigate } from 'react-router-dom'; export const getRegisterSign = () => `${APIPath.registerSign}`; @@ -14,14 +14,19 @@ export const RegisterSign = async (req: FormData) => { return response.data; }; -export const FetchRegisterSign = () => { - // const nav = useNavigate(); +export const FetchRegisterSign = (userType: string) => { + const nav = useNavigate(); return useMutation({ mutationFn: (req: FormData) => RegisterSign(req), onSuccess: () => { - // 고용주, 근로자 구분 리다이렉트 추후 구현 - // nav('/'); + if (userType === 'employer') { + nav('/employer-my-page'); + } else if (userType === 'employee') { + nav('/employee-my-page'); + } else { + alert('오류'); + } }, }); }; diff --git a/src/apis/resume/postResume.mock.ts b/src/apis/resume/postResume.mock.ts new file mode 100644 index 0000000..aba8b23 --- /dev/null +++ b/src/apis/resume/postResume.mock.ts @@ -0,0 +1,9 @@ +import { http, HttpResponse } from 'msw'; +import { APIPath } from '@/apis/apiPath'; + +export const postResumeMockHandler = [ + http.post(`${APIPath.resume}`, async ({ request }) => { + const req = await request.json(); + return HttpResponse.json({ req }, { status: 201 }); + }), +]; diff --git a/src/apis/resume/useResumeHook.tsx b/src/apis/resume/useResumeHook.tsx new file mode 100644 index 0000000..3692fb5 --- /dev/null +++ b/src/apis/resume/useResumeHook.tsx @@ -0,0 +1,22 @@ +import { APIPath } from '@/apis/apiPath'; +import { clientInstance } from '@/apis/instance'; +import { useMutation } from '@tanstack/react-query'; +import { useNavigate } from 'react-router-dom'; + +export const getResumePath = () => `${APIPath.resume}`; + +export const Resume = async ({ req }: { req: string }) => { + const response = await clientInstance.post(`${getResumePath()}`, req); + return response.data; +}; + +export const FetchResume = () => { + const nav = useNavigate(); + + return useMutation({ + mutationFn: ({ data }: { data: string }) => Resume({ req: data }), + onSuccess: () => { + nav('/employee-my-page'); + }, + }); +}; diff --git a/src/assets/translator/Recruit/recruitData.ts b/src/assets/translator/Recruit/recruitData.ts index 4967378..92fade7 100644 --- a/src/assets/translator/Recruit/recruitData.ts +++ b/src/assets/translator/Recruit/recruitData.ts @@ -17,6 +17,15 @@ export const recruitData = { detailedDescription: '상세설명', mainResponsibilities: '주요업무', PreferredRequirements: '우대사항', + Modal: { + resumeExistence: '이력서', + visaExistence: '비자 발급 일자', + foreignerIdNumberExistence: '외국인 번호', + close: '닫기', + alert: '미등록!', + ment: '필수 정보를 등록해야 지원서를 작성할 수 있어요', + myPage: '마이페이지', + }, }, [Languages.VE]: { recruit: 'Ứng tuyển', @@ -34,5 +43,14 @@ export const recruitData = { detailedDescription: 'Mô tả chi tiết', mainResponsibilities: 'Nhiệm vụ chính', PreferredRequirements: 'Yêu cầu ưu tiên', + Modal: { + resumeExistence: 'Sơ yếu lý lịch', + visaExistence: 'Ngày cấp visa', + foreignerIdNumberExistence: 'Số đăng ký người nước ngoài', + close: 'Đóng', + alert: 'Chưa đăng ký!', + ment: 'Bạn cần đăng ký thông tin bắt buộc để có thể tạo hồ sơ ứng tuyển', + myPage: 'Trang của tôi', + }, }, }; diff --git a/src/assets/translator/Resume/resumeData.ts b/src/assets/translator/Resume/resumeData.ts index 50574b7..441da00 100644 --- a/src/assets/translator/Resume/resumeData.ts +++ b/src/assets/translator/Resume/resumeData.ts @@ -21,7 +21,7 @@ export const resumeData = { introduction: '자기소개를 입력하세요.', koreanLevel: '한국어 실력을 선택해주세요!', }, - error: '을(를) 입력해주세요!', + errors: '을(를) 입력해주세요!', submit: '제출하기', btnSubmit: '정말 제출하시겠습니까?', }, @@ -45,7 +45,7 @@ export const resumeData = { introduction: 'Vui lòng nhập giới thiệu bản thân.', koreanLevel: 'Vui lòng chọn trình độ tiếng Hàn!', }, - error: 'Vui lòng nhập ', + errors: 'Vui lòng nhập ', submit: 'Nộp', btnSubmit: 'Bạn có chắc muốn nộp không?', }, diff --git a/src/mocks/handlers.ts b/src/mocks/handlers.ts index 71b87f8..036ef2e 100644 --- a/src/mocks/handlers.ts +++ b/src/mocks/handlers.ts @@ -9,11 +9,13 @@ import { myApplicantsMockHandler } from '@/apis/applicants/mocks/myApplicantsMoc import { foreignerMockHandler } from '@/apis/applicants/mocks/foreignerMockHandler'; import { visaMockHandler } from '@/apis/applicants/mocks/visaMockHandler'; import { postApplyMockHandler } from '@apis/apply/postApply.mock'; -import { recruitmentsDetailMockHandler } from '@apis/recruitmentsDetail/recruitmentsDetailMockHandler'; -import { registerCompanyMockHandler } from '@/apis/registerCompany/mocks/registerCompany.mock'; +import { recruitmentsDetailMockHandler } from '@/apis/recruitmentsDetail/mock/recruitmentsDetailMockHandler'; +import { registerCompanyMockHandler } from '@/apis/registerCompany/registerCompany.mock'; import { contractsMockHandler } from '@/apis/contract/mock/contract.mock'; import { getProfileInfoHandler } from '@/apis/applicants/mocks/getApplicantProfile'; import { closeRecruitmentMockHandler } from '@/apis/recruitments/mocks/closeRecruitmentMockHandler'; +import { requiredFieldCheckMockHandler } from '@/apis/recruitmentsDetail/mock/requiredFieldCheckHandler'; +import { postResumeMockHandler } from '@/apis/resume/postResume.mock'; export const handlers = [ ...recruitmentsMockHandler, @@ -32,4 +34,6 @@ export const handlers = [ ...contractsMockHandler, ...getProfileInfoHandler, ...closeRecruitmentMockHandler, + ...requiredFieldCheckMockHandler, + ...postResumeMockHandler, ]; diff --git a/src/pages/apply/applyguide/ApplyGuide.tsx b/src/pages/apply/applyguide/ApplyGuide.tsx index 4b25103..0e327ce 100644 --- a/src/pages/apply/applyguide/ApplyGuide.tsx +++ b/src/pages/apply/applyguide/ApplyGuide.tsx @@ -2,7 +2,7 @@ import Layout from '@/features/layout'; import styled from '@emotion/styled'; import { Typo, Button } from '@/components/common'; import { ReactNode } from 'react'; -import { useNavigate } from 'react-router-dom'; +import { useNavigate, useParams } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; const IndentText = ({ children }: { children: ReactNode }) => {children}; @@ -15,9 +15,9 @@ const SpacingText = ({ children, bold }: { children: ReactNode; bold?: boolean } export default function ApplyGuide() { const nav = useNavigate(); - + const { recruitmentId } = useParams(); const navigateToApply = () => { - nav('/apply'); + nav(`/apply/${recruitmentId}`); }; const { t } = useTranslation(); diff --git a/src/pages/apply/applypage/ApplyInput.tsx b/src/pages/apply/applypage/ApplyInput.tsx index 0d250d2..ae36b4c 100644 --- a/src/pages/apply/applypage/ApplyInput.tsx +++ b/src/pages/apply/applypage/ApplyInput.tsx @@ -2,6 +2,7 @@ import { Flex, Typo } from '@/components/common'; import { Path, UseFormRegister, FieldErrors } from 'react-hook-form'; import styled from '@emotion/styled'; import type { ApplyInfoProps } from './useApplyHook'; +import { useTranslation } from 'react-i18next'; type InputProps = { title: string; @@ -14,16 +15,20 @@ type InputProps = { patternMessage?: string; }; -const ApplyInput = ({ title, label, register, required, errors, placeholder, pattern, patternMessage }: InputProps) => ( - - - {title} - - - {errors[label]?.type === 'required' && {title}을(를) 입력해주세요!} - {errors[label]?.type === 'pattern' && {patternMessage}} - -); +const ApplyInput = ({ title, label, register, required, errors, placeholder, pattern, patternMessage }: InputProps) => { + const { t } = useTranslation(); + + return ( + + + {title} + + + {errors[label]?.type === 'required' && {`${title}${t('apply.errors')}`}} + {errors[label]?.type === 'pattern' && {patternMessage}} + + ); +}; const StyledInput = styled.input` width: 100%; diff --git a/src/pages/apply/applypage/ApplyPage.tsx b/src/pages/apply/applypage/ApplyPage.tsx index 63760db..f13c692 100644 --- a/src/pages/apply/applypage/ApplyPage.tsx +++ b/src/pages/apply/applypage/ApplyPage.tsx @@ -4,10 +4,12 @@ import { Flex, Typo, Button, Modal } from '@/components/common'; import { useApplyHook } from './useApplyHook'; import ApplyInput from './ApplyInput'; import { useTranslation } from 'react-i18next'; +import { useParams } from 'react-router-dom'; export default function ApplyPage() { const { toggle, isToggle, register, handleSubmit, onSubmit, handleApplySubmit, errors } = useApplyHook(); const { t } = useTranslation(); + const { recruitmentId } = useParams(); return ( @@ -53,10 +55,12 @@ export default function ApplyPage() { {t('apply.submit')} - {isToggle && ( + {isToggle && recruitmentId && ( {t('apply.submitMent')}} - buttonChildren={{t('apply.submit')}} + buttonChildren={ + handleApplySubmit(Number(recruitmentId))}>{t('apply.submit')} + } onClose={toggle} /> )} diff --git a/src/pages/apply/applypage/useApplyHook.tsx b/src/pages/apply/applypage/useApplyHook.tsx index 0d5a2f8..4f7e735 100644 --- a/src/pages/apply/applypage/useApplyHook.tsx +++ b/src/pages/apply/applypage/useApplyHook.tsx @@ -25,11 +25,10 @@ export function useApplyHook() { toggle(); }; - const handleApplySubmit = () => { + const handleApplySubmit = (recruitmentId: number) => { if (formData) { const data = JSON.stringify(formData); - mutation.mutate({ data, recruitmentId: '1' }); - alert('지원 완료!'); + mutation.mutate({ data, recruitmentId }); toggle(); } }; diff --git a/src/pages/recruit/RecruitCard.tsx b/src/pages/recruit/RecruitCard.tsx index 70e123e..61b8e1d 100644 --- a/src/pages/recruit/RecruitCard.tsx +++ b/src/pages/recruit/RecruitCard.tsx @@ -1,11 +1,66 @@ -import { Button } from '@/components/common'; -import { Icon } from '@components/common'; +import { Button, Flex, Icon, Modal, Typo } from '@/components/common'; import styled from '@emotion/styled'; -import type { RecruitCardProps } from './RecruitType'; +import type { RecruitCardProps, RequiredFieldCheckProps } from './RecruitType'; import { useTranslation } from 'react-i18next'; +import useToggle from '@/hooks/useToggle'; +import { useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { userLocalStorage } from '@/utils/storage'; -export default function RecruitCard({ koreanTitle, companyScale, area, requestedCareer, imageUrl }: RecruitCardProps) { +export default function RecruitCard({ + koreanTitle, + companyScale, + area, + requestedCareer, + imageUrl, + requiredFieldCheck, + recruitmentId, +}: RecruitCardProps) { const { t } = useTranslation(); + const [isToggle, toggle] = useToggle(); + const [falseValues, setFalseValues] = useState([]); + const nav = useNavigate(); + const userType = userLocalStorage.getUser()?.type || ''; + const checkHandler = (value: RequiredFieldCheckProps | undefined) => { + if (!value) return; + if (userType === 'employer') { + alert('고용주 계정으로는 지원할 수 없습니다.'); + return; + } + const falseValues = Object.keys(value).filter((key) => !value[key as keyof RequiredFieldCheckProps]); + setFalseValues(falseValues); + if (falseValues.length === 0) { + nav(`/applyguide/${recruitmentId}`); + } else { + toggle(); + } + }; + + const ModalText = (text: string[]) => { + const value = { + resumeExistence: t('recruit.Modal.resumeExistence'), + visaExistence: t('recruit.Modal.visaExistence'), + foreignerIdNumberExistence: t('recruit.Modal.foreignerIdNumberExistence'), + }; + const newFalseValues = text.map((tex) => value[tex as keyof typeof value]); + + return ( + + + {newFalseValues.map((val) => ( + +

{val}

+
+ ))} +
+ +

{t('recruit.Modal.alert')}

+
+ {t('recruit.Modal.ment')} +
+ ); + }; + return ( @@ -15,7 +70,14 @@ export default function RecruitCard({ koreanTitle, companyScale, area, requested

{`${companyScale} | ${area} | ${requestedCareer}`}

- {t('recruit.recruit')} + { + checkHandler(requiredFieldCheck); + }} + > + {t('recruit.recruit')} +
@@ -23,6 +85,22 @@ export default function RecruitCard({ koreanTitle, companyScale, area, requested + {isToggle && ( + + + {t('recruit.Modal.close')} + + nav('/employee-my-page')}> + {t('recruit.Modal.myPage')} + + + } + onClose={toggle} + /> + )} ); } @@ -100,7 +178,7 @@ const CustomBtn = styled(Button)<{ background?: string; color?: string; width?: background: ${(props) => props.background || ''}; color: ${(props) => props.color || 'white'}; width: ${(props) => props.width || '190px'}; - height: 56px; + height: 50px; border-radius: 4px; display: flex; &:hover { diff --git a/src/pages/recruit/RecruitType.ts b/src/pages/recruit/RecruitType.ts index 62c678d..210e32a 100644 --- a/src/pages/recruit/RecruitType.ts +++ b/src/pages/recruit/RecruitType.ts @@ -7,6 +7,8 @@ export interface RecruitCardProps { area: string; requestedCareer: string; imageUrl: string; + recruitmentId: string; + requiredFieldCheck?: RequiredFieldCheckProps; } interface Item { @@ -36,3 +38,9 @@ export interface SectionProps { title: string; children: ReactNode; } + +export interface RequiredFieldCheckProps { + resumeExistence: boolean; + visaExistence: boolean; + foreignerIdNumberExistence: boolean; +} diff --git a/src/pages/recruit/index.tsx b/src/pages/recruit/index.tsx index c50cb12..f1bfaa1 100644 --- a/src/pages/recruit/index.tsx +++ b/src/pages/recruit/index.tsx @@ -5,11 +5,13 @@ import Layout from '@/features/layout'; import { useParams } from 'react-router-dom'; import { Spinner } from '@/components/common'; import { useGetRecruitmentsDetail } from '@/apis/recruitmentsDetail/useRecruitmentsDetail'; +import { useGetRequiredFieldCheck } from '@/apis/recruitmentsDetail/useRequiredFieldCheck'; export default function Recruit() { const { recruitmentId = '1' } = useParams(); const { data, isLoading } = useGetRecruitmentsDetail(Number(recruitmentId)); + const { data: requiredFieldCheck } = useGetRequiredFieldCheck(Number(recruitmentId)); if (isLoading || !data) { return ; @@ -18,7 +20,7 @@ export default function Recruit() { return ( - + diff --git a/src/pages/registerSign/RegisterSign.tsx b/src/pages/registerSign/RegisterSign.tsx index aa41f74..52b786d 100644 --- a/src/pages/registerSign/RegisterSign.tsx +++ b/src/pages/registerSign/RegisterSign.tsx @@ -7,14 +7,16 @@ import Layout from '@/features/layout'; import { Flex, Button } from '@/components/common'; import { FetchRegisterSign } from '@/apis/registerSign/useRegisterSign'; import { useTranslation } from 'react-i18next'; +import { userLocalStorage } from '@/utils/storage'; export default function RegisterSign() { + const userType = userLocalStorage.getUser()?.type || ''; const signCanvas = useRef(null); const { t } = useTranslation(); const clear = () => { signCanvas.current?.clear(); }; - const mutation = FetchRegisterSign(); + const mutation = FetchRegisterSign(userType); const convertDataUrlToFile = () => { const dataURL = signCanvas.current?.toDataURL('image/png'); diff --git a/src/pages/resume/Resume.tsx b/src/pages/resume/Resume.tsx index 063d15b..4d271ea 100644 --- a/src/pages/resume/Resume.tsx +++ b/src/pages/resume/Resume.tsx @@ -6,7 +6,7 @@ import { useForm, SubmitHandler } from 'react-hook-form'; import { type ResumeInfo } from './ResumeType'; import useToggle from '@/hooks/useToggle'; import { useState } from 'react'; - +import { FetchResume } from '@/apis/resume/useResumeHook'; import { useTranslation } from 'react-i18next'; export default function Resume() { @@ -19,7 +19,7 @@ export default function Resume() { } = useForm(); const [isToggle, toggle] = useToggle(); const [formData, setFormData] = useState(null); - + const mutation = FetchResume(); const onSubmit: SubmitHandler = (data) => { setFormData(data); toggle(); @@ -27,8 +27,9 @@ export default function Resume() { const handleResumeSubmit = () => { if (formData) { - console.log(formData); - alert('제출 완료!'); + const data = JSON.stringify(formData); + mutation.mutate({ data }); + toggle(); } }; diff --git a/src/routes/path.ts b/src/routes/path.ts index 360f7ee..edcb1af 100644 --- a/src/routes/path.ts +++ b/src/routes/path.ts @@ -5,8 +5,8 @@ export const AUTH = { } as const; export const APPLY = { - GUIDE: '/applyguide', - APPLYPAGE: '/apply', + GUIDE: '/applyguide/:recruitmentId', + APPLYPAGE: '/apply/:recruitmentId', }; export const MY_PAGE = {