diff --git a/components/inbox-mail/InboxMailAdminPanel.tsx b/components/inbox-mail/InboxMailAdminPanel.tsx index 134670c..53f52f3 100644 --- a/components/inbox-mail/InboxMailAdminPanel.tsx +++ b/components/inbox-mail/InboxMailAdminPanel.tsx @@ -1,8 +1,9 @@ -import React, { useCallback } from "react"; -import { InboxMailThread, InboxMailThreadSupportProgressState, User } from "./types-mail"; -import { IconExternalLink, IconProgressCheck } from "@tabler/icons-react"; +import React, { useCallback, useEffect, useState } from "react"; +import { InboxMailThread, InboxMailThreadSupportProgressState, JumpDestination, User } from "./types-mail"; +import { IconExternalLink, IconProgressCheck, IconAlertTriangle } from "@tabler/icons-react"; import KernDropdown from "../KernDropdown"; -import { addUserToOrganization, removeUserFromOrganization, updateInboxMailThreadsUnreadByContent, updateInboxMailThreadsUnreadByProject } from "./service-mail"; +import { addUserToOrganization, removeUserFromOrganization, updateInboxMailThreadsUnreadByContent, updateInboxMailThreadsUnreadByProject, updateInboxMailThreadUnreadLast, deleteInboxMailThreadsSimilar } from "./service-mail"; +import { Tooltip } from "@nextui-org/react"; import KernButton from "../kern-button/KernButton"; @@ -17,36 +18,50 @@ interface InboxMailAdminPanelProps { handleInboxMailProgressChange: (value: InboxMailThreadSupportProgressState) => void; currentUser: User; refetchInboxMailOverview: () => void; + translator: (key: string) => string; } function InboxMailAdminPanel(props: InboxMailAdminPanelProps) { - // No translations needed, admin only - const assignAndJump = useCallback((toConversation: boolean) => { + const t = props.translator; + const [canMarkLastUnread, setCanMarkLastUnread] = useState(true); + + useEffect(() => { + if (props.selectedThread.metaData?.unreadMailCountAdmin > 0) { + setCanMarkLastUnread(false); + } else { + setCanMarkLastUnread(true); + } + }, [props.selectedThread.id, props.selectedThread.metaData?.unreadMailCountAdmin]); + + const assignAndJump = useCallback((destination: JumpDestination) => { if (!props.currentUser) return; const currentOrganizationId = props.currentUser?.organizationId; if (!currentOrganizationId) { addUserToOrganization(props.currentUser.mail, props.selectedThread.organizationName, (res) => { - jumptoConversationOrProject(toConversation); - + jumpTo(destination); }); } else if (currentOrganizationId === props.selectedThread.organizationId) { - jumptoConversationOrProject(toConversation); - + jumpTo(destination); } else { removeUserFromOrganization(props.currentUser.mail, (res) => { addUserToOrganization(props.currentUser.mail, props.selectedThread.organizationName, (res) => { - jumptoConversationOrProject(toConversation); + jumpTo(destination); }); }); } }, [props.currentUser, props.selectedThread]); - const jumptoConversationOrProject = useCallback((toConversation: boolean) => { - if (toConversation) { - window.open(`/cognition/projects/${props.selectedThread.metaData?.projectId}/ui/${props.selectedThread.metaData?.conversationId}`, '_blank'); - } - else { - window.open(`/cognition/projects/${props.selectedThread.metaData.projectId}/pipeline`, '_blank'); + const jumpTo = useCallback((destination: JumpDestination) => { + switch (destination) { + case JumpDestination.CONVERSATION: + window.open(`/cognition/projects/${props.selectedThread.metaData?.projectId}/ui/${props.selectedThread.metaData?.conversationId}`, '_blank'); + break; + case JumpDestination.PROJECT: + window.open(`/cognition/projects/${props.selectedThread.metaData?.projectId}/pipeline`, '_blank'); + break; + case JumpDestination.ORGANIZATION: + window.open('/cognition', '_blank'); + break; } }, [props.selectedThread.metaData]); @@ -61,7 +76,18 @@ function InboxMailAdminPanel(props: InboxMailAdminPanelProps) { updateInboxMailThreadsUnreadByProject(props.selectedThread.id, (res) => { props.refetchInboxMailOverview(); }); + }, [props.selectedThread?.id, props.refetchInboxMailOverview]); + const handleMarkLastUnread = useCallback(() => { + setCanMarkLastUnread(false); + updateInboxMailThreadUnreadLast(props.selectedThread.id, (res) => { + props.refetchInboxMailOverview(); + }); + }, [props.selectedThread?.id, props.refetchInboxMailOverview]); + + const handleDeleteSimilar = useCallback(() => { + if (!confirm("Are you sure you want to delete all similar inbox mails? This action cannot be undone.")) return; + deleteInboxMailThreadsSimilar(props.selectedThread.id, (res) => props.refetchInboxMailOverview()); }, [props.selectedThread?.id, props.refetchInboxMailOverview]); return ( @@ -89,20 +115,61 @@ function InboxMailAdminPanel(props: InboxMailAdminPanelProps) { {props.selectedThread.metaData.supportOwnerName?.last} )} - {props.selectedThread?.metaData?.autoGenerated && -