From 52fcd774bd8a3baa98c6633b2fd44e201da07468 Mon Sep 17 00:00:00 2001 From: BlankParticle Date: Sat, 11 May 2024 12:50:30 +0530 Subject: [PATCH] feat: Support for Hide/Unhide convo with smart convo-list update --- .../app/[orgShortCode]/convo/ConvoList.tsx | 1 + .../convo/[convoId]/ChatSideBar.tsx | 134 +++++++++++------- .../[orgShortCode]/convo/[convoId]/page.tsx | 10 ++ apps/web/app/[orgShortCode]/convo/utils.ts | 94 +++++++++--- 4 files changed, 166 insertions(+), 73 deletions(-) diff --git a/apps/web/app/[orgShortCode]/convo/ConvoList.tsx b/apps/web/app/[orgShortCode]/convo/ConvoList.tsx index fc95ab4a..62f1b896 100644 --- a/apps/web/app/[orgShortCode]/convo/ConvoList.tsx +++ b/apps/web/app/[orgShortCode]/convo/ConvoList.tsx @@ -28,6 +28,7 @@ export default function ConvoList() { getNextPageParam: (lastPage) => lastPage.cursor ?? undefined } ); + const allConvos = convos ? convos.pages.flatMap(({ data }) => data) : []; const convosVirtualizer = useVirtualizer({ count: allConvos.length + (hasNextPage ? 1 : 0), diff --git a/apps/web/app/[orgShortCode]/convo/[convoId]/ChatSideBar.tsx b/apps/web/app/[orgShortCode]/convo/[convoId]/ChatSideBar.tsx index cd7d6f65..c7e048a4 100644 --- a/apps/web/app/[orgShortCode]/convo/[convoId]/ChatSideBar.tsx +++ b/apps/web/app/[orgShortCode]/convo/[convoId]/ChatSideBar.tsx @@ -10,11 +10,16 @@ import { IconButton, Text, HoverCard, - Button + Button, + Tooltip } from '@radix-ui/themes'; -import { ChevronUp, ChevronDown, EyeOff, Trash } from 'lucide-react'; +import { ChevronUp, ChevronDown, EyeOff, Eye, Trash } from 'lucide-react'; import { useState } from 'react'; -import { useRemoveConvoFromList, type formatParticipantData } from '../utils'; +import { + useDeleteConvo$Cache, + useToggleConvoHidden$Cache, + type formatParticipantData +} from '../utils'; import { memo } from 'react'; import useAwaitableModal, { type ModalComponent @@ -26,19 +31,22 @@ import { useRouter } from 'next/navigation'; export default function ChatSideBar({ participants, - convoId + convoId, + convoHidden }: { participants: NonNullable>[]; convoId: TypeId<'convos'>; + convoHidden: boolean | null; }) { const orgShortCode = useGlobalStore((state) => state.currentOrg.shortCode); const [participantOpen, setParticipantOpen] = useState(false); const [ModalRoot, openDeleteModal] = useAwaitableModal(DeleteModal, { - convoId + convoId, + convoHidden }); const hideConvo = api.convos.hideConvo.useMutation(); const router = useRouter(); - const removeConvoFromList = useRemoveConvoFromList(); + const toggleConvoHiddenState = useToggleConvoHidden$Cache(); return ( - { - openDeleteModal() - // Navigate to empty page on delete - .then(() => router.push(`/${orgShortCode}/convo`)) - // Do nothing if Hide is chosen or Modal is Closed - .catch(() => null); - }}> - - - { - await hideConvo.mutateAsync({ - convoPublicId: convoId, - orgShortCode - }); - removeConvoFromList(convoId); - }}> - - + + { + openDeleteModal({ convoHidden }) + // Navigate to empty page on delete + .then(() => router.push(`/${orgShortCode}/convo`)) + // Do nothing if Hide is chosen or Modal is Closed + .catch(() => null); + }}> + + + + + { + await hideConvo.mutateAsync({ + convoPublicId: convoId, + orgShortCode, + unhide: convoHidden ? true : undefined + }); + await toggleConvoHiddenState(convoId, !convoHidden); + }}> + {convoHidden ? : } + + }>) { + convoId, + convoHidden +}: ModalComponent<{ convoId: TypeId<'convos'>; convoHidden: boolean | null }>) { const orgShortCode = useGlobalStore((state) => state.currentOrg.shortCode); const hideConvo = api.convos.hideConvo.useMutation(); const deleteConvo = api.convos.deleteConvo.useMutation(); - const removeConvoFromList = useRemoveConvoFromList(); + const removeConvoFromList = useDeleteConvo$Cache(); + const toggleConvoHiddenState = useToggleConvoHidden$Cache(); return ( { - if (!open) { + if (!open && !deleteConvo.isLoading && !hideConvo.isLoading) { onClose(); } }}> @@ -212,12 +229,14 @@ function DeleteModal({ as="div"> Are you sure you want to delete this conversation? - - Tip: You can also choose to hide this Convo - + {convoHidden ? null : ( + + Tip: You can also choose to hide this Convo + + )} onClose()}> Cancel - + {convoHidden ? null : ( + + )}