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("복사 실패"));
+};