From 9b60604291a55a3de7f3ed23e9be02ab58ee1821 Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia Date: Thu, 12 Oct 2023 01:35:08 +0530 Subject: [PATCH] chore: project card revamp and refactor --- web/components/project/card.tsx | 153 +++++++++++++------------------- 1 file changed, 63 insertions(+), 90 deletions(-) diff --git a/web/components/project/card.tsx b/web/components/project/card.tsx index 0c92ad3f16a..57e27d060c4 100644 --- a/web/components/project/card.tsx +++ b/web/components/project/card.tsx @@ -1,17 +1,14 @@ import React, { useState } from "react"; import { useRouter } from "next/router"; import Link from "next/link"; -import { mutate } from "swr"; import { observer } from "mobx-react-lite"; +import { useMobxStore } from "lib/mobx/store-provider"; +import { RootStore } from "store/root"; // icons -import { CalendarDaysIcon, LinkIcon, PencilIcon, PlusIcon, StarIcon, TrashIcon } from "@heroicons/react/24/outline"; -import { Star } from "lucide-react"; -// services -import projectService from "services/project.service"; +import { CalendarDays, Link2Icon, Pencil, Plus, Star, Trash2 } from "lucide-react"; // hooks import useToast from "hooks/use-toast"; // ui -import { CustomMenu } from "components/ui"; import { Tooltip } from "@plane/ui"; // helpers import { renderShortDateWithYearFormat } from "helpers/date-time.helper"; @@ -19,8 +16,6 @@ import { copyTextToClipboard, truncateText } from "helpers/string.helper"; import { renderEmoji } from "helpers/emoji.helper"; // types import type { IProject } from "types"; -// fetch-keys -import { PROJECTS_LIST } from "constants/fetch-keys"; // components import { DeleteProjectModal, JoinProjectModal } from "components/project"; @@ -39,61 +34,33 @@ export const ProjectCard: React.FC = observer((props) => { const [deleteProjectModalOpen, setDeleteProjectModal] = useState(false); const [joinProjectModalOpen, setJoinProjectModal] = useState(false); + const { project: projectStore }: RootStore = useMobxStore(); + const isOwner = project.member_role === 20; const isMember = project.member_role === 15; const handleAddToFavorites = () => { if (!workspaceSlug) return; - mutate( - PROJECTS_LIST(workspaceSlug as string, { is_favorite: "all" }), - (prevData) => (prevData ?? []).map((p) => (p.id === project.id ? { ...p, is_favorite: true } : p)), - false - ); - - projectService - .addProjectToFavorites(workspaceSlug as string, project.id) - .then(() => { - setToastAlert({ - type: "success", - title: "Success!", - message: "Successfully added the project to favorites.", - }); - }) - .catch(() => { - setToastAlert({ - type: "error", - title: "Error!", - message: "Couldn't remove the project from favorites. Please try again.", - }); + projectStore.addProjectToFavorites(workspaceSlug.toString(), project.id).catch(() => { + setToastAlert({ + type: "error", + title: "Error!", + message: "Couldn't remove the project from favorites. Please try again.", }); + }); }; const handleRemoveFromFavorites = () => { if (!workspaceSlug || !project) return; - mutate( - PROJECTS_LIST(workspaceSlug as string, { is_favorite: "all" }), - (prevData) => (prevData ?? []).map((p) => (p.id === project.id ? { ...p, is_favorite: false } : p)), - false - ); - - projectService - .removeProjectFromFavorites(workspaceSlug as string, project.id) - .then(() => { - setToastAlert({ - type: "success", - title: "Success!", - message: "Successfully removed the project from favorites.", - }); - }) - .catch(() => { - setToastAlert({ - type: "error", - title: "Error!", - message: "Couldn't remove the project from favorites. Please try again.", - }); + projectStore.removeProjectFromFavorites(workspaceSlug.toString(), project.id).catch(() => { + setToastAlert({ + type: "error", + title: "Error!", + message: "Couldn't remove the project from favorites. Please try again.", }); + }); }; const handleCopyText = () => { @@ -149,7 +116,7 @@ export const ProjectCard: React.FC = observer((props) => { }} className="flex cursor-pointer items-center gap-1 rounded bg-green-600 px-2 py-1 text-xs" > - + Select to Join ) : ( @@ -157,10 +124,23 @@ export const ProjectCard: React.FC = observer((props) => { )} -
- - - +
+
{project.emoji ? ( @@ -189,50 +169,43 @@ export const ProjectCard: React.FC = observer((props) => { position="bottom" >
- + {renderShortDateWithYearFormat(project.created_at)}
{project.is_member ? ( -
+
+
+ +
{(isOwner || isMember) && ( - - + + )} - - {isOwner && ( - setDeleteProjectModal(true)}> - - - Delete project - - - )} - {project.is_favorite ? ( - - - - Remove from favorites - - - ) : ( - - - - Add to favorites - - - )} - - - - Copy project link - - - + {isOwner && ( +
+ +
+ )}
) : null}