import React, { FC, useState } from "react"; import { observer } from "mobx-react"; import { useRouter } from "next/router"; // icons import { LinkIcon, PencilIcon, TrashIcon } from "lucide-react"; // types import { IProjectView } from "@plane/types"; // ui import { CustomMenu, TOAST_TYPE, setToast } from "@plane/ui"; // components import { FavoriteStar } from "@/components/core"; import { DeleteProjectViewModal, CreateUpdateProjectViewModal } from "@/components/views"; // constants import { EUserProjectRoles } from "@/constants/project"; // helpers import { calculateTotalFilters } from "@/helpers/filter.helper"; import { copyUrlToClipboard } from "@/helpers/string.helper"; // hooks import { useProjectView, useUser } from "@/hooks/store"; type Props = { view: IProjectView; }; export const ViewListItemAction: FC = observer((props) => { const { view } = props; // states const [createUpdateViewModal, setCreateUpdateViewModal] = useState(false); const [deleteViewModal, setDeleteViewModal] = useState(false); // router const router = useRouter(); const { workspaceSlug, projectId } = router.query; // store const { membership: { currentProjectRole }, } = useUser(); const { addViewToFavorites, removeViewFromFavorites } = useProjectView(); // derived values const isEditingAllowed = !!currentProjectRole && currentProjectRole >= EUserProjectRoles.MEMBER; // @ts-expect-error key types are not compatible const totalFilters = calculateTotalFilters(view.filters ?? {}); // handlers const handleAddToFavorites = () => { if (!workspaceSlug || !projectId) return; addViewToFavorites(workspaceSlug.toString(), projectId.toString(), view.id); }; const handleRemoveFromFavorites = () => { if (!workspaceSlug || !projectId) return; removeViewFromFavorites(workspaceSlug.toString(), projectId.toString(), view.id); }; const handleCopyText = (e: React.MouseEvent) => { e.stopPropagation(); e.preventDefault(); copyUrlToClipboard(`${workspaceSlug}/projects/${projectId}/views/${view.id}`).then(() => { setToast({ type: TOAST_TYPE.SUCCESS, title: "Link Copied!", message: "View link copied to clipboard.", }); }); }; return ( <> {workspaceSlug && projectId && view && ( setCreateUpdateViewModal(false)} workspaceSlug={workspaceSlug.toString()} projectId={projectId.toString()} data={view} /> )} setDeleteViewModal(false)} />

{totalFilters} {totalFilters === 1 ? "filter" : "filters"}

{isEditingAllowed && ( { e.preventDefault(); e.stopPropagation(); if (view.is_favorite) handleRemoveFromFavorites(); else handleAddToFavorites(); }} selected={view.is_favorite} /> )} {isEditingAllowed && ( <> { e.preventDefault(); e.stopPropagation(); setCreateUpdateViewModal(true); }} > Edit View { e.preventDefault(); e.stopPropagation(); setDeleteViewModal(true); }} > Delete View )} Copy view link ); });