import { useMemo } from "react"; // hooks import { useEventTracker, useIssueDetail } from "hooks/store"; // components import { IssueAttachmentUpload, IssueAttachmentsList, TAttachmentOperations } from "components/issues"; // ui import { TOAST_TYPE, setPromiseToast, setToast } from "@plane/ui"; type Props = { disabled: boolean; issueId: string; projectId: string; workspaceSlug: string; }; export const PeekOverviewIssueAttachments: React.FC = (props) => { const { disabled, issueId, projectId, workspaceSlug } = props; // store hooks const { captureIssueEvent } = useEventTracker(); const { attachment: { createAttachment, removeAttachment }, } = useIssueDetail(); const handleAttachmentOperations: TAttachmentOperations = useMemo( () => ({ create: async (data: FormData) => { try { const attachmentUploadPromise = createAttachment(workspaceSlug, projectId, issueId, data); setPromiseToast(attachmentUploadPromise, { loading: "Uploading attachment...", success: { title: "Attachment uploaded", message: () => "The attachment has been successfully uploaded", }, error: { title: "Attachment not uploaded", message: () => "The attachment could not be uploaded", }, }); const res = await attachmentUploadPromise; captureIssueEvent({ eventName: "Issue attachment added", payload: { id: issueId, state: "SUCCESS", element: "Issue detail page" }, updates: { changed_property: "attachment", change_details: res.id, }, }); } catch (error) { captureIssueEvent({ eventName: "Issue attachment added", payload: { id: issueId, state: "FAILED", element: "Issue detail page" }, }); } }, remove: async (attachmentId: string) => { try { if (!workspaceSlug || !projectId || !issueId) throw new Error("Missing required fields"); await removeAttachment(workspaceSlug, projectId, issueId, attachmentId); setToast({ message: "The attachment has been successfully removed", type: TOAST_TYPE.SUCCESS, title: "Attachment removed", }); captureIssueEvent({ eventName: "Issue attachment deleted", payload: { id: issueId, state: "SUCCESS", element: "Issue detail page" }, updates: { changed_property: "attachment", change_details: "", }, }); } catch (error) { captureIssueEvent({ eventName: "Issue attachment deleted", payload: { id: issueId, state: "FAILED", element: "Issue detail page" }, updates: { changed_property: "attachment", change_details: "", }, }); setToast({ message: "The Attachment could not be removed", type: TOAST_TYPE.ERROR, title: "Attachment not removed", }); } }, }), [workspaceSlug, projectId, issueId, captureIssueEvent, createAttachment, removeAttachment] ); return (
Attachments
); };