diff --git a/components/inbox-mail/CreateNewMailModal.tsx b/components/inbox-mail/CreateNewMailModal.tsx new file mode 100644 index 0000000..66d07fa --- /dev/null +++ b/components/inbox-mail/CreateNewMailModal.tsx @@ -0,0 +1,421 @@ +import { Dialog, Transition } from "@headlessui/react"; +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { useRouter } from "next/router"; +import useRefState from "../../hooks/useRefState"; +import { InfoButton } from "../InfoButton"; +import { MemoIconMail } from "../kern-icons/icons"; +import { User, InboxMailThread } from "./types-mail"; +import { Fragment } from 'react' +import KernButton from "../kern-button/KernButton"; +import KernDropdown from "../KernDropdown"; +interface CreateNewMailModalProps { + open: boolean; + setOpen: (open: boolean) => void; + handleInboxMailCreation: (content: string, recipientIds?: string[], subject?: string, isImportant?: boolean, metaData?: any, threadId?: string) => void; + users: User[]; + currentUser: User; + isAdmin: boolean; + translator: (key: string) => string; + selectedOrganization?: any; + setSelectedOrganization?: (org: any) => void; + organizations?: any[]; + thread?: InboxMailThread; + isNewThread?: boolean; + isAdminSupportThread?: boolean; +}; + +export default function CreateNewMailModal(props: CreateNewMailModalProps) { + const router = useRouter(); + const t = useMemo(() => props.translator, [props.translator]); + + const projectId = router.query.projectId as string; + const chatId = router.query.chatId as string; + const { state: subject, setState: setSubject, ref: subjectRef } = useRefState(''); + const { state: content, setState: setContent, ref: contentRef } = useRefState(''); + const { state: includeProject, setState: setIncludeProject, ref: includeProjectRef } = useRefState(false); + const { state: includeChat, setState: setIncludeChat, ref: includeChatRef } = useRefState(false); + const { state: isImportant, setState: setIsImportant, ref: isImportantRef } = useRefState(false); + const { state: selectedPeople, setState: setSelectedPeople, ref: selectedPeopleRef } = useRefState([]); + + + const cancelButtonRef = useRef(null); + + useEffect(() => { + if (!(props.open && props.thread && !props.isNewThread && props.thread.latestMail && props.users)) return; + + const currentThreadPeople = props.thread.participantIds; + setSelectedPeople(props.users.filter((user) => currentThreadPeople.includes(user.id) && user.id !== props.currentUser.id)); + setSubject(props.thread.subject); + }, [props.open, props.thread, props.isNewThread, props.users]); + + useEffect(() => { + if (projectId) { + setIncludeProject(true); + } + if (chatId) { + setIncludeChat(true); + } + }, [projectId, chatId]); + + const initModal = useCallback(() => { + setSelectedPeople([]); + setSubject(''); + setContent(''); + props.setSelectedOrganization?.(null); + setIsImportant(false); + }, [props.setSelectedOrganization]); + + const clearRouterParams = useCallback(() => { + router.replace('/inbox-mail'); + }, []); + + const disabledSend = useMemo(() => { + return (props.isAdminSupportThread ? false : selectedPeople.length === 0) || subject.trim() === '' || content.trim() === ''; + }, [selectedPeople, subject, content, props.isAdminSupportThread]); + + const handleCreateMail = useCallback(() => { + const metaData = { + ...(projectId && includeProjectRef.current && { projectId }), + ...(chatId && includeChatRef.current && { conversationId: chatId }) + }; + props.handleInboxMailCreation(contentRef.current, selectedPeopleRef.current.map((user) => user.id), subjectRef.current, isImportantRef.current, metaData, props.isNewThread ? undefined : props.thread?.id); + initModal(); + clearRouterParams(); + }, [props.thread?.id, props.isNewThread, projectId, chatId]); + + return ( + + null}> + +
+ + +
+
+ +
+
+ + +
+
+
+ +
+
+ + {props.isNewThread ? t("inboxMail.modalTitle") : t("inboxMail.replyModalTitle")} + +
+ {props.isAdmin && props.isNewThread && !props.isAdminSupportThread && +
+ + +
+ } + {props.isAdminSupportThread ? + + : + + } +
+ +
+ setSubject(e.target.value)} + disabled={!props.isNewThread} + placeholder={t("inboxMail.subjectPlaceholder")} + /> +
+
+
+ +
+