diff --git a/src/features/projects/hook/useLike.tsx b/src/features/projects/hook/useLike.tsx index 1b70ae6..41a6f19 100644 --- a/src/features/projects/hook/useLike.tsx +++ b/src/features/projects/hook/useLike.tsx @@ -1,4 +1,5 @@ import { useState } from "react"; +import { useParams } from "react-router-dom"; import useProjectLike from "@features/projects/queries/useProjectLike"; import useProjectUnLike from "@features/projects/queries/useProjectUnLike"; @@ -7,17 +8,11 @@ import { useAuthStore } from "@shared/stores/authStore"; interface LikeResult { isLike: boolean; - like: () => void; - unlike: () => void; + likeFn: () => void; } -const useLike = ({ - projectID, - likedUsers, -}: { - projectID: string; - likedUsers: string[]; -}): LikeResult => { +const useLike = ({ likedUsers }: { likedUsers: string[] }): LikeResult => { + const { id: projectID } = useParams(); const user = useAuthStore((state) => state.user); const { mutate: updateLike, isPending: likePending } = useProjectLike(); const { mutate: updateUnLike, isPending: unLikePending } = useProjectUnLike(); @@ -25,30 +20,31 @@ const useLike = ({ const initLike = user && likedUsers.includes(user.uid); const [isLike, setIsLike] = useState(initLike || false); - const like = (): void => { + const updateLikeStatus = (): void => { if (!projectID) return; - if (likePending || unLikePending) { - alert("동작이 너무 빠릅니다. 잠시 후에 시도해주십시오."); + + if (!user) { + alert("로그인 해주세요."); return; } - setIsLike(true); - updateLike(projectID); - }; - const unlike = (): void => { - if (!projectID) return; if (likePending || unLikePending) { alert("동작이 너무 빠릅니다. 잠시 후에 시도해주십시오."); return; } - setIsLike(false); - updateUnLike(projectID); + + if (!isLike) { + setIsLike(true); + updateLike(projectID); + } else { + setIsLike(false); + updateUnLike(projectID); + } }; return { isLike, - like, - unlike, + likeFn: updateLikeStatus, }; }; diff --git a/src/features/projects/ui/ProjectDelete.tsx b/src/features/projects/ui/ProjectDelete.tsx index 6608695..7a64e37 100644 --- a/src/features/projects/ui/ProjectDelete.tsx +++ b/src/features/projects/ui/ProjectDelete.tsx @@ -20,7 +20,7 @@ const ProjectDelete = ({ return ( - 삭제 + 프로젝트 삭제 ); }; diff --git a/src/features/projects/ui/ProjectLike.tsx b/src/features/projects/ui/ProjectLike.tsx index d722906..419ae31 100644 --- a/src/features/projects/ui/ProjectLike.tsx +++ b/src/features/projects/ui/ProjectLike.tsx @@ -3,19 +3,19 @@ import FavoriteBorderIcon from "@mui/icons-material/FavoriteBorder"; import FavoriteOutlinedIcon from "@mui/icons-material/FavoriteOutlined"; import ShareIcon from "@mui/icons-material/Share"; import { Box, styled } from "@mui/material"; -import { useParams } from "react-router-dom"; import useLike from "@features/projects/hook/useLike"; -import { getStatusClassname } from "@shared/libs/utils/projectDetail"; +import { + getStatusClassname, + shareProjectUrl, +} from "@shared/libs/utils/projectDetail"; import type { ProjectListRes } from "@shared/types/project"; type ProjectLikeType = Pick; const ProjectLike = ({ values }: { values: ProjectLikeType }): JSX.Element => { - const { id } = useParams(); - const { like, unlike, isLike } = useLike({ - projectID: id || "", + const { likeFn, isLike } = useLike({ likedUsers: values.likedUsers, }); @@ -26,14 +26,14 @@ const ProjectLike = ({ values }: { values: ProjectLikeType }): JSX.Element => { - + {isLike ? ( - + ) : ( - + )} - + diff --git a/src/features/projects/ui/ProjectModify.tsx b/src/features/projects/ui/ProjectModify.tsx new file mode 100644 index 0000000..3684d40 --- /dev/null +++ b/src/features/projects/ui/ProjectModify.tsx @@ -0,0 +1,36 @@ +import { Box, styled, Typography } from "@mui/material"; +import type { JSX } from "react"; + +const ProjectModify = (): JSX.Element => { + const handleDeleteBtn = (): void => { + // Navigate '/project/insert로 이동' + // state로 폼 넘김 + // 이푸 state 존재 여부에 따라 등록, 수정 나눌 예정 + // form을 나눈다면 여기서 나눠서 보낼 수 있도록 ... + alert("아직없어염.."); + }; + + return ( + + 프로젝트 수정 + + ); +}; + +export default ProjectModify; + +const MessageBtn = styled(Box)` + flex: 1; + display: flex; + align-items: center; + justify-content: center; + height: 4rem; + border-radius: 4px; + border: 1px solid #dddddd; + transition: background-color 0.3s ease; + cursor: pointer; + + &:hover { + background-color: #f4f4f4; + } +`; diff --git a/src/pages/project-detail/ui/ProjectDetailPage.tsx b/src/pages/project-detail/ui/ProjectDetailPage.tsx index ba68425..23355ea 100644 --- a/src/pages/project-detail/ui/ProjectDetailPage.tsx +++ b/src/pages/project-detail/ui/ProjectDetailPage.tsx @@ -5,6 +5,7 @@ import { useNavigate, useParams } from "react-router-dom"; import ProjectApplyForm from "@features/projects/ui/ProjectApplyForm"; import ProjectDelete from "@features/projects/ui/ProjectDelete"; import ProjectLike from "@features/projects/ui/ProjectLike"; +import ProjectModify from "@features/projects/ui/ProjectModify"; import useProjectsItem from "@entities/projects/queries/useProjectsItem"; import ProjectApply from "@entities/projects/ui/post-info/ProjectApply"; @@ -20,6 +21,7 @@ import TechStack from "@entities/projects/ui/projects-detail/TechStack"; import { useAuthStore } from "@shared/stores/authStore"; import type { RecruitmentStatus } from "@shared/types/project"; +import LoadingSpinner from "@shared/ui/loading-spinner/LoadingSpinner"; const ProjectDetailPage = (): JSX.Element | null => { const { id } = useParams(); @@ -78,7 +80,11 @@ const ProjectDetailPage = (): JSX.Element | null => { }; if (isLoading) { - return
로딩중
; + return ( + + + + ); } if (!project || isError) { Navigate("/error"); @@ -117,8 +123,11 @@ const ProjectDetailPage = (): JSX.Element | null => { - {user?.uid === project.projectOwner.id ? ( - + {user?.uid !== project.projectOwner.id ? ( + + + + ) : ( )} diff --git a/src/shared/libs/utils/projectDetail.ts b/src/shared/libs/utils/projectDetail.ts index 1f93b5a..cdb913f 100644 --- a/src/shared/libs/utils/projectDetail.ts +++ b/src/shared/libs/utils/projectDetail.ts @@ -16,3 +16,10 @@ export const formatDate = (date?: string | Timestamp): string => { } return date; }; + +export const shareProjectUrl = (): void => { + navigator.clipboard + .writeText(window.location.href) + .then(() => alert("URL이 복사되었습니다.")) + .catch(() => alert("복사 실패")); +};