diff --git a/packages/components/CHANGELOG.md b/packages/components/CHANGELOG.md index 69c32231..080c821b 100644 --- a/packages/components/CHANGELOG.md +++ b/packages/components/CHANGELOG.md @@ -1,5 +1,11 @@ # @baseapp-frontend/components +## 1.0.5 + +### Patch Changes + +- Clean up the three dot menu in the chat header (do not display the option to leave a non-group chat, implement archiving chats from there) + ## 1.0.4 ### Patch Changes diff --git a/packages/components/modules/messages/common/graphql/mutations/ArchiveChatRoom.ts b/packages/components/modules/messages/common/graphql/mutations/ArchiveChatRoom.ts index eae6eb63..c79ca7d9 100644 --- a/packages/components/modules/messages/common/graphql/mutations/ArchiveChatRoom.ts +++ b/packages/components/modules/messages/common/graphql/mutations/ArchiveChatRoom.ts @@ -1,14 +1,17 @@ +import { useCurrentProfile } from '@baseapp-frontend/authentication' import { useNotification } from '@baseapp-frontend/utils' -import { Disposable, UseMutationConfig, graphql, useMutation } from 'react-relay' +import { ConnectionHandler, Disposable, UseMutationConfig, graphql, useMutation } from 'react-relay' import { ArchiveChatRoomMutation } from '../../../../../__generated__/ArchiveChatRoomMutation.graphql' +import { getChatRoomConnections } from '../../utils' export const ArchiveChatRoomMutationQuery = graphql` mutation ArchiveChatRoomMutation($input: ChatRoomArchiveInput!) { chatRoomArchive(input: $input) { room { id + isArchived } errors { field @@ -26,6 +29,7 @@ export const useArchiveChatRoomMutation = (): [ const [commitMutation, isMutationInFlight] = useMutation( ArchiveChatRoomMutationQuery, ) + const { currentProfile } = useCurrentProfile() const commit = (config: UseMutationConfig) => commitMutation({ @@ -40,6 +44,19 @@ export const useArchiveChatRoomMutation = (): [ sendToast(error.message, { type: 'error' }) config?.onError?.(error) }, + updater: (store, data) => { + if (!data?.chatRoomArchive?.errors && currentProfile?.id) { + getChatRoomConnections( + store, + currentProfile.id, + ({ archived }) => archived === !data?.chatRoomArchive?.room?.isArchived, + ).forEach((connectionRecord) => { + if (data?.chatRoomArchive?.room?.id) + ConnectionHandler.deleteNode(connectionRecord, data?.chatRoomArchive?.room?.id) + }) + } + config?.updater?.(store, data) + }, }) return [commit, isMutationInFlight] diff --git a/packages/components/modules/messages/common/graphql/queries/ChatRoomQuery.ts b/packages/components/modules/messages/common/graphql/queries/ChatRoomQuery.ts index 3c503eab..49bf2da6 100644 --- a/packages/components/modules/messages/common/graphql/queries/ChatRoomQuery.ts +++ b/packages/components/modules/messages/common/graphql/queries/ChatRoomQuery.ts @@ -4,6 +4,7 @@ export const ChatRoomQuery = graphql` query ChatRoomQuery($roomId: ID!) { chatRoom(id: $roomId) { id + isArchived participantsCount ...TitleFragment ...MessagesListFragment diff --git a/packages/components/modules/messages/web/ChatRoom/ChatRoomHeader/ChatRoomOptions/index.tsx b/packages/components/modules/messages/web/ChatRoom/ChatRoomHeader/ChatRoomOptions/index.tsx index ba2ed2c1..5c5a0b77 100644 --- a/packages/components/modules/messages/web/ChatRoom/ChatRoomHeader/ChatRoomOptions/index.tsx +++ b/packages/components/modules/messages/web/ChatRoom/ChatRoomHeader/ChatRoomOptions/index.tsx @@ -5,23 +5,29 @@ import { MenuItem, MenuList, Typography } from '@mui/material' import { ChatRoomOptionsProps } from './types' const ChatRoomOptions: FC = ({ + isArchived, + isArchiveMutationInFlight, + isGroup, onArchiveClicked, onDetailsClicked, onLeaveClicked, }) => ( - {/* TODO: Implement archive room functionality */} - - Archive Chat - - - Group Details - - - - Leave Group - + + {isArchived ? 'Unarchive Chat' : 'Archive Chat'} + {isGroup ? ( + <> + + Group Details + + + + Leave Group + + + + ) : null} ) diff --git a/packages/components/modules/messages/web/ChatRoom/ChatRoomHeader/ChatRoomOptions/types.ts b/packages/components/modules/messages/web/ChatRoom/ChatRoomHeader/ChatRoomOptions/types.ts index eaccc2a5..1547823d 100644 --- a/packages/components/modules/messages/web/ChatRoom/ChatRoomHeader/ChatRoomOptions/types.ts +++ b/packages/components/modules/messages/web/ChatRoom/ChatRoomHeader/ChatRoomOptions/types.ts @@ -1,4 +1,7 @@ export interface ChatRoomOptionsProps { + isArchived: boolean + isArchiveMutationInFlight: boolean + isGroup: boolean onArchiveClicked: () => void onDetailsClicked: () => void onLeaveClicked: () => void diff --git a/packages/components/modules/messages/web/ChatRoom/ChatRoomHeader/index.tsx b/packages/components/modules/messages/web/ChatRoom/ChatRoomHeader/index.tsx index 2a126741..479cc0c2 100644 --- a/packages/components/modules/messages/web/ChatRoom/ChatRoomHeader/index.tsx +++ b/packages/components/modules/messages/web/ChatRoom/ChatRoomHeader/index.tsx @@ -15,6 +15,7 @@ import { useFragment } from 'react-relay' import { TitleFragment, getParticipantCountString, + useArchiveChatRoomMutation, useChatRoom, useNameAndAvatar, } from '../../../common' @@ -24,6 +25,7 @@ import { BackButtonContainer, ChatHeaderContainer, ChatTitleContainer } from './ import { ChatRoomHeaderProps } from './types' const ChatRoomHeader: FC = ({ + isArchived, participantsCount, roomTitleRef, onDisplayGroupDetailsClicked, @@ -35,10 +37,27 @@ const ChatRoomHeader: FC = ({ const isUpToMd = useResponsive('up', 'md') const { resetChatRoom } = useChatRoom() + const { isGroup } = roomHeader const { title, avatar } = useNameAndAvatar(roomHeader) const members = getParticipantCountString(participantsCount) const popover = usePopover() const { currentProfile } = useCurrentProfile() + const [commit, isMutationInFlight] = useArchiveChatRoomMutation() + + const toggleArchiveChatroom = () => { + popover.onClose() + if (currentProfile?.id && roomId) { + commit({ + variables: { + input: { + roomId, + profileId: currentProfile.id, + archive: !isArchived, + }, + }, + }) + } + } const onChatRoomOptionsClicked = (e: React.MouseEvent) => { e.stopPropagation() @@ -68,8 +87,8 @@ const ChatRoomHeader: FC = ({ )} = ({ {title} - {roomHeader.isGroup && ( + {isGroup && ( {members} @@ -100,11 +119,18 @@ const ChatRoomHeader: FC = ({ }} > {}} - onDetailsClicked={() => - roomHeader.isGroup ? onDisplayGroupDetailsClicked() : undefined - } - onLeaveClicked={() => setOpen(true)} + isArchived={isArchived} + isArchiveMutationInFlight={isMutationInFlight} + isGroup={isGroup} + onArchiveClicked={toggleArchiveChatroom} + onDetailsClicked={() => { + popover.onClose() + onDisplayGroupDetailsClicked() + }} + onLeaveClicked={() => { + popover.onClose() + setOpen(true) + }} /> diff --git a/packages/components/modules/messages/web/ChatRoom/ChatRoomHeader/types.ts b/packages/components/modules/messages/web/ChatRoom/ChatRoomHeader/types.ts index b6b82790..2987d9c4 100644 --- a/packages/components/modules/messages/web/ChatRoom/ChatRoomHeader/types.ts +++ b/packages/components/modules/messages/web/ChatRoom/ChatRoomHeader/types.ts @@ -3,6 +3,7 @@ import { BoxProps } from '@mui/material' import { TitleFragment$key } from '../../../../../__generated__/TitleFragment.graphql' export interface ChatRoomHeaderProps { + isArchived: boolean participantsCount: number roomTitleRef: TitleFragment$key onDisplayGroupDetailsClicked: VoidFunction diff --git a/packages/components/modules/messages/web/ChatRoom/index.tsx b/packages/components/modules/messages/web/ChatRoom/index.tsx index 601b4272..f58cf400 100644 --- a/packages/components/modules/messages/web/ChatRoom/index.tsx +++ b/packages/components/modules/messages/web/ChatRoom/index.tsx @@ -43,6 +43,7 @@ const ChatRoom: FC = ({ return ( = ({ archive: !isInArchivedTab, }, }, - updater: (store: RecordSourceSelectorProxy, data: any) => { - if (!data?.errors) { - getChatRoomConnections(store, currentProfile.id).forEach((connectionRecord) => - ConnectionHandler.deleteNode(connectionRecord, roomRef.id), - ) - } - }, }) } }, diff --git a/packages/components/package.json b/packages/components/package.json index c2f26263..e2b57098 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,7 +1,7 @@ { "name": "@baseapp-frontend/components", "description": "BaseApp components modules such as comments, notifications, messages, and more.", - "version": "1.0.4", + "version": "1.0.5", "sideEffects": false, "scripts": { "babel:bundle": "babel modules -d tmp-babel --extensions .ts,.tsx --ignore '**/__tests__/**','**/__storybook__/**'",