mirror of
https://github.com/gosticks/plane.git
synced 2025-10-16 12:45:33 +00:00
* chore: package code refactoring * chore: component restructuring and refactor * chore: comment create improvement
138 lines
4.4 KiB
TypeScript
138 lines
4.4 KiB
TypeScript
"use-client";
|
|
import { FC, useEffect } from "react";
|
|
import { observer } from "mobx-react";
|
|
// types
|
|
import { TNameDescriptionLoader } from "@plane/types";
|
|
// components
|
|
import { IssueParentDetail, TIssueOperations } from "@/components/issues";
|
|
// helpers
|
|
import { getTextContent } from "@/helpers/editor.helper";
|
|
// store hooks
|
|
import { useIssueDetail, useProject, useUser } from "@/hooks/store";
|
|
// hooks
|
|
import useReloadConfirmations from "@/hooks/use-reload-confirmation";
|
|
// plane web components
|
|
import { DeDupeIssuePopoverRoot } from "@/plane-web/components/de-dupe";
|
|
import { IssueTypeSwitcher } from "@/plane-web/components/issues";
|
|
// local components
|
|
import { useDebouncedDuplicateIssues } from "@/plane-web/hooks/use-debounced-duplicate-issues";
|
|
import { IssueDescriptionInput } from "../description-input";
|
|
import { IssueReaction } from "../issue-detail/reactions";
|
|
import { IssueTitleInput } from "../title-input";
|
|
|
|
interface IPeekOverviewIssueDetails {
|
|
workspaceSlug: string;
|
|
projectId: string;
|
|
issueId: string;
|
|
issueOperations: TIssueOperations;
|
|
disabled: boolean;
|
|
isArchived: boolean;
|
|
isSubmitting: TNameDescriptionLoader;
|
|
setIsSubmitting: (value: TNameDescriptionLoader) => void;
|
|
}
|
|
|
|
export const PeekOverviewIssueDetails: FC<IPeekOverviewIssueDetails> = observer((props) => {
|
|
const { workspaceSlug, issueId, issueOperations, disabled, isArchived, isSubmitting, setIsSubmitting } = props;
|
|
// store hooks
|
|
const { data: currentUser } = useUser();
|
|
const {
|
|
issue: { getIssueById },
|
|
} = useIssueDetail();
|
|
const { getProjectById } = useProject();
|
|
// hooks
|
|
const { setShowAlert } = useReloadConfirmations(isSubmitting === "submitting");
|
|
|
|
useEffect(() => {
|
|
if (isSubmitting === "submitted") {
|
|
setShowAlert(false);
|
|
setTimeout(async () => {
|
|
setIsSubmitting("saved");
|
|
}, 2000);
|
|
} else if (isSubmitting === "submitting") {
|
|
setShowAlert(true);
|
|
}
|
|
}, [isSubmitting, setShowAlert, setIsSubmitting]);
|
|
|
|
// derived values
|
|
const issue = issueId ? getIssueById(issueId) : undefined;
|
|
const projectDetails = issue?.project_id ? getProjectById(issue?.project_id) : undefined;
|
|
// debounced duplicate issues swr
|
|
const { duplicateIssues } = useDebouncedDuplicateIssues(
|
|
workspaceSlug,
|
|
projectDetails?.workspace.toString(),
|
|
projectDetails?.id,
|
|
{
|
|
name: issue?.name,
|
|
description_html: getTextContent(issue?.description_html),
|
|
issueId: issue?.id,
|
|
}
|
|
);
|
|
|
|
if (!issue || !issue.project_id) return <></>;
|
|
|
|
const issueDescription =
|
|
issue.description_html !== undefined || issue.description_html !== null
|
|
? issue.description_html != ""
|
|
? issue.description_html
|
|
: "<p></p>"
|
|
: undefined;
|
|
|
|
return (
|
|
<div className="space-y-2">
|
|
{issue.parent_id && (
|
|
<IssueParentDetail
|
|
workspaceSlug={workspaceSlug}
|
|
projectId={issue.project_id}
|
|
issueId={issueId}
|
|
issue={issue}
|
|
issueOperations={issueOperations}
|
|
/>
|
|
)}
|
|
<div className="flex items-center justify-between gap-2">
|
|
<IssueTypeSwitcher issueId={issueId} disabled={isArchived || disabled} />
|
|
{duplicateIssues?.length > 0 && (
|
|
<DeDupeIssuePopoverRoot
|
|
workspaceSlug={workspaceSlug}
|
|
projectId={issue.project_id}
|
|
rootIssueId={issueId}
|
|
issues={duplicateIssues}
|
|
issueOperations={issueOperations}
|
|
/>
|
|
)}
|
|
</div>
|
|
<IssueTitleInput
|
|
workspaceSlug={workspaceSlug}
|
|
projectId={issue.project_id}
|
|
issueId={issue.id}
|
|
isSubmitting={isSubmitting}
|
|
setIsSubmitting={(value) => setIsSubmitting(value)}
|
|
issueOperations={issueOperations}
|
|
disabled={disabled}
|
|
value={issue.name}
|
|
containerClassName="-ml-3"
|
|
/>
|
|
|
|
<IssueDescriptionInput
|
|
workspaceSlug={workspaceSlug}
|
|
projectId={issue.project_id}
|
|
issueId={issue.id}
|
|
initialValue={issueDescription}
|
|
disabled={disabled}
|
|
issueOperations={issueOperations}
|
|
setIsSubmitting={(value) => setIsSubmitting(value)}
|
|
containerClassName="-ml-3 border-none"
|
|
/>
|
|
|
|
{currentUser && (
|
|
<IssueReaction
|
|
workspaceSlug={workspaceSlug}
|
|
projectId={issue.project_id}
|
|
issueId={issueId}
|
|
currentUser={currentUser}
|
|
disabled={isArchived}
|
|
/>
|
|
)}
|
|
</div>
|
|
);
|
|
});
|