Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ export const IssueDetailWidgetModals: FC<Props> = observer((props) => {
const {
isIssueLinkModalOpen,
toggleIssueLinkModal: toggleIssueLinkModalStore,
setIssueLinkData,
isCreateIssueModalOpen,
toggleCreateIssueModal,
isSubIssuesModalOpen,
Expand Down Expand Up @@ -88,6 +89,7 @@ export const IssueDetailWidgetModals: FC<Props> = observer((props) => {
const handleIssueLinkModalOnClose = () => {
toggleIssueLinkModalStore(false);
setLastWidgetAction("links");
setIssueLinkData(null);
};

const handleRelationOnClose = () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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";

Expand All @@ -19,7 +20,6 @@ export type TIssueLinkCreateEditModal = {
isModalOpen: boolean;
handleOnClose?: () => void;
linkOperations: TLinkOperationsModal;
preloadedData?: TIssueLinkCreateFormFieldOptions | null;
};

const defaultValues: TIssueLinkCreateFormFieldOptions = {
Expand All @@ -29,7 +29,7 @@ const defaultValues: TIssueLinkCreateFormFieldOptions = {

export const IssueLinkCreateUpdateModal: FC<TIssueLinkCreateEditModal> = (props) => {
// props
const { isModalOpen, handleOnClose, linkOperations, preloadedData } = props;
const { isModalOpen, handleOnClose, linkOperations } = props;

// react hook form
const {
Expand All @@ -41,12 +41,11 @@ export const IssueLinkCreateUpdateModal: FC<TIssueLinkCreateEditModal> = (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) => {
Expand Down
26 changes: 7 additions & 19 deletions web/core/components/issues/issue-detail/links/link-detail.tsx
Original file line number Diff line number Diff line change
@@ -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";
Expand All @@ -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;
Expand All @@ -27,34 +27,22 @@ export const IssueLinkDetail: FC<TIssueLinkDetail> = (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 (
<div key={linkId}>
<IssueLinkCreateUpdateModal
isModalOpen={isIssueLinkModalOpen}
handleOnClose={handleOnClose}
linkOperations={linkOperations}
preloadedData={linkDetail}
/>

<div className="relative flex flex-col rounded-md bg-custom-background-90 p-2.5">
<div
className="flex w-full cursor-pointer items-start justify-between gap-2"
Expand Down
28 changes: 9 additions & 19 deletions web/core/components/issues/issue-detail/links/link-item.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"use client";

import { FC, useState } from "react";
import { FC } from "react";
import { observer } from "mobx-react";
import { Pencil, Trash2, LinkIcon, ExternalLink } from "lucide-react";
// ui
import { Tooltip, TOAST_TYPE, setToast, CustomMenu } from "@plane/ui";
Expand All @@ -10,44 +11,33 @@ import { copyTextToClipboard } from "@/helpers/string.helper";
// hooks
import { useIssueDetail } 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";

type TIssueLinkItem = {
linkId: string;
linkOperations: TLinkOperationsModal;
isNotAllowed: boolean;
};

export const IssueLinkItem: FC<TIssueLinkItem> = (props) => {
export const IssueLinkItem: FC<TIssueLinkItem> = 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 (
<>
<IssueLinkCreateUpdateModal
isModalOpen={isIssueLinkModalOpen}
handleOnClose={handleOnClose}
linkOperations={linkOperations}
preloadedData={linkDetail}
/>
<div
key={linkId}
className="col-span-12 lg:col-span-6 xl:col-span-4 2xl:col-span-3 3xl:col-span-2 flex items-center justify-between gap-3 h-8 flex-shrink-0 px-3 bg-custom-background-90 border-[0.5px] border-custom-border-200 rounded"
Expand Down Expand Up @@ -116,4 +106,4 @@ export const IssueLinkItem: FC<TIssueLinkItem> = (props) => {
</div>
</>
);
};
});
6 changes: 6 additions & 0 deletions web/core/store/issue/issue-details/root.store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ export interface IIssueDetail
// observables
peekIssue: TPeekIssue | undefined;
relationKey: TIssueRelationTypes | null;
issueLinkData: TIssueLink | null;
issueCrudOperationState: TIssueCrudOperationState;
openWidgets: TIssueDetailWidget[];
lastWidgetAction: TIssueDetailWidget | null;
Expand All @@ -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;
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -147,6 +150,7 @@ export class IssueDetail implements IIssueDetail {
// observables
peekIssue: observable,
relationKey: observable,
issueLinkData: observable,
issueCrudOperationState: observable,
isCreateIssueModalOpen: observable,
isIssueLinkModalOpen: observable.ref,
Expand All @@ -162,6 +166,7 @@ export class IssueDetail implements IIssueDetail {
isAnyModalOpen: computed,
// action
setPeekIssue: action,
setIssueLinkData: action,
toggleCreateIssueModal: action,
toggleIssueLinkModal: action,
toggleParentIssueModal: action,
Expand Down Expand Up @@ -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);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Avoid assignment within an expression.

The assignment within the expression is confusing. Consider refactoring to improve readability.

-  setIssueLinkData = (issueLinkData: TIssueLink | null) => (this.issueLinkData = issueLinkData);
+  setIssueLinkData = (issueLinkData: TIssueLink | null) => {
+    this.issueLinkData = issueLinkData;
+  };
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
setIssueLinkData = (issueLinkData: TIssueLink | null) => (this.issueLinkData = issueLinkData);
setIssueLinkData = (issueLinkData: TIssueLink | null) => {
this.issueLinkData = issueLinkData;
};
Tools
Biome

[error] 241-241: The assignment should not be in an expression.

The use of assignments in expressions is confusing.
Expressions are often considered as side-effect free.

(lint/suspicious/noAssignInExpressions)


// issue
fetchIssue = async (
Expand Down