diff --git a/src/components/common/header/Header.tsx b/src/components/common/header/Header.tsx index b48e1611..e5f71ad9 100644 --- a/src/components/common/header/Header.tsx +++ b/src/components/common/header/Header.tsx @@ -5,8 +5,6 @@ import DropDown from '../dropDown/DropDown'; import Avatar from '../avatar/Avatar'; import { useAuth } from '../../../hooks/useAuth'; import useAuthStore from '../../../store/authStore'; -import { ROUTES } from '../../../constants/routes'; -import { useMyProfileInfo } from '../../../hooks/useMyInfo'; import DefaultImg from '../../../assets/defaultImg.png'; import { UserCircleIcon } from '@heroicons/react/24/outline'; import loadingImg from '../../../assets/loadingImg.svg'; @@ -19,6 +17,8 @@ import bellLogined from '../../../assets/bellLogined.svg'; import useNotification from '../../../hooks/useNotification'; import { useEffect } from 'react'; import { testLiveAlarm } from '../../../api/alarm.api'; +import { useMyProfileInfo } from '../../../hooks/user/useMyInfo'; +import { ROUTES } from '../../../constants/user/routes'; function Header() { const location = useLocation(); diff --git a/src/components/common/header/Notification/Notification.tsx b/src/components/common/header/Notification/Notification.tsx index 92da2ec5..9b74bc80 100644 --- a/src/components/common/header/Notification/Notification.tsx +++ b/src/components/common/header/Notification/Notification.tsx @@ -1,8 +1,8 @@ import React from 'react'; import * as S from './Notification.styled'; import NotificationItem from './NotificationItem/NotificationItem'; -import useAlarmList from '../../../../hooks/useAlarmList'; import LoadingSpinner from '../../loadingSpinner/LoadingSpinner'; +import useAlarmList from '../../../../hooks/user/useAlarmList'; const Notification = () => { const { alarmListData: AlarmData, isLoading, isFetching } = useAlarmList(); diff --git a/src/components/user/applyComponents/careersComponent/CareersComponent.styled.ts b/src/components/user/applyComponents/careersComponent/CareersComponent.styled.ts index d7aeb55f..a2bf796d 100644 --- a/src/components/user/applyComponents/careersComponent/CareersComponent.styled.ts +++ b/src/components/user/applyComponents/careersComponent/CareersComponent.styled.ts @@ -19,6 +19,8 @@ export const CareerContainer = styled.div` export const AddButton = styled(Button)` width: 50px; + height: 30px; + font-size: 13px; padding: 10px; cursor: pointer; border: 1px solid ${({ theme }) => theme.color.border}; diff --git a/src/components/user/applyComponents/careersComponent/CareersComponent.tsx b/src/components/user/applyComponents/careersComponent/CareersComponent.tsx index c8a47e47..4e9fb634 100644 --- a/src/components/user/applyComponents/careersComponent/CareersComponent.tsx +++ b/src/components/user/applyComponents/careersComponent/CareersComponent.tsx @@ -1,8 +1,8 @@ import { Control, useFieldArray } from 'react-hook-form'; -import { ApplySchemeType } from '../../../pages/apply/Apply'; import * as S from './CareersComponent.styled'; import CareerInput from './careersInputComponent/CareersComponentInput'; import { CAREER_INPUT } from '../../../constants/projectConstants'; +import { ApplySchemeType } from '../../../models/joinProject'; interface CareersComponentProps { control: Control; diff --git a/src/components/user/applyComponents/phoneComponent/PhoneComponent.tsx b/src/components/user/applyComponents/phoneComponent/PhoneComponent.tsx index adaee0ab..bdddc0ca 100644 --- a/src/components/user/applyComponents/phoneComponent/PhoneComponent.tsx +++ b/src/components/user/applyComponents/phoneComponent/PhoneComponent.tsx @@ -1,7 +1,7 @@ import * as S from './PhoneComponent.styled'; -import { ApplySchemeType } from '../../../pages/apply/Apply'; import { Control, FieldErrors } from 'react-hook-form'; import PhoneInput from './phoneComponentInput/PhoneComponentInput'; +import { ApplySchemeType } from '../../../models/joinProject'; interface PhoneComponentProps { control: Control; diff --git a/src/components/user/mypage/activityLog/ActivityLog.tsx b/src/components/user/mypage/activityLog/ActivityLog.tsx index a601ee58..7a80902e 100644 --- a/src/components/user/mypage/activityLog/ActivityLog.tsx +++ b/src/components/user/mypage/activityLog/ActivityLog.tsx @@ -1,4 +1,4 @@ -import { ACTIVITY_FILTER } from '../../../constants/myPageFilter'; +import { ACTIVITY_FILTER } from '../../../../constants/user/myPageFilter'; import ContentTab from '../ContentTab'; export default function ActivityLog() { diff --git a/src/components/user/mypage/activityLog/commentsActivity/CommentsActivity.tsx b/src/components/user/mypage/activityLog/commentsActivity/CommentsActivity.tsx index 58405def..d935e8e5 100644 --- a/src/components/user/mypage/activityLog/commentsActivity/CommentsActivity.tsx +++ b/src/components/user/mypage/activityLog/commentsActivity/CommentsActivity.tsx @@ -1,9 +1,9 @@ import { Fragment } from 'react/jsx-runtime'; -import { useGetMyComments } from '../../../../hooks/useGetMyComments'; -import NoContent from '../../../common/noContent/NoContent'; import Spinner from '../../Spinner'; import CommentActivity from './commentActivity/CommentActivity'; import * as S from './CommentsActivity.styled'; +import NoContent from '../../../../common/noContent/NoContent'; +import { useGetMyComments } from '../../../../../hooks/user/useGetMyComments'; export default function CommentsActivity() { const { myCommentsData, isLoading } = useGetMyComments(); diff --git a/src/components/user/mypage/activityLog/commentsActivity/commentActivity/CommentActivity.tsx b/src/components/user/mypage/activityLog/commentsActivity/commentActivity/CommentActivity.tsx index add3c693..93125d7c 100644 --- a/src/components/user/mypage/activityLog/commentsActivity/commentActivity/CommentActivity.tsx +++ b/src/components/user/mypage/activityLog/commentsActivity/commentActivity/CommentActivity.tsx @@ -1,7 +1,7 @@ import { Link } from 'react-router-dom'; -import type { MyComments } from '../../../../../models/activityLog'; import * as S from './CommentActivity.styled'; -import { formatDate } from '../../../../../util/formatDate'; +import { formatDate } from '../../../../../../util/formatDate'; +import { MyComments } from '../../../../../../models/activityLog'; interface CommentActivityProps { list: MyComments; diff --git a/src/components/user/mypage/activityLog/inquiries/Inquiries.tsx b/src/components/user/mypage/activityLog/inquiries/Inquiries.tsx index 14d3b0d7..046e1a36 100644 --- a/src/components/user/mypage/activityLog/inquiries/Inquiries.tsx +++ b/src/components/user/mypage/activityLog/inquiries/Inquiries.tsx @@ -1,6 +1,6 @@ -import { useGetMyInquiries } from '../../../../hooks/useGetMyInquiries'; -import ContentBorder from '../../../common/contentBorder/ContentBorder'; -import NoContent from '../../../common/noContent/NoContent'; +import { useGetMyInquiries } from '../../../../../hooks/user/useGetMyInquiries'; +import ContentBorder from '../../../../common/contentBorder/ContentBorder'; +import NoContent from '../../../../common/noContent/NoContent'; import Spinner from '../../Spinner'; import * as S from './Inquiries.styled'; import Inquiry from './inquiry/Inquiry'; diff --git a/src/components/user/mypage/joinedProject/MyJoinProjects.tsx b/src/components/user/mypage/joinedProject/MyJoinProjects.tsx index 089da270..a7d2bdc2 100644 --- a/src/components/user/mypage/joinedProject/MyJoinProjects.tsx +++ b/src/components/user/mypage/joinedProject/MyJoinProjects.tsx @@ -1,11 +1,11 @@ import { Link } from 'react-router-dom'; -import { useMyJoinedProjectList } from '../../../hooks/useMyInfo'; import * as S from './MyJoinProjects.styled'; import Project from './Project'; -import { ROUTES } from '../../../constants/routes'; -import NoContent from '../../common/noContent/NoContent'; import Spinner from '../Spinner'; import ScrollWrapper from '../ScrollWrapper'; +import { useMyJoinedProjectList } from '../../../../hooks/user/useMyInfo'; +import { ROUTES } from '../../../../constants/user/routes'; +import NoContent from '../../../common/noContent/NoContent'; const MyJoinProjects = () => { const { myJoinedProjectListData, isLoading } = useMyJoinedProjectList(); diff --git a/src/components/user/mypage/joinedProject/Project.tsx b/src/components/user/mypage/joinedProject/Project.tsx index 336a7e22..920c8fa9 100644 --- a/src/components/user/mypage/joinedProject/Project.tsx +++ b/src/components/user/mypage/joinedProject/Project.tsx @@ -1,7 +1,7 @@ -import type { JoinedProject } from '../../../models/userProject'; import * as S from './Project.styled'; import BeginnerIcon from '../../../assets/beginner.svg'; import { EllipsisHorizontalIcon } from '@heroicons/react/24/outline'; +import { JoinedProject } from '../../../../models/userProject'; interface ProjectProps { project: JoinedProject; diff --git a/src/components/user/mypage/myProfile/MyProfile.tsx b/src/components/user/mypage/myProfile/MyProfile.tsx index 08fbe80d..0178e634 100644 --- a/src/components/user/mypage/myProfile/MyProfile.tsx +++ b/src/components/user/mypage/myProfile/MyProfile.tsx @@ -1,14 +1,14 @@ import * as S from './MyProfile.styled'; import Spinner from '../Spinner'; -import { useMyProfileInfo } from '../../../hooks/useMyInfo'; import NoMyInfo from './NoMyInfo'; -import Modal from '../../common/modal/Modal'; -import { useModal } from '../../../hooks/useModal'; import { Outlet, useLocation } from 'react-router-dom'; -import { ROUTES } from '../../../constants/routes'; import { PencilIcon } from '@heroicons/react/24/outline'; import { useRef } from 'react'; import ScrollWrapper from '../ScrollWrapper'; +import { useModal } from '../../../../hooks/useModal'; +import { useMyProfileInfo } from '../../../../hooks/user/useMyInfo'; +import { ROUTES } from '../../../../constants/user/routes'; +import Modal from '../../../common/modal/Modal'; const MyProfile = () => { const { myData, isLoading } = useMyProfileInfo(); diff --git a/src/components/user/mypage/myProfile/editProfile/EditProfile.tsx b/src/components/user/mypage/myProfile/editProfile/EditProfile.tsx index cefdd9c9..0926bc72 100644 --- a/src/components/user/mypage/myProfile/editProfile/EditProfile.tsx +++ b/src/components/user/mypage/myProfile/editProfile/EditProfile.tsx @@ -1,21 +1,21 @@ import * as S from './editProfile.styled'; -import Button from '../../../common/Button/Button'; import OptionBox from './../OptionBox'; import { Controller, useFieldArray, useForm } from 'react-hook-form'; -import { useEditMyProfileInfo } from '../../../../hooks/useMyInfo'; -import { useSearchFilteringSkillTag } from '../../../../hooks/useSearchFilteringSkillTag'; import { useEffect, useState } from 'react'; import { zodResolver } from '@hookform/resolvers/zod'; import TextareaAutosize from 'react-textarea-autosize'; -import useNickNameVerification from '../../../../hooks/useNicknameVerification'; import InputText from '../../../auth/InputText'; -import { ERROR_MESSAGES } from '../../../../constants/authConstants'; import { z } from 'zod'; import { SquaresPlusIcon, XMarkIcon } from '@heroicons/react/24/outline'; import { useNavigate, useOutletContext } from 'react-router-dom'; -import { ROUTES } from '../../../../constants/routes'; -import { UserInfo } from '../../../../models/userInfo'; import MyProfileWrapper from '../MyProfileWrapper'; +import { UserInfo } from '../../../../../models/userInfo'; +import { useSearchFilteringSkillTag } from '../../../../../hooks/user/useSearchFilteringSkillTag'; +import { useEditMyProfileInfo } from '../../../../../hooks/user/useMyInfo'; +import useNickNameVerification from '../../../../../hooks/user/useNicknameVerification'; +import { ROUTES } from '../../../../../constants/user/routes'; +import Button from '../../../../common/Button/Button'; +import { ERROR_MESSAGES } from '../../../../../constants/user/authConstants'; type ProfileFormData = z.infer; diff --git a/src/components/user/mypage/myProfile/profile/Profile.tsx b/src/components/user/mypage/myProfile/profile/Profile.tsx index 9c00dcd2..27e74e4e 100644 --- a/src/components/user/mypage/myProfile/profile/Profile.tsx +++ b/src/components/user/mypage/myProfile/profile/Profile.tsx @@ -3,12 +3,12 @@ import BeginnerIcon from '../../../../assets/beginner.svg'; import 'chart.js/auto'; import { ChartOptions } from 'chart.js'; import { Link, useOutletContext } from 'react-router-dom'; -import { ROUTES } from '../../../../constants/routes'; import { Radar } from 'react-chartjs-2'; -import { UserInfo } from '../../../../models/userInfo'; import { useEffect } from 'react'; import MyProfileWrapper from '../MyProfileWrapper'; -import { PROFILE_DEFAULT_MESSAGE } from '../../../../constants/myPageProfile'; +import { UserInfo } from '../../../../../models/userInfo'; +import { PROFILE_DEFAULT_MESSAGE } from '../../../../../constants/user/myPageProfile'; +import { ROUTES } from '../../../../../constants/user/routes'; export default function Profile() { const { diff --git a/src/components/user/mypage/notifications/Notifications.tsx b/src/components/user/mypage/notifications/Notifications.tsx index dd0ed37d..eee978eb 100644 --- a/src/components/user/mypage/notifications/Notifications.tsx +++ b/src/components/user/mypage/notifications/Notifications.tsx @@ -1,4 +1,4 @@ -import { NOTIFICATION_FILTER } from '../../../constants/myPageFilter'; +import { NOTIFICATION_FILTER } from '../../../../constants/user/myPageFilter'; import ContentTab from '../ContentTab'; export default function Notifications() { diff --git a/src/components/user/mypage/notifications/all/All.tsx b/src/components/user/mypage/notifications/all/All.tsx index aa494266..e9d0da55 100644 --- a/src/components/user/mypage/notifications/all/All.tsx +++ b/src/components/user/mypage/notifications/all/All.tsx @@ -1,11 +1,11 @@ import { Link, useOutletContext } from 'react-router-dom'; -import useAlarmList from '../../../../hooks/useAlarmList'; -import NoContent from '../../../common/noContent/NoContent'; import * as S from './All.styled'; import { XMarkIcon } from '@heroicons/react/24/outline'; -import { useAlarmDelete } from '../../../../hooks/useAlarmDelete'; -import { useAlarmPatch } from '../../../../hooks/useAlarmPatch'; import Spinner from '../../Spinner'; +import { useAlarmDelete } from '../../../../../hooks/user/useAlarmDelete'; +import { useAlarmPatch } from '../../../../../hooks/user/useAlarmPatch'; +import useAlarmList from '../../../../../hooks/user/useAlarmList'; +import NoContent from '../../../../common/noContent/NoContent'; export default function All() { const { alarmListData, isLoading } = useAlarmList(); diff --git a/src/components/user/mypage/notifications/appliedProjects/AppliedProjects.tsx b/src/components/user/mypage/notifications/appliedProjects/AppliedProjects.tsx index 1d54407e..610c0a19 100644 --- a/src/components/user/mypage/notifications/appliedProjects/AppliedProjects.tsx +++ b/src/components/user/mypage/notifications/appliedProjects/AppliedProjects.tsx @@ -1,10 +1,10 @@ import { Link } from 'react-router-dom'; -import { ROUTES } from '../../../../constants/routes'; -import { useMyAppliedStatusList } from '../../../../hooks/useMyInfo'; -import NoContent from '../../../common/noContent/NoContent'; import * as S from './AppliedProjects.styled'; import Spinner from '../../Spinner'; import AppliedProjectsStatus from './appliedProjectsStatus/AppliedProjectsStatus'; +import NoContent from '../../../../common/noContent/NoContent'; +import { useMyAppliedStatusList } from '../../../../../hooks/user/useMyInfo'; +import { ROUTES } from '../../../../../constants/user/routes'; export default function AppliedProjects() { const { myAppliedStatusListData, isLoading } = useMyAppliedStatusList(); diff --git a/src/components/user/mypage/notifications/appliedProjects/appliedProjectsStatus/AppliedProjectsStatus.tsx b/src/components/user/mypage/notifications/appliedProjects/appliedProjectsStatus/AppliedProjectsStatus.tsx index 244406ca..81906291 100644 --- a/src/components/user/mypage/notifications/appliedProjects/appliedProjectsStatus/AppliedProjectsStatus.tsx +++ b/src/components/user/mypage/notifications/appliedProjects/appliedProjectsStatus/AppliedProjectsStatus.tsx @@ -1,5 +1,5 @@ -import { MY_STATUS } from '../../../../../constants/authConstants'; -import type { AppliedProject } from '../../../../../models/userProject'; +import { MY_STATUS } from '../../../../../../constants/user/authConstants'; +import { AppliedProject } from '../../../../../../models/userProject'; import * as S from './AppliedProjectsStatus.styled'; interface StatusProps { diff --git a/src/components/user/projectFormComponents/projectInformationInput/ProjectInformationInput.tsx b/src/components/user/projectFormComponents/projectInformationInput/ProjectInformationInput.tsx index ad47783a..fad75cc8 100644 --- a/src/components/user/projectFormComponents/projectInformationInput/ProjectInformationInput.tsx +++ b/src/components/user/projectFormComponents/projectInformationInput/ProjectInformationInput.tsx @@ -2,12 +2,12 @@ import MozipCategoryComponent from './positionComponent/PositionComponent'; import LanguageComponent from './languageComponent/LanguageComponent'; import FieldCategoryComponent from './fieldCategoryComponent/FieldCategoryComponent'; import { Control, FieldErrors, UseFormSetValue } from 'react-hook-form'; -import { PROJECT_DATA } from '../../../constants/projectConstants'; -import { CreateProjectFormValues } from '../../../models/createProject'; import * as S from './ProjectInformationInput.styled'; -import { useSearchFilteringSkillTag } from '../../../hooks/useSearchFilteringSkillTag'; -import { ProjectDetailPlusExtended } from '../../../models/projectDetail'; import Input from '../inputComponent/InputComponent'; +import { ProjectDetailPlusExtended } from '../../../../models/projectDetail'; +import { CreateProjectFormValues } from '../../../../models/createProject'; +import { useSearchFilteringSkillTag } from '../../../../hooks/user/useSearchFilteringSkillTag'; +import { PROJECT_DATA } from '../../../../constants/user/projectConstants'; interface ProjectInformationProps { errors: FieldErrors; diff --git a/src/components/user/projectFormComponents/projectInformationInput/fieldCategoryComponent/FieldCategoryComponent.tsx b/src/components/user/projectFormComponents/projectInformationInput/fieldCategoryComponent/FieldCategoryComponent.tsx index 1268ea6e..42a1e524 100644 --- a/src/components/user/projectFormComponents/projectInformationInput/fieldCategoryComponent/FieldCategoryComponent.tsx +++ b/src/components/user/projectFormComponents/projectInformationInput/fieldCategoryComponent/FieldCategoryComponent.tsx @@ -1,8 +1,8 @@ +import useTagSelectors from '../../../../../hooks/user/ProjectHooks/useTagSelectors'; +import { CreateProjectFormValues } from '../../../../../models/createProject'; +import { MethodTag } from '../../../../../models/tags'; import * as S from './FieldCategoryComponent.styled'; import { FieldErrors, UseFormSetValue } from 'react-hook-form'; -import { CreateProjectFormValues } from '../../../../models/createProject'; -import { MethodTag } from '../../../../models/tags'; -import useTagSelectors from '../../../../hooks/ProjectHooks/useTagSelectors'; interface FieldCategoryComponentProps { errors: FieldErrors; diff --git a/src/components/user/projectFormComponents/projectInformationInput/languageComponent/LanguageComponent.tsx b/src/components/user/projectFormComponents/projectInformationInput/languageComponent/LanguageComponent.tsx index 4df97834..e3b72f6f 100644 --- a/src/components/user/projectFormComponents/projectInformationInput/languageComponent/LanguageComponent.tsx +++ b/src/components/user/projectFormComponents/projectInformationInput/languageComponent/LanguageComponent.tsx @@ -1,9 +1,9 @@ +import useTagSelectors from '../../../../../hooks/user/ProjectHooks/useTagSelectors'; +import { CreateProjectFormValues } from '../../../../../models/createProject'; +import { SkillTag } from '../../../../../models/tags'; +import SkillTagBox from '../../../../common/skillTagBox/SkillTagBox'; import * as S from './LanguageComponent.styled'; import { FieldErrors, UseFormSetValue } from 'react-hook-form'; -import SkillTagBox from '../../../common/skillTagBox/SkillTagBox'; -import { CreateProjectFormValues } from '../../../../models/createProject'; -import useTagSelectors from '../../../../hooks/ProjectHooks/useTagSelectors'; -import { SkillTag } from '../../../../models/tags'; interface LanguageComponentProps { errors: FieldErrors; diff --git a/src/components/user/projectFormComponents/projectInformationInput/positionComponent/PositionComponent.tsx b/src/components/user/projectFormComponents/projectInformationInput/positionComponent/PositionComponent.tsx index fe7bad37..5533d9d0 100644 --- a/src/components/user/projectFormComponents/projectInformationInput/positionComponent/PositionComponent.tsx +++ b/src/components/user/projectFormComponents/projectInformationInput/positionComponent/PositionComponent.tsx @@ -1,8 +1,8 @@ +import useTagSelectors from '../../../../../hooks/user/ProjectHooks/useTagSelectors'; +import { CreateProjectFormValues } from '../../../../../models/createProject'; +import { PositionTag } from '../../../../../models/tags'; import * as S from './PositionComponent.styled'; import { FieldErrors, UseFormSetValue } from 'react-hook-form'; -import { PositionTag } from '../../../../models/tags'; -import useTagSelectors from '../../../../hooks/ProjectHooks/useTagSelectors'; -import { CreateProjectFormValues } from '../../../../models/createProject'; interface MozipCategoryComponentProps { errors: FieldErrors; @@ -31,7 +31,7 @@ const MozipCategoryComponent = ({ {positionTagsData.map((position, idx) => { - const isSelected = selectedTag.some((item) => item === idx + 1); + const isSelected = selectedTag.includes(idx + 1); return ( { const { userId } = useParams(); diff --git a/src/components/user/userPage/userProfile/UserProfile.tsx b/src/components/user/userPage/userProfile/UserProfile.tsx index 5cd3cec5..e3a2a9cb 100644 --- a/src/components/user/userPage/userProfile/UserProfile.tsx +++ b/src/components/user/userPage/userProfile/UserProfile.tsx @@ -1,8 +1,8 @@ -import Title from '../../common/title/Title'; -import * as S from '../../mypage/myProfile/MyProfile.styled'; +import * as S from '../../../mypage/myProfile/MyProfile.styled'; import BeginnerIcon from '../../../assets/beginner.svg'; -import { useUserProfileInfo } from '../../../hooks/useUserInfo'; import { useParams } from 'react-router-dom'; +import { useUserProfileInfo } from '../../../../hooks/user/useUserInfo'; +import Title from '../../../common/title/Title'; const UserProfile = () => { const { userId } = useParams(); diff --git a/src/constants/user/projectConstants.ts b/src/constants/user/projectConstants.ts index 501506ec..c210af0b 100644 --- a/src/constants/user/projectConstants.ts +++ b/src/constants/user/projectConstants.ts @@ -1,5 +1,7 @@ //constants +import { z } from 'zod'; + export const PROJECT_DATA = [ { id: '1', @@ -73,3 +75,86 @@ export const CAREER_INPUT = [ type: 'text', }, ]; + +export const createProjectScheme = z.object({ + startDate: z + .string({ required_error: '시작 날짜를 입력해주세요.' }) + .refine((date) => !isNaN(Date.parse(date)), { + message: '유효한 날짜를 입력해주세요.', + }), + endDate: z + .string({ required_error: '종료 날짜를 입력해주세요.' }) + .refine((date) => !isNaN(Date.parse(date)), { + message: '유효한 날짜를 입력해주세요.', + }), + + title: z + .string({ message: '프로젝트 제목을 입력해주세요.' }) + .min(1, { message: '프로젝트 제목을 입력해주세요.' }), + + maxVolunteers: z.coerce + .number({ message: '모집 인원을 입력해주세요.' }) + .min(1, { message: '모집 인원은 1명 이상이어야 합니다.' }) + .max(1000, { message: '모집 인원은 1000명 이하이어야 합니다.' }), + startDatePre: z + .string({ required_error: '종료 날짜를 입력해주세요.' }) + .refine((date) => !isNaN(Date.parse(date)), { + message: '유효한 날짜를 입력해주세요.', + }), + field: z.number({ message: '진행 방식을 선택 해주세요.' }), + duration: z.coerce + .number({ message: '예상 기간을 입력해주세요.' }) + .positive({ message: '예상 기간은 1 이상이어야 합니다.' }) + .max(365, { message: '예상 기간은 365일을 초과할 수 없습니다.' }), + position: z + .array(z.number({ message: '숫자로 입력 되어야 합니다.' })) + .min(1, { message: '1개의 분야를 선택해주세요.' }), + newBy: z.boolean().optional(), + languages: z + .array(z.number({ message: '숫자로 입력 되어야 합니다.' })) + .min(1, { message: '최소 1개 이상의 언어를 선택해주세요.' }), + + markdownEditor: z + .string({ message: '프로젝트 내용을 입력해주세요.' }) + .min(10, { message: '프로젝트 내용은 최소 10자 이상이어야 합니다.' }), +}); + +export const ApplyScheme = z.object({ + email: z + .string() + .nonempty({ message: '이메일을 입력해주세요.' }) + .email({ message: '이메일 형식으로 입력해주세요.' }), + phone: z + .string({ message: '전화번호를 입력해주세요.' }) + .array() + .nonempty({ message: '전화번호를 입력해주세요.' }), + wantToSay: z.string().optional(), + careers: z + .array( + z + .object({ + name: z.string().nonempty({ message: '경력명을 입력해주세요.' }), + periodStart: z + .string() + .nonempty({ message: '시작 날짜를 입력해주세요.' }) + .refine((date) => !isNaN(Date.parse(date)), { + message: '유효한 날짜를 입력해주세요.', + }), + periodEnd: z + .string() + .nonempty({ message: '종료 날짜를 입력해주세요.' }) + .refine((date) => !isNaN(Date.parse(date)), { + message: '유효한 날짜를 입력해주세요.', + }), + role: z.string().nonempty({ message: '역할을 입력해주세요.' }), + }) + .refine( + (data) => new Date(data.periodStart) < new Date(data.periodEnd), + { + message: '시작 날짜는 종료 날짜보다 이전이어야 합니다.', + path: ['periodStart'], + } + ) + ) + .optional(), +}); diff --git a/src/hooks/useAuth.ts b/src/hooks/useAuth.ts index dc082efb..d0e3ecb3 100644 --- a/src/hooks/useAuth.ts +++ b/src/hooks/useAuth.ts @@ -1,15 +1,15 @@ import { useNavigate } from 'react-router-dom'; import { postLogin, postResetPassword, postSignUp } from '../api/auth.api'; -import { registerFormValues } from '../pages/register/Register'; -import { changePasswordFormValues } from '../pages/changePassword/ChangePassword'; import { loginFormValues } from '../pages/login/Login'; import useAuthStore from '../store/authStore'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import { LoginResponse } from '../models/auth'; -import { ROUTES } from '../constants/routes'; import { AxiosError } from 'axios'; import { myInfoKey } from './queries/user/keys'; -import { MODAL_MESSAGE } from '../constants/modalMessage'; +import { MODAL_MESSAGE } from '../constants/user/modalMessage'; +import { ROUTES } from '../constants/user/routes'; +import { registerFormValues } from '../pages/user/register/Register'; +import { changePasswordFormValues } from '../pages/user/changePassword/ChangePassword'; export const useAuth = (handleModalOpen: (message: string) => void) => { const navigate = useNavigate(); diff --git a/src/hooks/user/ProjectHooks/useApplyProject.ts b/src/hooks/user/ProjectHooks/useApplyProject.ts index c66f6274..ffa091d8 100644 --- a/src/hooks/user/ProjectHooks/useApplyProject.ts +++ b/src/hooks/user/ProjectHooks/useApplyProject.ts @@ -1,10 +1,10 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; -import { joinProject } from '../../models/joinProject'; import { ProjectListKey, userInfoKey } from '../../queries/user/keys'; -import { postApplicantProject } from '../../api/joinProject.api'; -import { MODAL_MESSAGE } from '../../constants/modalMessage'; -import { ROUTES } from '../../constants/routes'; import { useNavigate } from 'react-router-dom'; +import { postApplicantProject } from '../../../api/joinProject.api'; +import { joinProject } from '../../../models/joinProject'; +import { MODAL_MESSAGE } from '../../../constants/user/modalMessage'; +import { ROUTES } from '../../../constants/user/routes'; interface UseApplyProjectProps { id: number; diff --git a/src/hooks/user/ProjectHooks/useCreateProject.ts b/src/hooks/user/ProjectHooks/useCreateProject.ts index 47c6b293..a1106d55 100644 --- a/src/hooks/user/ProjectHooks/useCreateProject.ts +++ b/src/hooks/user/ProjectHooks/useCreateProject.ts @@ -1,11 +1,10 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; import { useNavigate } from 'react-router-dom'; -import { postProject } from '../../api/joinProject.api'; -import { MODAL_MESSAGE } from '../../constants/modalMessage'; import { managedProjectKey } from '../../queries/user/keys'; -import { ROUTES } from '../../constants/routes'; -import { FormData } from '../../models/createProject'; - +import { ROUTES } from '../../../constants/user/routes'; +import { MODAL_MESSAGE } from '../../../constants/user/modalMessage'; +import { postProject } from '../../../api/joinProject.api'; +import { FormData } from '../../../models/createProject'; interface UseCreateProjectProps { handleModalOpen: (newMessage: string) => void; } diff --git a/src/hooks/user/ProjectHooks/useTagSelectors.ts b/src/hooks/user/ProjectHooks/useTagSelectors.ts index 1d83d5dc..fba121be 100644 --- a/src/hooks/user/ProjectHooks/useTagSelectors.ts +++ b/src/hooks/user/ProjectHooks/useTagSelectors.ts @@ -1,8 +1,7 @@ import { useEffect, useState } from 'react'; import { UseFormSetValue } from 'react-hook-form'; -import { CreateProjectFormValues } from '../../models/createProject'; -import { PositionTag, SkillTag } from '../../models/tags'; - +import { CreateProjectFormValues } from '../../../models/createProject'; +import { PositionTag, SkillTag } from '../../../models/tags'; interface useTagSelectorsProps { apiTagData?: SkillTag[] | PositionTag[] | number; setValue: UseFormSetValue; @@ -54,8 +53,17 @@ const useTagSelectors = ({ }); } else if (fieldName === 'position') { setSelectedTag((prev) => { - const isAlreadySelected = prev.some((item) => item === idx); + if (prev.includes(1) && idx !== 1) { + return prev; + } + + if (idx === 1) { + const updated = prev.includes(1) ? [] : [1]; + setValue(fieldName, updated); + return updated; + } + const isAlreadySelected = prev.includes(idx); const updated = isAlreadySelected ? prev.filter((item) => item !== idx) : [...prev, idx]; @@ -68,6 +76,8 @@ const useTagSelectors = ({ setValue(fieldName, idx); } + + console.log(selectedTag); }; return { selectedTag, handleClick }; diff --git a/src/hooks/user/ProjectHooks/useUpdateProject.ts b/src/hooks/user/ProjectHooks/useUpdateProject.ts index 01d209f1..43521895 100644 --- a/src/hooks/user/ProjectHooks/useUpdateProject.ts +++ b/src/hooks/user/ProjectHooks/useUpdateProject.ts @@ -1,11 +1,10 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; import { useNavigate } from 'react-router-dom'; -import { putProject } from '../../api/joinProject.api'; import { managedProjectKey } from '../../queries/user/keys'; -import { FormData } from '../../models/createProject'; -import { MODAL_MESSAGE } from '../../constants/modalMessage'; -import { ROUTES } from '../../constants/routes'; - +import { putProject } from '../../../api/joinProject.api'; +import { MODAL_MESSAGE } from '../../../constants/user/modalMessage'; +import { FormData } from '../../../models/createProject'; +import { ROUTES } from '../../../constants/user/routes'; interface UseUpdateProjectProps { id: number; handleModalOpen: (newMessage: string) => void; diff --git a/src/hooks/user/evaluationHooks/useEvaluationStep.ts b/src/hooks/user/evaluationHooks/useEvaluationStep.ts index 0ad8d295..d4132e2f 100644 --- a/src/hooks/user/evaluationHooks/useEvaluationStep.ts +++ b/src/hooks/user/evaluationHooks/useEvaluationStep.ts @@ -1,7 +1,7 @@ import { useEffect, useMemo, useState } from 'react'; -import { MemberList } from '../../models/evaluation'; -import { questions } from '../../constants/evaluation'; import { usePostEvaluation } from './usePostEvaluation'; +import { MemberList } from '../../../models/evaluation'; +import { questions } from '../../../constants/user/evaluation'; interface useEvaluationStepProps { projectId: number; diff --git a/src/hooks/user/evaluationHooks/useGetEvaluation.ts b/src/hooks/user/evaluationHooks/useGetEvaluation.ts index 8029441e..ac8f38e6 100644 --- a/src/hooks/user/evaluationHooks/useGetEvaluation.ts +++ b/src/hooks/user/evaluationHooks/useGetEvaluation.ts @@ -1,6 +1,6 @@ import { useQuery } from '@tanstack/react-query'; -import { getEvaluation } from '../../api/evaluation.api'; import { ProjectMemberListEval } from '../../queries/user/keys'; +import { getEvaluation } from '../../../api/evaluation.api'; const useGetCompletedEvaluation = (id: number) => { const { data, isLoading, isFetching, isError } = useQuery({ diff --git a/src/hooks/user/evaluationHooks/usePostEvaluation.ts b/src/hooks/user/evaluationHooks/usePostEvaluation.ts index ba191d47..082d8346 100644 --- a/src/hooks/user/evaluationHooks/usePostEvaluation.ts +++ b/src/hooks/user/evaluationHooks/usePostEvaluation.ts @@ -1,7 +1,7 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; -import { postEvaluation } from '../../api/evaluation.api'; import { ProjectMemberListEval } from '../../queries/user/keys'; -import { apiEvaluatedUser } from '../../models/evaluation'; +import { apiEvaluatedUser } from '../../../models/evaluation'; +import { postEvaluation } from '../../../api/evaluation.api'; export const usePostEvaluation = (projectId: number) => { const queryClient = useQueryClient(); diff --git a/src/hooks/user/useManagedProjects.ts b/src/hooks/user/useManagedProjects.ts index 00f632c9..7705b37d 100644 --- a/src/hooks/user/useManagedProjects.ts +++ b/src/hooks/user/useManagedProjects.ts @@ -1,7 +1,7 @@ -import { ApiManagedProjects } from '../models/manageMyProject'; -import { getMyProjectLists } from '../api/myProjectList.api'; import { useQuery } from '@tanstack/react-query'; import { managedProjectKey } from '../queries/user/keys'; +import { ApiManagedProjects } from '../../models/manageMyProject'; +import { getMyProjectLists } from '../../api/myProjectList.api'; export const useManagedProjects = () => { const { data, isLoading } = useQuery({ diff --git a/src/hooks/user/useMyInfo.ts b/src/hooks/user/useMyInfo.ts index ee679dca..43df84e4 100644 --- a/src/hooks/user/useMyInfo.ts +++ b/src/hooks/user/useMyInfo.ts @@ -1,22 +1,19 @@ import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { AxiosError } from 'axios'; +import { useNavigate } from 'react-router-dom'; +import { myInfoKey, ProjectListKey } from '../queries/user/keys'; +import useAuthStore from '../../store/authStore'; +import { ApiUserInfo, EditMyInfo } from '../../models/userInfo'; import { getMyAppliedStatusList, getMyInfo, getMyJoinedProjectList, patchMyProfileImg, putMyInfo, -} from '../api/mypage.api'; -import type { ApiUserInfo, EditMyInfo } from '../models/userInfo'; -import { AxiosError } from 'axios'; -import { useNavigate } from 'react-router-dom'; -import { ROUTES } from '../constants/routes'; -import { myInfoKey, ProjectListKey } from '../queries/user/keys'; -import useAuthStore from '../store/authStore'; -import type { - ApiAppliedProject, - ApiJoinedProject, -} from '../models/userProject'; -import { MODAL_MESSAGE } from '../constants/modalMessage'; +} from '../../api/mypage.api'; +import { MODAL_MESSAGE } from '../../constants/user/modalMessage'; +import { ROUTES } from '../../constants/user/routes'; +import { ApiAppliedProject, ApiJoinedProject } from '../../models/userProject'; export const useMyProfileInfo = () => { const isLoggedIn = useAuthStore((state) => state.isLoggedIn); diff --git a/src/hooks/user/useNicknameVerification.ts b/src/hooks/user/useNicknameVerification.ts index 6428a1d2..3c749bdf 100644 --- a/src/hooks/user/useNicknameVerification.ts +++ b/src/hooks/user/useNicknameVerification.ts @@ -1,5 +1,5 @@ import { useState } from 'react'; -import { getCheckNickname } from '../api/auth.api'; +import { getCheckNickname } from '../../api/auth.api'; const useNickNameVerification = () => { const [nicknameMessage, setNicknameMessage] = useState( diff --git a/src/hooks/user/useNotification.ts b/src/hooks/user/useNotification.ts index c8e3aa3e..42b542b0 100644 --- a/src/hooks/user/useNotification.ts +++ b/src/hooks/user/useNotification.ts @@ -1,10 +1,10 @@ import { EventSourcePolyfill, NativeEventSource } from 'event-source-polyfill'; import { useEffect, useRef, useState } from 'react'; -import useAuthStore, { getTokens } from '../store/authStore'; import { useQueryClient } from '@tanstack/react-query'; import { AlarmList } from '../queries/user/keys'; -import { useToast } from './useToast'; -import { AlarmLive } from '../models/alarm'; +import { AlarmLive } from '../../models/alarm'; +import useAuthStore, { getTokens } from '../../store/authStore'; +import { useToast } from '../useToast'; const useNotification = () => { const [signalData, setSignalData] = useState(null); diff --git a/src/hooks/user/usePassNonPassList.ts b/src/hooks/user/usePassNonPassList.ts index 56989b47..8ed42a37 100644 --- a/src/hooks/user/usePassNonPassList.ts +++ b/src/hooks/user/usePassNonPassList.ts @@ -1,6 +1,6 @@ import { useSuspenseQuery } from '@tanstack/react-query'; import { applicantKey } from '../queries/user/keys'; -import { getPassNonPassList } from '../api/applicant.api'; +import { getPassNonPassList } from '../../api/applicant.api'; export const usePassNonPassList = (projectId: number) => { const { data, isLoading } = useSuspenseQuery({ diff --git a/src/hooks/user/usePassNonPassMutation.ts b/src/hooks/user/usePassNonPassMutation.ts index 3e103283..4ab64d4e 100644 --- a/src/hooks/user/usePassNonPassMutation.ts +++ b/src/hooks/user/usePassNonPassMutation.ts @@ -1,8 +1,8 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; -import { patchPassNonPassStatus } from '../api/applicant.api'; import { AxiosError } from 'axios'; import { applicantKey } from '../queries/user/keys'; -import { MODAL_MESSAGE } from '../constants/modalMessage'; +import { MODAL_MESSAGE } from '../../constants/user/modalMessage'; +import { patchPassNonPassStatus } from '../../api/applicant.api'; export interface useMutationParams { status: 'ACCEPTED' | 'REJECTED' | 'WAITING'; diff --git a/src/hooks/user/usePostInquiry.ts b/src/hooks/user/usePostInquiry.ts index 1a43afd5..6a38f521 100644 --- a/src/hooks/user/usePostInquiry.ts +++ b/src/hooks/user/usePostInquiry.ts @@ -1,10 +1,10 @@ import { ActivityLog } from '../queries/user/keys'; import { useMutation, useQueryClient } from '@tanstack/react-query'; -import { postInquiry } from '../api/inquiry.api'; import { AxiosError } from 'axios'; -import useAuthStore from '../store/authStore'; import { useNavigate } from 'react-router-dom'; -import { INQUIRY_MESSAGE } from '../constants/customerService'; +import useAuthStore from '../../store/authStore'; +import { postInquiry } from '../../api/inquiry.api'; +import { INQUIRY_MESSAGE } from '../../constants/user/customerService'; export const usePostInquiry = ( handleModalOpen: (message: string) => void, diff --git a/src/hooks/user/useProjectCardListData.ts b/src/hooks/user/useProjectCardListData.ts index 83db8b6e..17bfa57b 100644 --- a/src/hooks/user/useProjectCardListData.ts +++ b/src/hooks/user/useProjectCardListData.ts @@ -1,6 +1,6 @@ import { useQuery } from '@tanstack/react-query'; -import { getProjectLists } from '../api/projectLists.api'; import { useSaveSearchFiltering } from './useSaveSearchFiltering'; +import { getProjectLists } from '../../api/projectLists.api'; export const useProjectCardListData = () => { const { searchFilters } = useSaveSearchFiltering(); const { diff --git a/src/hooks/user/useProjectStatistic.ts b/src/hooks/user/useProjectStatistic.ts index bc930d6b..dcc491e2 100644 --- a/src/hooks/user/useProjectStatistic.ts +++ b/src/hooks/user/useProjectStatistic.ts @@ -1,6 +1,6 @@ import { useQuery } from '@tanstack/react-query'; -import { getProjectStatistic } from '../api/projectLists.api'; import { useEffect, useState } from 'react'; +import { getProjectStatistic } from '../../api/projectLists.api'; interface ProjectStatDataReset { label: string; diff --git a/src/hooks/user/useSaveSearchFiltering.ts b/src/hooks/user/useSaveSearchFiltering.ts index ceb75f7c..f067835e 100644 --- a/src/hooks/user/useSaveSearchFiltering.ts +++ b/src/hooks/user/useSaveSearchFiltering.ts @@ -1,5 +1,5 @@ import { useContext } from 'react'; -import SearchFilteringContext from '../context/SearchFilteringContext'; +import SearchFilteringContext from '../../context/SearchFilteringContext'; export const useSaveSearchFiltering = () => { const context = useContext(SearchFilteringContext); diff --git a/src/hooks/user/useSearchFilteringSkillTag.ts b/src/hooks/user/useSearchFilteringSkillTag.ts index bbb75f54..e5373fdc 100644 --- a/src/hooks/user/useSearchFilteringSkillTag.ts +++ b/src/hooks/user/useSearchFilteringSkillTag.ts @@ -1,11 +1,11 @@ +import { useQueries } from '@tanstack/react-query'; +import { useEffect, useState } from 'react'; +import { MethodTag, PositionTag, SkillTag } from '../../models/tags'; import { getMethodTag, getPositionTag, -} from './../api/projectSearchFiltering.api'; -import { useQueries } from '@tanstack/react-query'; -import { getSkillTag } from '../api/projectSearchFiltering.api'; -import { useEffect, useState } from 'react'; -import type { MethodTag, PositionTag, SkillTag } from '../models/tags'; + getSkillTag, +} from '../../api/projectSearchFiltering.api'; export const useSearchFilteringSkillTag = () => { const [skillTagsData, setSkillTagsData] = useState([]); diff --git a/src/hooks/user/useSendResultMutation.ts b/src/hooks/user/useSendResultMutation.ts index f13048c0..528396e3 100644 --- a/src/hooks/user/useSendResultMutation.ts +++ b/src/hooks/user/useSendResultMutation.ts @@ -1,8 +1,8 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; import { AxiosError } from 'axios'; -import { patchSendResult } from '../api/myProjectList.api'; -import { MODAL_MESSAGE } from '../constants/modalMessage'; import { managedProjectKey } from '../queries/user/keys'; +import { patchSendResult } from '../../api/myProjectList.api'; +import { MODAL_MESSAGE } from '../../constants/user/modalMessage'; export const useSendResultMutation = ( projectId: number, diff --git a/src/hooks/user/useUserInfo.ts b/src/hooks/user/useUserInfo.ts index e9d6e5fe..f650e09e 100644 --- a/src/hooks/user/useUserInfo.ts +++ b/src/hooks/user/useUserInfo.ts @@ -1,9 +1,9 @@ import { useQuery } from '@tanstack/react-query'; -import type { ApiUserInfo } from '../models/userInfo'; import { userInfoKey } from '../queries/user/keys'; -import { getUserInfo, getUserJoinedProjectList } from '../api/userpage.api'; -import useAuthStore from '../store/authStore'; -import type { ApiSelectUserProject } from '../models/userProject'; +import useAuthStore from '../../store/authStore'; +import { ApiUserInfo } from '../../models/userInfo'; +import { getUserInfo, getUserJoinedProjectList } from '../../api/userpage.api'; +import { ApiSelectUserProject } from '../../models/userProject'; export const useUserProfileInfo = (id: number) => { const isLoggedIn = useAuthStore((state) => state.isLoggedIn); diff --git a/src/models/createProject.ts b/src/models/createProject.ts index d61322d6..6b98dca6 100644 --- a/src/models/createProject.ts +++ b/src/models/createProject.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { createProjectScheme } from '../pages/createProject/CreateProject'; +import { createProjectScheme } from '../constants/projectConstants'; export type CreateProjectFormValues = z.infer; diff --git a/src/models/joinProject.ts b/src/models/joinProject.ts index b2664c04..ce7689e6 100644 --- a/src/models/joinProject.ts +++ b/src/models/joinProject.ts @@ -1,3 +1,8 @@ +import { z } from 'zod'; +import { ApplyScheme } from '../constants/projectConstants'; + +export type ApplySchemeType = z.infer; + export interface Career { name: string; periodStart: string; diff --git a/src/pages/user/apply/Apply.tsx b/src/pages/user/apply/Apply.tsx index 5e9c2fe8..35c1c48f 100644 --- a/src/pages/user/apply/Apply.tsx +++ b/src/pages/user/apply/Apply.tsx @@ -1,62 +1,20 @@ import * as S from './Apply.styled'; -import Input from '../../components/projectFormComponents/inputComponent/InputComponent'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; -import { z } from 'zod'; import { useParams } from 'react-router-dom'; -import { formatDate } from '../../util/format'; -import { joinProject } from '../../models/joinProject'; -import CareersComponent from '../../components/applyComponents/careersComponent/CareersComponent'; -import PhoneComponent from '../../components/applyComponents/phoneComponent/PhoneComponent'; -import LoadingSpinner from '../../components/common/loadingSpinner/LoadingSpinner'; -import Modal from '../../components/common/modal/Modal'; -import { useModal } from '../../hooks/useModal'; -import useAuthStore from '../../store/authStore'; +import { formatDate } from '../../../util/format'; +import { ApplySchemeType, joinProject } from '../../../models/joinProject'; +import { useModal } from '../../../hooks/useModal'; +import useGetProjectData from '../../../hooks/user/useGetProjectData'; +import useApplyProject from '../../../hooks/user/ProjectHooks/useApplyProject'; +import useAuthStore from '../../../store/authStore'; +import { ApplyScheme } from '../../../constants/user/projectConstants'; import { useEffect } from 'react'; -import useGetProjectData from '../../hooks/useGetProjectData'; -import useApplyProject from '../../hooks/ProjectHooks/useApplyProject'; - -const ApplyScheme = z.object({ - email: z - .string() - .nonempty({ message: '이메일을 입력해주세요.' }) - .email({ message: '이메일 형식으로 입력해주세요.' }), - phone: z - .string({ message: '전화번호를 입력해주세요.' }) - .array() - .nonempty({ message: '전화번호를 입력해주세요.' }), - wantToSay: z.string().optional(), - careers: z - .array( - z - .object({ - name: z.string().nonempty({ message: '경력명을 입력해주세요.' }), - periodStart: z - .string() - .nonempty({ message: '시작 날짜를 입력해주세요.' }) - .refine((date) => !isNaN(Date.parse(date)), { - message: '유효한 날짜를 입력해주세요.', - }), - periodEnd: z - .string() - .nonempty({ message: '종료 날짜를 입력해주세요.' }) - .refine((date) => !isNaN(Date.parse(date)), { - message: '유효한 날짜를 입력해주세요.', - }), - role: z.string().nonempty({ message: '역할을 입력해주세요.' }), - }) - .refine( - (data) => new Date(data.periodStart) < new Date(data.periodEnd), - { - message: '시작 날짜는 종료 날짜보다 이전이어야 합니다.', - path: ['periodStart'], - } - ) - ) - .optional(), -}); - -export type ApplySchemeType = z.infer; +import Modal from '../../../components/common/modal/Modal'; +import LoadingSpinner from '../../../components/common/loadingSpinner/LoadingSpinner'; +import PhoneComponent from '../../../components/user/applyComponents/phoneComponent/PhoneComponent'; +import CareersComponent from '../../../components/user/applyComponents/careersComponent/CareersComponent'; +import Input from '../../../components/user/projectFormComponents/inputComponent/InputComponent'; const Apply = () => { const { projectId } = useParams(); diff --git a/src/pages/user/apply/ApplyStep.styled.ts b/src/pages/user/apply/ApplyStep.styled.ts index b98e37e2..36f685eb 100644 --- a/src/pages/user/apply/ApplyStep.styled.ts +++ b/src/pages/user/apply/ApplyStep.styled.ts @@ -46,11 +46,12 @@ export const StepContainer = styled.div` export const StepButton = styled.div` display: flex; + justify-content: right; gap: 20px; `; export const StepLabel = styled.div` - font-size: 1rem; + font-size: 1.3rem; font-weight: bold; color: ${({ theme }) => theme.color.primary}; margin-bottom: 10px; @@ -62,12 +63,10 @@ export const StepLabel = styled.div` export const StepWrapper = styled.div` display: flex; - flex-direction: row; justify-content: space-between; `; export const SubmitButton = styled(Button)` - width: 100px; padding: 15px; margin: 0 auto; cursor: pointer; diff --git a/src/pages/user/apply/ApplyStep.tsx b/src/pages/user/apply/ApplyStep.tsx index f8e50701..3a2f831c 100644 --- a/src/pages/user/apply/ApplyStep.tsx +++ b/src/pages/user/apply/ApplyStep.tsx @@ -1,65 +1,24 @@ import * as S from './ApplyStep.styled'; -import Input from '../../components/projectFormComponents/inputComponent/InputComponent'; + import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; -import { z } from 'zod'; import { useParams } from 'react-router-dom'; -import { formatDate } from '../../util/format'; -import { joinProject } from '../../models/joinProject'; -import CareersComponent from '../../components/applyComponents/careersComponent/CareersComponent'; -import PhoneComponent from '../../components/applyComponents/phoneComponent/PhoneComponent'; -import LoadingSpinner from '../../components/common/loadingSpinner/LoadingSpinner'; -import Modal from '../../components/common/modal/Modal'; -import { useModal } from '../../hooks/useModal'; -import useAuthStore from '../../store/authStore'; +import { useModal } from '../../../hooks/useModal'; +import useGetProjectData from '../../../hooks/user/useGetProjectData'; +import useApplyProject from '../../../hooks/user/ProjectHooks/useApplyProject'; +import useAuthStore from '../../../store/authStore'; +import { ApplySchemeType, joinProject } from '../../../models/joinProject'; +import { ApplyScheme } from '../../../constants/user/projectConstants'; +import Input from '../../../components/user/projectFormComponents/inputComponent/InputComponent'; +import PhoneComponent from '../../../components/user/applyComponents/phoneComponent/PhoneComponent'; +import CareersComponent from '../../../components/user/applyComponents/careersComponent/CareersComponent'; import { useEffect } from 'react'; -import useMultiStepForm from '../../hooks/ProjectHooks/useMultiStepForm'; -import StepComponent from '../../components/projectFormComponents/stepComponent/StepComponent'; -import Button from '../../components/common/Button/Button'; -import useGetProjectData from '../../hooks/useGetProjectData'; -import useApplyProject from '../../hooks/ProjectHooks/useApplyProject'; - -const ApplyScheme = z.object({ - email: z - .string() - .nonempty({ message: '이메일을 입력해주세요.' }) - .email({ message: '이메일 형식으로 입력해주세요.' }), - phone: z - .string({ message: '전화번호를 입력해주세요.' }) - .array() - .nonempty({ message: '전화번호를 입력해주세요.' }), - wantToSay: z.string().optional(), - careers: z - .array( - z - .object({ - name: z.string().nonempty({ message: '경력명을 입력해주세요.' }), - periodStart: z - .string() - .nonempty({ message: '시작 날짜를 입력해주세요.' }) - .refine((date) => !isNaN(Date.parse(date)), { - message: '유효한 날짜를 입력해주세요.', - }), - periodEnd: z - .string() - .nonempty({ message: '종료 날짜를 입력해주세요.' }) - .refine((date) => !isNaN(Date.parse(date)), { - message: '유효한 날짜를 입력해주세요.', - }), - role: z.string().nonempty({ message: '역할을 입력해주세요.' }), - }) - .refine( - (data) => new Date(data.periodStart) < new Date(data.periodEnd), - { - message: '시작 날짜는 종료 날짜보다 이전이어야 합니다.', - path: ['periodStart'], - } - ) - ) - .optional(), -}); - -export type ApplySchemeType = z.infer; +import useMultiStepForm from '../../../hooks/user/ProjectHooks/useMultiStepForm'; +import Modal from '../../../components/common/modal/Modal'; +import LoadingSpinner from '../../../components/common/loadingSpinner/LoadingSpinner'; +import { formatDate } from '../../../util/formatDate'; +import StepComponent from '../../../components/user/projectFormComponents/stepComponent/StepComponent'; +import Button from '../../../components/common/Button/Button'; const Apply = () => { const { projectId } = useParams(); @@ -166,8 +125,7 @@ const Apply = () => { ); } - if (isLoading) return ; - if (isFetching) return ; + if (isLoading || isFetching) return ; return ( @@ -186,31 +144,32 @@ const Apply = () => {
{currentTitle} - + + + {currentStep} + + + + {currentStepIndex !== stepList.length - 1 && ( - {currentStepIndex !== stepList.length - 1 && ( - - )} - - - - {currentStep} + )} + {isLastStep && ( !isNaN(Date.parse(date)), { - message: '유효한 날짜를 입력해주세요.', - }), - endDate: z - .string({ required_error: '종료 날짜를 입력해주세요.' }) - .refine((date) => !isNaN(Date.parse(date)), { - message: '유효한 날짜를 입력해주세요.', - }), - - title: z - .string({ message: '프로젝트 제목을 입력해주세요.' }) - .min(1, { message: '프로젝트 제목을 입력해주세요.' }), - - maxVolunteers: z.coerce - .number({ message: '모집 인원을 입력해주세요.' }) - .min(1, { message: '모집 인원은 1명 이상이어야 합니다.' }) - .max(1000, { message: '모집 인원은 1000명 이하이어야 합니다.' }), - startDatePre: z - .string({ required_error: '종료 날짜를 입력해주세요.' }) - .refine((date) => !isNaN(Date.parse(date)), { - message: '유효한 날짜를 입력해주세요.', - }), - field: z.number({ message: '진행 방식을 선택 해주세요.' }), - duration: z.coerce - .number({ message: '예상 기간을 입력해주세요.' }) - .positive({ message: '예상 기간은 1 이상이어야 합니다.' }) - .max(365, { message: '예상 기간은 365일을 초과할 수 없습니다.' }), - position: z - .array(z.number({ message: '숫자로 입력 되어야 합니다.' })) - .min(1, { message: '1개의 분야를 선택해주세요.' }), - newBy: z.boolean().optional(), - languages: z - .array(z.number({ message: '숫자로 입력 되어야 합니다.' })) - .min(1, { message: '최소 1개 이상의 언어를 선택해주세요.' }), - - markdownEditor: z - .string({ message: '프로젝트 내용을 입력해주세요.' }) - .min(10, { message: '프로젝트 내용은 최소 10자 이상이어야 합니다.' }), -}); +import { + CreateProjectFormValues, + FormData, +} from '../../../models/createProject'; +import { createProjectScheme } from '../../../constants/user/projectConstants'; +import { useModal } from '../../../hooks/useModal'; +import useCreateProject from '../../../hooks/user/ProjectHooks/useCreateProject'; +import LoadingSpinner from '../../../components/common/loadingSpinner/LoadingSpinner'; +import Input from '../../../components/user/projectFormComponents/inputComponent/InputComponent'; +import ProjectInformationInput from '../../../components/user/projectFormComponents/projectInformationInput/ProjectInformationInput'; +import Modal from '../../../components/common/modal/Modal'; const CreateProject = () => { const { @@ -79,14 +39,6 @@ const CreateProject = () => { const { createProject, isLoading } = useCreateProject({ handleModalOpen, }); - const userId = useAuthStore((state) => state.userData?.id); - if (!userId) { - return ( - - {message} - - ); - } const handleSubmit = (data: z.infer) => { const formData: FormData = { diff --git a/src/pages/user/customerService/faq/FAQ.tsx b/src/pages/user/customerService/faq/FAQ.tsx index aa043ef7..42b9c8a2 100644 --- a/src/pages/user/customerService/faq/FAQ.tsx +++ b/src/pages/user/customerService/faq/FAQ.tsx @@ -1,13 +1,13 @@ import { useState } from 'react'; -import { useGetFAQ } from '../../../hooks/useGetFAQ'; import * as S from './FAQ.styled'; -import { SearchKeyword } from '../../../models/customerService'; -import Spinner from '../../../components/mypage/Spinner'; -import CustomerServiceHeader from '../../../components/customerService/CustomerServiceHeader'; -import FAQContent from '../../../components/customerService/faq/FAQContent'; -import NoResult from '../../../components/common/noResult/NoResult'; -import ContentBorder from '../../../components/common/contentBorder/ContentBorder'; import { ChevronDownIcon } from '@heroicons/react/24/outline'; +import { SearchKeyword } from '../../../../models/customerService'; +import { useGetFAQ } from '../../../../hooks/user/useGetFAQ'; +import { Spinner } from '../../../../components/common/loadingSpinner/LoadingSpinner.styled'; +import CustomerServiceHeader from '../../../../components/user/customerService/CustomerServiceHeader'; +import FAQContent from '../../../../components/user/customerService/faq/FAQContent'; +import ContentBorder from '../../../../components/common/contentBorder/ContentBorder'; +import NoResult from '../../../../components/common/noResult/NoResult'; export default function FAQ() { const [keyword, setKeyword] = useState({ keyword: '' }); diff --git a/src/pages/user/customerService/notice/Notice.tsx b/src/pages/user/customerService/notice/Notice.tsx index 43acbbd1..44bed823 100644 --- a/src/pages/user/customerService/notice/Notice.tsx +++ b/src/pages/user/customerService/notice/Notice.tsx @@ -1,14 +1,14 @@ import { useState } from 'react'; -import CustomerServiceHeader from '../../../components/customerService/CustomerServiceHeader'; -import Spinner from '../../../components/mypage/Spinner'; -import { useGetNotice } from '../../../hooks/useGetNotice'; import * as S from './Notice.styled'; -import type { NoticeSearch } from '../../../models/customerService'; -import NoResult from '../../../components/common/noResult/NoResult'; -import NoticeList from '../../../components/customerService/notice/NoticeList'; -import { ROUTES } from '../../../constants/routes'; -import Pagination from '../../../components/common/pagination/Pagination'; -import ContentBorder from '../../../components/common/contentBorder/ContentBorder'; +import { NoticeSearch } from '../../../../models/customerService'; +import { useGetNotice } from '../../../../hooks/user/useGetNotice'; +import { Spinner } from '../../../../components/common/loadingSpinner/LoadingSpinner.styled'; +import CustomerServiceHeader from '../../../../components/user/customerService/CustomerServiceHeader'; +import ContentBorder from '../../../../components/common/contentBorder/ContentBorder'; +import { ROUTES } from '../../../../constants/user/routes'; +import NoticeList from '../../../../components/user/customerService/notice/NoticeList'; +import NoResult from '../../../../components/common/noResult/NoResult'; +import Pagination from '../../../../components/common/pagination/Pagination'; export default function Notice() { const [keyword, setKeyword] = useState({ diff --git a/src/pages/user/customerService/noticeDetail/NoticeDetail.tsx b/src/pages/user/customerService/noticeDetail/NoticeDetail.tsx index 92bbeda1..8cea59fe 100644 --- a/src/pages/user/customerService/noticeDetail/NoticeDetail.tsx +++ b/src/pages/user/customerService/noticeDetail/NoticeDetail.tsx @@ -1,4 +1,4 @@ -import NoticeDetailBundle from '../../../components/customerService/noticeDetail/NoticeDetailBundle'; +import NoticeDetailBundle from '../../../../components/user/customerService/noticeDetail/NoticeDetailBundle'; export default function NoticeDetail() { return ; diff --git a/src/pages/user/evaluation/Evaluation.tsx b/src/pages/user/evaluation/Evaluation.tsx index a957b7e8..c2df6580 100644 --- a/src/pages/user/evaluation/Evaluation.tsx +++ b/src/pages/user/evaluation/Evaluation.tsx @@ -1,8 +1,8 @@ import { useParams } from 'react-router-dom'; import * as S from './Evaluation.styled'; -import useGetCompletedEvaluation from '../../hooks/evaluationHooks/useGetEvaluation'; -import EvaluationContent from '../../components/evaluation/EvaluationContent'; -import LoadingSpinner from '../../components/common/loadingSpinner/LoadingSpinner'; +import useGetCompletedEvaluation from '../../../hooks/user/evaluationHooks/useGetEvaluation'; +import LoadingSpinner from '../../../components/common/loadingSpinner/LoadingSpinner'; +import EvaluationContent from '../../../components/user/evaluation/EvaluationContent'; const Evaluation = () => { const { projectId: projectIdParam } = useParams(); diff --git a/src/pages/user/home/Home.tsx b/src/pages/user/home/Home.tsx index 0b4169dc..56895cf6 100644 --- a/src/pages/user/home/Home.tsx +++ b/src/pages/user/home/Home.tsx @@ -1,9 +1,8 @@ +import Banner from '../../../components/user/home/banner/Banner'; +import ProjectCardLists from '../../../components/user/home/projectCardLists/ProjectCardLists'; +import ProjectStats from '../../../components/user/home/projectStats/ProjectStats'; +import SearchFiltering from '../../../components/user/home/searchFiltering/SearchFiltering'; import * as S from './Home.styled'; -import Banner from '../../components/home/banner/Banner'; -import ProjectStats from '../../components/home/projectStats/ProjectStats'; -import SearchFiltering from '../../components/home/searchFiltering/SearchFiltering'; -import ProjectCardLists from '../../components/home/projectCardLists/ProjectCardLists'; - const Home = () => { return ( diff --git a/src/pages/user/main/HeroSection.tsx b/src/pages/user/main/HeroSection.tsx index 2bfe8c4d..9ad2ebd7 100644 --- a/src/pages/user/main/HeroSection.tsx +++ b/src/pages/user/main/HeroSection.tsx @@ -1,9 +1,9 @@ import * as S from './HeroSection.styled'; import landimg from '../../assets/landing.svg'; import DownArrow from '../../assets/arrow.svg'; -import Button from '../../components/common/Button/Button'; import { Link } from 'react-router-dom'; -import { ROUTES } from '../../constants/routes'; +import { ROUTES } from '../../../constants/user/routes'; +import Button from '../../../components/common/Button/Button'; interface HeroSectionProps { handleScrollToSection: (sectionId: number) => void; } diff --git a/src/pages/user/main/Index.tsx b/src/pages/user/main/Index.tsx index 64d06e11..5711aa2a 100644 --- a/src/pages/user/main/Index.tsx +++ b/src/pages/user/main/Index.tsx @@ -4,7 +4,7 @@ import Manage from './Manage'; import Create from './Create'; import HeroSection from './HeroSection'; import { useRef } from 'react'; -import { useInView } from '../../hooks/useInView'; +import { useInView } from '../../../hooks/user/useInView'; const Main = () => { const refs = [ diff --git a/src/pages/user/manage/myProjectList/MyProjectList.tsx b/src/pages/user/manage/myProjectList/MyProjectList.tsx index d230cf47..08945980 100644 --- a/src/pages/user/manage/myProjectList/MyProjectList.tsx +++ b/src/pages/user/manage/myProjectList/MyProjectList.tsx @@ -1,7 +1,7 @@ +import Title from '../../../../components/common/title/Title'; +import CardList from '../../../../components/user/manageProjects/CardList'; +import { useManagedProjects } from '../../../../hooks/user/useManagedProjects'; import * as S from './MyProjectList.styled'; -import Title from '../../../components/common/title/Title'; -import CardList from '../../../components/manageProjects/CardList'; -import { useManagedProjects } from '../../../hooks/useManagedProjects'; const MyProjectList = () => { const { managedProjects } = useManagedProjects(); diff --git a/src/pages/user/manage/myProjectParticipantsPass/MyProjectVolunteersPass.tsx b/src/pages/user/manage/myProjectParticipantsPass/MyProjectVolunteersPass.tsx index 8e9b4f62..50c61948 100644 --- a/src/pages/user/manage/myProjectParticipantsPass/MyProjectVolunteersPass.tsx +++ b/src/pages/user/manage/myProjectParticipantsPass/MyProjectVolunteersPass.tsx @@ -1,22 +1,21 @@ import * as S from './MyProjectVolunteersPass.styled'; -import Sidebar from '../../../components/common/sidebar/Sidebar'; import { useParams } from 'react-router-dom'; -import { applicantsMenuItems } from '../../../constants/sidebarItems'; -import InfoCard from '../../../components/common/infoCard/InfoCard'; import MainLogo from '../../../assets/mainlogo.svg'; -import { usePassNonPassList } from '../../../hooks/usePassNonPassList'; -import useGetProjectData from '../../../hooks/useGetProjectData'; -import ProjectHeader from '../../../components/manageProjects/ProjectHeader'; -import PassNonPassList from '../../../components/manageProjects/passNonPassList/PassNonPassList'; -import NoContent from '../../../components/common/noContent/NoContent'; -import SendResultButton from '../../../components/manageProjects/passNonPassList/SendResultButton'; -import { useSendResultMutation } from '../../../hooks/useSendResultMutation'; -import { useModal } from '../../../hooks/useModal'; -import Modal from '../../../components/common/modal/Modal'; -import { usePassNonPassMutation } from '../../../hooks/usePassNonPassMutation'; import { Suspense, useMemo } from 'react'; -import LoadingSpinner from '../../../components/common/loadingSpinner/LoadingSpinner'; - +import useGetProjectData from '../../../../hooks/user/useGetProjectData'; +import { usePassNonPassList } from '../../../../hooks/user/usePassNonPassList'; +import { useModal } from '../../../../hooks/useModal'; +import { useSendResultMutation } from '../../../../hooks/user/useSendResultMutation'; +import { usePassNonPassMutation } from '../../../../hooks/user/usePassNonPassMutation'; +import { applicantsMenuItems } from '../../../../constants/sidebarItems'; +import Sidebar from '../../../../components/common/sidebar/Sidebar'; +import LoadingSpinner from '../../../../components/common/loadingSpinner/LoadingSpinner'; +import InfoCard from '../../../../components/common/infoCard/InfoCard'; +import ProjectHeader from '../../../../components/user/manageProjects/ProjectHeader'; +import SendResultButton from '../../../../components/user/manageProjects/passNonPassList/SendResultButton'; +import PassNonPassList from '../../../../components/user/manageProjects/passNonPassList/PassNonPassList'; +import NoContent from '../../../../components/common/noContent/NoContent'; +import Modal from '../../../../components/common/modal/Modal'; const MyProjectVolunteersPass = () => { const { projectId } = useParams(); const { data: projectData } = useGetProjectData(Number(projectId)); diff --git a/src/pages/user/manage/myProjectVolunteer/MyProjectVolunteer.tsx b/src/pages/user/manage/myProjectVolunteer/MyProjectVolunteer.tsx index ee1b0b8d..f725c37e 100644 --- a/src/pages/user/manage/myProjectVolunteer/MyProjectVolunteer.tsx +++ b/src/pages/user/manage/myProjectVolunteer/MyProjectVolunteer.tsx @@ -1,25 +1,21 @@ import { useParams } from 'react-router-dom'; - import * as S from './MyProjectVolunteer.styled'; -import Sidebar from '../../../components/common/sidebar/Sidebar'; -import InfoCard from '../../../components/common/infoCard/InfoCard'; -import ApplicantList from '../../../components/manageProjects/applicantList/ApplicantList'; -import ApplicantInfo from '../../../components/manageProjects/applicantInfo/ApplicantInfo'; - -import useGetProjectData from '../../../hooks/useGetProjectData'; -import { useApllicantList } from '../../../hooks/useApllicantList'; - -import { applicantsMenuItems } from '../../../constants/sidebarItems'; -import { useApplicantInfo } from '../../../hooks/useApplicantInfo'; -import PassNonPassButton from '../../../components/manageProjects/applicantList/PassNonPassButton'; -import { usePassNonPassMutation } from '../../../hooks/usePassNonPassMutation'; -import NoContent from '../../../components/common/noContent/NoContent'; - import MainLogo from '../../../assets/mainlogo.svg'; -import Modal from '../../../components/common/modal/Modal'; -import { useModal } from '../../../hooks/useModal'; -import ProjectHeader from '../../../components/manageProjects/ProjectHeader'; import { useMemo } from 'react'; +import useGetProjectData from '../../../../hooks/user/useGetProjectData'; +import { useModal } from '../../../../hooks/useModal'; +import { usePassNonPassMutation } from '../../../../hooks/user/usePassNonPassMutation'; +import { applicantsMenuItems } from '../../../../constants/sidebarItems'; +import { useApllicantList } from '../../../../hooks/user/useApllicantList'; +import { useApplicantInfo } from '../../../../hooks/user/useApplicantInfo'; +import Sidebar from '../../../../components/common/sidebar/Sidebar'; +import InfoCard from '../../../../components/common/infoCard/InfoCard'; +import ProjectHeader from '../../../../components/user/manageProjects/ProjectHeader'; +import ApplicantList from '../../../../components/user/manageProjects/applicantList/ApplicantList'; +import PassNonPassButton from '../../../../components/user/manageProjects/applicantList/PassNonPassButton'; +import ApplicantInfo from '../../../../components/user/manageProjects/applicantInfo/ApplicantInfo'; +import NoContent from '../../../../components/common/noContent/NoContent'; +import Modal from '../../../../components/common/modal/Modal'; const MyProjectVolunteer = () => { const { projectId } = useParams(); diff --git a/src/pages/user/modifyProject/ModifyProject.tsx b/src/pages/user/modifyProject/ModifyProject.tsx index 1a14c42b..fbc2c6d5 100644 --- a/src/pages/user/modifyProject/ModifyProject.tsx +++ b/src/pages/user/modifyProject/ModifyProject.tsx @@ -2,17 +2,20 @@ import * as S from './ModifyProject.styled'; import { z } from 'zod'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; -import Input from '../../components/projectFormComponents/inputComponent/InputComponent'; -import { CreateProjectFormValues, FormData } from '../../models/createProject'; import { useParams } from 'react-router-dom'; -import ProjectInformationInput from '../../components/projectFormComponents/projectInformationInput/ProjectInformationInput'; -import { createProjectScheme } from '../createProject/CreateProject'; import { useEffect } from 'react'; -import { formatDate } from '../../util/format'; -import { useModal } from '../../hooks/useModal'; -import Modal from '../../components/common/modal/Modal'; -import useGetProjectData from '../../hooks/useGetProjectData'; -import useUpdateProject from '../../hooks/ProjectHooks/useUpdateProject'; +import { useModal } from '../../../hooks/useModal'; +import useGetProjectData from '../../../hooks/user/useGetProjectData'; +import useUpdateProject from '../../../hooks/user/ProjectHooks/useUpdateProject'; +import { + CreateProjectFormValues, + FormData, +} from '../../../models/createProject'; +import { createProjectScheme } from '../../../constants/user/projectConstants'; +import { formatDate } from '../../../util/formatDate'; +import Modal from '../../../components/common/modal/Modal'; +import Input from '../../../components/user/projectFormComponents/inputComponent/InputComponent'; +import ProjectInformationInput from '../../../components/user/projectFormComponents/projectInformationInput/ProjectInformationInput'; const ModifyProject = () => { const { projectId } = useParams(); diff --git a/src/pages/user/mypage/MyPage.tsx b/src/pages/user/mypage/MyPage.tsx index 16c01be2..b70c6dda 100644 --- a/src/pages/user/mypage/MyPage.tsx +++ b/src/pages/user/mypage/MyPage.tsx @@ -1,5 +1,4 @@ import { Outlet } from 'react-router-dom'; -import Sidebar from '../../components/common/sidebar/Sidebar'; import * as S from './MyPage.styled'; import { UserIcon, @@ -7,9 +6,10 @@ import { PencilSquareIcon, BellIcon, } from '@heroicons/react/24/outline'; -import { ROUTES } from '../../constants/routes'; -import { useMyProfileInfo } from '../../hooks/useMyInfo'; import loadingImg from '../../assets/loadingImg.svg'; +import { ROUTES } from '../../../constants/user/routes'; +import { useMyProfileInfo } from '../../../hooks/user/useMyInfo'; +import Sidebar from '../../../components/common/sidebar/Sidebar'; const MyPage = () => { const menuItems = [ diff --git a/src/pages/user/projectDetail/ProjectDetail.tsx b/src/pages/user/projectDetail/ProjectDetail.tsx index a3a94662..bc9b6195 100644 --- a/src/pages/user/projectDetail/ProjectDetail.tsx +++ b/src/pages/user/projectDetail/ProjectDetail.tsx @@ -1,20 +1,20 @@ import { ScrollRestoration, useNavigate, useParams } from 'react-router-dom'; -import ProjectInformation from '../../components/projectFormComponents/projectInformationText/ProjectInformation'; import * as S from './ProjectDetail.styled'; -import { formatDate } from '../../util/format'; -import MarkdownEditorView from '../../components/projectFormComponents/editor/MarkdownEditorView'; import { EyeIcon } from '@heroicons/react/24/outline'; -import useAuthStore from '../../store/authStore'; -import { ROUTES } from '../../constants/routes'; -import LoadingSpinner from '../../components/common/loadingSpinner/LoadingSpinner'; -import Modal from '../../components/common/modal/Modal'; -import { useModal } from '../../hooks/useModal'; -import { MODAL_MESSAGE } from '../../constants/modalMessage'; import { useEffect } from 'react'; -import CommentLayout from '../../components/comment/CommentLayout'; -import Avatar from '../../components/common/avatar/Avatar'; -import Button from '../../components/common/Button/Button'; -import useGetProjectData from '../../hooks/useGetProjectData'; +import { useModal } from '../../../hooks/useModal'; +import useGetProjectData from '../../../hooks/user/useGetProjectData'; +import useAuthStore from '../../../store/authStore'; +import { MODAL_MESSAGE } from '../../../constants/user/modalMessage'; +import LoadingSpinner from '../../../components/common/loadingSpinner/LoadingSpinner'; +import Modal from '../../../components/common/modal/Modal'; +import { ROUTES } from '../../../constants/user/routes'; +import Avatar from '../../../components/common/avatar/Avatar'; +import { formatDate } from '../../../util/formatDate'; +import ProjectInformation from '../../../components/user/projectFormComponents/projectInformationText/ProjectInformation'; +import MarkdownEditorView from '../../../components/user/projectFormComponents/editor/MarkdownEditorView'; +import Button from '../../../components/common/Button/Button'; +import CommentLayout from '../../../components/user/comment/CommentLayout'; const ProjectDetail = () => { const { projectId } = useParams(); diff --git a/src/pages/user/register/Register.tsx b/src/pages/user/register/Register.tsx index 39dcc482..c1e32dfc 100644 --- a/src/pages/user/register/Register.tsx +++ b/src/pages/user/register/Register.tsx @@ -1,25 +1,25 @@ -import * as S from '../login/Login.styled'; +import * as S from '../../login/Login.styled'; import { Link } from 'react-router-dom'; import Mainlogo from '../../assets/mainlogo.svg'; -import Title from '../../components/common/title/Title'; import { z } from 'zod'; import { Controller, useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import React, { useState } from 'react'; -import InputText from '../../components/auth/InputText'; import { EnvelopeIcon, KeyIcon, FaceSmileIcon, } from '@heroicons/react/24/outline'; -import useEmailVerification from '../../hooks/useEmailVerification'; -import Button from '../../components/common/Button/Button'; -import { ERROR_MESSAGES } from '../../constants/authConstants'; -import { useAuth } from '../../hooks/useAuth'; -import useNickNameVerification from '../../hooks/useNicknameVerification'; -import { ROUTES } from '../../constants/routes'; -import { useModal } from '../../hooks/useModal'; -import Modal from '../../components/common/modal/Modal'; +import { ERROR_MESSAGES } from '../../../constants/user/authConstants'; +import { useAuth } from '../../../hooks/useAuth'; +import { useModal } from '../../../hooks/useModal'; +import useEmailVerification from '../../../hooks/user/useEmailVerification'; +import useNickNameVerification from '../../../hooks/user/useNicknameVerification'; +import { ROUTES } from '../../../constants/user/routes'; +import Title from '../../../components/common/title/Title'; +import InputText from '../../../components/user/auth/InputText'; +import Button from '../../../components/common/Button/Button'; +import Modal from '../../../components/common/modal/Modal'; const registerSchema = z .object({ diff --git a/src/pages/user/userpage/UserPage.tsx b/src/pages/user/userpage/UserPage.tsx index cdbd6c1d..4fddff39 100644 --- a/src/pages/user/userpage/UserPage.tsx +++ b/src/pages/user/userpage/UserPage.tsx @@ -1,11 +1,11 @@ import { Outlet, useParams } from 'react-router-dom'; -import Sidebar from '../../components/common/sidebar/Sidebar'; import * as S from '../mypage/MyPage.styled'; import { DocumentTextIcon, UserIcon } from '@heroicons/react/24/outline'; -import { ROUTES } from '../../constants/routes'; -import { useUserProfileInfo } from '../../hooks/useUserInfo'; import loadingImg from '../../assets/loadingImg.svg'; -import ScrollWrapper from '../../components/mypage/ScrollWrapper'; +import { ROUTES } from '../../../constants/user/routes'; +import { useUserProfileInfo } from '../../../hooks/user/useUserInfo'; +import Sidebar from '../../../components/common/sidebar/Sidebar'; +import ScrollWrapper from '../../../components/user/mypage/ScrollWrapper'; const UserPage = () => { const { userId } = useParams();