From 88fd0ae9aec63faea6bc5674c51732483b8a6983 Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia Date: Fri, 19 Jul 2024 13:34:06 +0530 Subject: [PATCH] fix: issue link edit modal and mutation fix --- .../issue-detail-widget-modals.tsx | 2 ++ .../links/create-update-link-modal.tsx | 11 ++++---- .../issues/issue-detail/links/link-detail.tsx | 26 +++++------------ .../issues/issue-detail/links/link-item.tsx | 28 ++++++------------- .../store/issue/issue-details/root.store.ts | 6 ++++ 5 files changed, 29 insertions(+), 44 deletions(-) diff --git a/web/core/components/issues/issue-detail-widgets/issue-detail-widget-modals.tsx b/web/core/components/issues/issue-detail-widgets/issue-detail-widget-modals.tsx index 42bf809b1b8..cc46b80c34d 100644 --- a/web/core/components/issues/issue-detail-widgets/issue-detail-widget-modals.tsx +++ b/web/core/components/issues/issue-detail-widgets/issue-detail-widget-modals.tsx @@ -25,6 +25,7 @@ export const IssueDetailWidgetModals: FC = observer((props) => { const { isIssueLinkModalOpen, toggleIssueLinkModal: toggleIssueLinkModalStore, + setIssueLinkData, isCreateIssueModalOpen, toggleCreateIssueModal, isSubIssuesModalOpen, @@ -88,6 +89,7 @@ export const IssueDetailWidgetModals: FC = observer((props) => { const handleIssueLinkModalOnClose = () => { toggleIssueLinkModalStore(false); setLastWidgetAction("links"); + setIssueLinkData(null); }; const handleRelationOnClose = () => { diff --git a/web/core/components/issues/issue-detail/links/create-update-link-modal.tsx b/web/core/components/issues/issue-detail/links/create-update-link-modal.tsx index 684ef01c8e5..808fa6dd429 100644 --- a/web/core/components/issues/issue-detail/links/create-update-link-modal.tsx +++ b/web/core/components/issues/issue-detail/links/create-update-link-modal.tsx @@ -6,6 +6,7 @@ import { Dialog, Transition } from "@headlessui/react"; import type { TIssueLinkEditableFields } from "@plane/types"; // ui import { Button, Input } from "@plane/ui"; +import { useIssueDetail } from "@/hooks/store"; // types import { TLinkOperations } from "./root"; @@ -19,7 +20,6 @@ export type TIssueLinkCreateEditModal = { isModalOpen: boolean; handleOnClose?: () => void; linkOperations: TLinkOperationsModal; - preloadedData?: TIssueLinkCreateFormFieldOptions | null; }; const defaultValues: TIssueLinkCreateFormFieldOptions = { @@ -29,7 +29,7 @@ const defaultValues: TIssueLinkCreateFormFieldOptions = { export const IssueLinkCreateUpdateModal: FC = (props) => { // props - const { isModalOpen, handleOnClose, linkOperations, preloadedData } = props; + const { isModalOpen, handleOnClose, linkOperations } = props; // react hook form const { @@ -41,12 +41,11 @@ export const IssueLinkCreateUpdateModal: FC = (props) defaultValues, }); + const { issueLinkData: preloadedData, setIssueLinkData } = useIssueDetail(); + const onClose = () => { + setIssueLinkData(null); if (handleOnClose) handleOnClose(); - const timeout = setTimeout(() => { - reset(preloadedData ? preloadedData : defaultValues); - clearTimeout(timeout); - }, 500); }; const handleFormSubmit = async (formData: TIssueLinkCreateFormFieldOptions) => { diff --git a/web/core/components/issues/issue-detail/links/link-detail.tsx b/web/core/components/issues/issue-detail/links/link-detail.tsx index 489ec2f1d73..286e501b7c6 100644 --- a/web/core/components/issues/issue-detail/links/link-detail.tsx +++ b/web/core/components/issues/issue-detail/links/link-detail.tsx @@ -1,6 +1,6 @@ "use client"; -import { FC, useState } from "react"; +import { FC } from "react"; // hooks // ui import { Pencil, Trash2, LinkIcon, ExternalLink } from "lucide-react"; @@ -12,7 +12,7 @@ import { calculateTimeAgo } from "@/helpers/date-time.helper"; import { copyTextToClipboard } from "@/helpers/string.helper"; import { useIssueDetail, useMember } from "@/hooks/store"; import { usePlatformOS } from "@/hooks/use-platform-os"; -import { IssueLinkCreateUpdateModal, TLinkOperationsModal } from "./create-update-link-modal"; +import { TLinkOperationsModal } from "./create-update-link-modal"; export type TIssueLinkDetail = { linkId: string; @@ -27,34 +27,22 @@ export const IssueLinkDetail: FC = (props) => { const { toggleIssueLinkModal: toggleIssueLinkModalStore, link: { getLinkById }, + setIssueLinkData, } = useIssueDetail(); const { getUserDetails } = useMember(); + const { isMobile } = usePlatformOS(); + const linkDetail = getLinkById(linkId); + if (!linkDetail) return <>; - // state - const [isIssueLinkModalOpen, setIsIssueLinkModalOpen] = useState(false); const toggleIssueLinkModal = (modalToggle: boolean) => { toggleIssueLinkModalStore(modalToggle); - setIsIssueLinkModalOpen(modalToggle); + setIssueLinkData(linkDetail); }; - const { isMobile } = usePlatformOS(); - const linkDetail = getLinkById(linkId); - if (!linkDetail) return <>; const createdByDetails = getUserDetails(linkDetail.created_by_id); - const handleOnClose = () => { - toggleIssueLinkModal(false); - }; - return (
- -
= (props) => { +export const IssueLinkItem: FC = observer((props) => { // props const { linkId, linkOperations, isNotAllowed } = props; // hooks const { toggleIssueLinkModal: toggleIssueLinkModalStore, + setIssueLinkData, link: { getLinkById }, } = useIssueDetail(); - - // state - const [isIssueLinkModalOpen, setIsIssueLinkModalOpen] = useState(false); - const toggleIssueLinkModal = (modalToggle: boolean) => { - toggleIssueLinkModalStore(modalToggle); - setIsIssueLinkModalOpen(modalToggle); - }; const { isMobile } = usePlatformOS(); const linkDetail = getLinkById(linkId); if (!linkDetail) return <>; - const handleOnClose = () => { - toggleIssueLinkModal(false); + const toggleIssueLinkModal = (modalToggle: boolean) => { + toggleIssueLinkModalStore(modalToggle); + setIssueLinkData(linkDetail); }; return ( <> -
= (props) => {
); -}; +}); diff --git a/web/core/store/issue/issue-details/root.store.ts b/web/core/store/issue/issue-details/root.store.ts index e16a41a4a0e..88ecac41a82 100644 --- a/web/core/store/issue/issue-details/root.store.ts +++ b/web/core/store/issue/issue-details/root.store.ts @@ -59,6 +59,7 @@ export interface IIssueDetail // observables peekIssue: TPeekIssue | undefined; relationKey: TIssueRelationTypes | null; + issueLinkData: TIssueLink | null; issueCrudOperationState: TIssueCrudOperationState; openWidgets: TIssueDetailWidget[]; lastWidgetAction: TIssueDetailWidget | null; @@ -76,6 +77,7 @@ export interface IIssueDetail getIsIssuePeeked: (issueId: string) => boolean; // actions setPeekIssue: (peekIssue: TPeekIssue | undefined) => void; + setIssueLinkData: (issueLinkData: TIssueLink | null) => void; toggleCreateIssueModal: (value: boolean) => void; toggleIssueLinkModal: (value: boolean) => void; toggleParentIssueModal: (issueId: string | null) => void; @@ -107,6 +109,7 @@ export class IssueDetail implements IIssueDetail { // observables peekIssue: TPeekIssue | undefined = undefined; relationKey: TIssueRelationTypes | null = null; + issueLinkData: TIssueLink | null = null; issueCrudOperationState: TIssueCrudOperationState = { create: { toggle: false, @@ -147,6 +150,7 @@ export class IssueDetail implements IIssueDetail { // observables peekIssue: observable, relationKey: observable, + issueLinkData: observable, issueCrudOperationState: observable, isCreateIssueModalOpen: observable, isIssueLinkModalOpen: observable.ref, @@ -162,6 +166,7 @@ export class IssueDetail implements IIssueDetail { isAnyModalOpen: computed, // action setPeekIssue: action, + setIssueLinkData: action, toggleCreateIssueModal: action, toggleIssueLinkModal: action, toggleParentIssueModal: action, @@ -233,6 +238,7 @@ export class IssueDetail implements IIssueDetail { this.openWidgets = this.openWidgets.filter((s) => s !== state); else this.openWidgets = [state, ...this.openWidgets]; }; + setIssueLinkData = (issueLinkData: TIssueLink | null) => (this.issueLinkData = issueLinkData); // issue fetchIssue = async (