From 16ea36de27cbefb55e9d6fba4c4687d837402542 Mon Sep 17 00:00:00 2001 From: Pedro Tiburcio Date: Thu, 9 Jan 2025 17:01:47 -0500 Subject: [PATCH 1/2] feat: leave group --- .../ChatRoomHeader/ChatRoomOptions/index.tsx | 28 ++++ .../ChatRoomHeader/ChatRoomOptions/types.ts | 5 + .../ChatRoom/ChatRoomHeader/index.tsx | 120 ++++++++++++------ .../ChatRoom/ChatRoomHeader/styled.tsx | 2 +- .../messages/ChatRoom/ChatRoomHeader/types.ts | 3 +- .../modules/messages/ChatRoom/index.tsx | 1 + .../GroupDetails/GroupDetailsHeader/types.ts | 4 +- .../ProfileCard/AdminOptionsMenu/index.tsx | 12 +- .../ProfileCard/AdminOptionsMenu/types.ts | 7 +- .../ProfileCard/MemeberOptionsMenu/index.tsx | 26 ++++ .../ProfileCard/MemeberOptionsMenu/types.ts | 5 + .../GroupDetails/ProfileCard/index.tsx | 39 +++++- .../modules/messages/GroupDetails/index.tsx | 28 +++- .../__shared__/LeaveGroupDialog/index.tsx | 74 +++++++++++ .../__shared__/LeaveGroupDialog/types.ts | 10 ++ .../subscriptions/useRoomListSubscription.tsx | 9 +- .../components/avatars/CircledAvatar/types.ts | 2 +- 17 files changed, 304 insertions(+), 71 deletions(-) create mode 100644 packages/components/modules/messages/ChatRoom/ChatRoomHeader/ChatRoomOptions/index.tsx create mode 100644 packages/components/modules/messages/ChatRoom/ChatRoomHeader/ChatRoomOptions/types.ts create mode 100644 packages/components/modules/messages/GroupDetails/ProfileCard/MemeberOptionsMenu/index.tsx create mode 100644 packages/components/modules/messages/GroupDetails/ProfileCard/MemeberOptionsMenu/types.ts create mode 100644 packages/components/modules/messages/__shared__/LeaveGroupDialog/index.tsx create mode 100644 packages/components/modules/messages/__shared__/LeaveGroupDialog/types.ts diff --git a/packages/components/modules/messages/ChatRoom/ChatRoomHeader/ChatRoomOptions/index.tsx b/packages/components/modules/messages/ChatRoom/ChatRoomHeader/ChatRoomOptions/index.tsx new file mode 100644 index 00000000..ba2ed2c1 --- /dev/null +++ b/packages/components/modules/messages/ChatRoom/ChatRoomHeader/ChatRoomOptions/index.tsx @@ -0,0 +1,28 @@ +import { FC } from 'react' + +import { MenuItem, MenuList, Typography } from '@mui/material' + +import { ChatRoomOptionsProps } from './types' + +const ChatRoomOptions: FC = ({ + onArchiveClicked, + onDetailsClicked, + onLeaveClicked, +}) => ( + + {/* TODO: Implement archive room functionality */} + + Archive Chat + + + Group Details + + + + Leave Group + + + +) + +export default ChatRoomOptions diff --git a/packages/components/modules/messages/ChatRoom/ChatRoomHeader/ChatRoomOptions/types.ts b/packages/components/modules/messages/ChatRoom/ChatRoomHeader/ChatRoomOptions/types.ts new file mode 100644 index 00000000..eaccc2a5 --- /dev/null +++ b/packages/components/modules/messages/ChatRoom/ChatRoomHeader/ChatRoomOptions/types.ts @@ -0,0 +1,5 @@ +export interface ChatRoomOptionsProps { + onArchiveClicked: () => void + onDetailsClicked: () => void + onLeaveClicked: () => void +} diff --git a/packages/components/modules/messages/ChatRoom/ChatRoomHeader/index.tsx b/packages/components/modules/messages/ChatRoom/ChatRoomHeader/index.tsx index 9b134c0b..654f32f0 100644 --- a/packages/components/modules/messages/ChatRoom/ChatRoomHeader/index.tsx +++ b/packages/components/modules/messages/ChatRoom/ChatRoomHeader/index.tsx @@ -1,18 +1,24 @@ -import { FC } from 'react' +import { FC, useState } from 'react' +import { useCurrentProfile } from '@baseapp-frontend/authentication' import { AvatarWithPlaceholder, IconButton, Iconify, + Popover, + ThreeDotsIcon, + usePopover, useResponsive, } from '@baseapp-frontend/design-system' import { Box, Typography } from '@mui/material' import { useFragment } from 'react-relay' +import LeaveGroupDialog from '../../__shared__/LeaveGroupDialog' import { useChatRoom } from '../../context' import { TitleFragment } from '../../graphql/fragments/Title' import { getParticipantCountString, useNameAndAvatar } from '../../utils' +import ChatRoomOptions from './ChatRoomOptions' import { BackButtonContainer, ChatHeaderContainer, ChatTitleContainer } from './styled' import { ChatRoomHeaderProps } from './types' @@ -20,53 +26,93 @@ const ChatRoomHeader: FC = ({ participantsCount, roomTitleRef, onDisplayGroupDetailsClicked, + roomId, }) => { const roomHeader = useFragment(TitleFragment, roomTitleRef) + const [open, setOpen] = useState(false) const isUpToMd = useResponsive('up', 'md') const { resetChatRoom } = useChatRoom() const { title, avatar } = useNameAndAvatar(roomHeader) const members = getParticipantCountString(participantsCount) + const popover = usePopover() + const { currentProfile } = useCurrentProfile() + + const onChatRoomOptionsClicked = (e: React.MouseEvent) => { + e.stopPropagation() + popover.onOpen(e) + } return ( - - {isUpToMd ? ( -
- ) : ( - - - - - - )} - - - - - {title} - - {roomHeader.isGroup && ( - - {members} + <> + setOpen(false)} + profileId={currentProfile?.id} + roomId={roomId} + /> + + {isUpToMd ? ( +
+ ) : ( + + + + + + )} + + + + + {title} - )} - - - + {roomHeader.isGroup && ( + + {members} + + )} + + + onChatRoomOptionsClicked(e)} + aria-label="Show chatroom options" + > + + + ) => e.stopPropagation() }, + }} + > + {}} + onDetailsClicked={() => + roomHeader.isGroup ? onDisplayGroupDetailsClicked : undefined + } + onLeaveClicked={() => setOpen(true)} + /> + + + + + ) } diff --git a/packages/components/modules/messages/ChatRoom/ChatRoomHeader/styled.tsx b/packages/components/modules/messages/ChatRoom/ChatRoomHeader/styled.tsx index f7448f0b..1f098481 100644 --- a/packages/components/modules/messages/ChatRoom/ChatRoomHeader/styled.tsx +++ b/packages/components/modules/messages/ChatRoom/ChatRoomHeader/styled.tsx @@ -22,7 +22,7 @@ export const ChatTitleContainer = styled(Box)( alignItems: 'center', display: 'grid', gap: theme.spacing(1.5), - gridTemplateColumns: 'min-content 1fr', + gridTemplateColumns: 'min-content 1fr min-content', height: '56px', padding: 0, width: '100%', diff --git a/packages/components/modules/messages/ChatRoom/ChatRoomHeader/types.ts b/packages/components/modules/messages/ChatRoom/ChatRoomHeader/types.ts index 22b0ee11..54603b2a 100644 --- a/packages/components/modules/messages/ChatRoom/ChatRoomHeader/types.ts +++ b/packages/components/modules/messages/ChatRoom/ChatRoomHeader/types.ts @@ -5,7 +5,8 @@ import { TitleFragment$key } from '../../../../__generated__/TitleFragment.graph export interface ChatRoomHeaderProps { participantsCount: number roomTitleRef: TitleFragment$key - onDisplayGroupDetailsClicked: () => void + onDisplayGroupDetailsClicked: VoidFunction + roomId?: string } export interface ChatTitleContainerProps extends BoxProps { diff --git a/packages/components/modules/messages/ChatRoom/index.tsx b/packages/components/modules/messages/ChatRoom/index.tsx index 3f259d5b..006736c4 100644 --- a/packages/components/modules/messages/ChatRoom/index.tsx +++ b/packages/components/modules/messages/ChatRoom/index.tsx @@ -46,6 +46,7 @@ const ChatRoom: FC = ({ participantsCount={chatRoom.participantsCount} roomTitleRef={chatRoom} onDisplayGroupDetailsClicked={onDisplayGroupDetailsClicked} + roomId={roomId} /> diff --git a/packages/components/modules/messages/GroupDetails/GroupDetailsHeader/types.ts b/packages/components/modules/messages/GroupDetails/GroupDetailsHeader/types.ts index 015c2684..e2b2faeb 100644 --- a/packages/components/modules/messages/GroupDetails/GroupDetailsHeader/types.ts +++ b/packages/components/modules/messages/GroupDetails/GroupDetailsHeader/types.ts @@ -1,5 +1,5 @@ export interface GroupDetailsHeaderProps { - onBackButtonClicked: () => void - onEditButtonClicked?: () => void + onBackButtonClicked: VoidFunction + onEditButtonClicked?: VoidFunction shouldDisplayEditButton: boolean } diff --git a/packages/components/modules/messages/GroupDetails/ProfileCard/AdminOptionsMenu/index.tsx b/packages/components/modules/messages/GroupDetails/ProfileCard/AdminOptionsMenu/index.tsx index bc29ca6d..0854bc5d 100644 --- a/packages/components/modules/messages/GroupDetails/ProfileCard/AdminOptionsMenu/index.tsx +++ b/packages/components/modules/messages/GroupDetails/ProfileCard/AdminOptionsMenu/index.tsx @@ -5,16 +5,18 @@ import { MenuItem, MenuList, Typography } from '@mui/material' import { AdminOptionsProps } from './types' const AdminOptionsMenu: FC = ({ - isAdmin, - isMe, + onViewProfileClicked, onToggleAdminClicked, onRemoveClicked, }) => ( - - {isAdmin ? 'Make normal user' : 'Make Admin'} + + View Profile - + + Make Admin + + Remove diff --git a/packages/components/modules/messages/GroupDetails/ProfileCard/AdminOptionsMenu/types.ts b/packages/components/modules/messages/GroupDetails/ProfileCard/AdminOptionsMenu/types.ts index b86e794e..05ee9b47 100644 --- a/packages/components/modules/messages/GroupDetails/ProfileCard/AdminOptionsMenu/types.ts +++ b/packages/components/modules/messages/GroupDetails/ProfileCard/AdminOptionsMenu/types.ts @@ -1,6 +1,5 @@ export interface AdminOptionsProps { - isAdmin: boolean - isMe: boolean - onToggleAdminClicked: () => void - onRemoveClicked: () => void + onViewProfileClicked: VoidFunction + onToggleAdminClicked: VoidFunction + onRemoveClicked: VoidFunction } diff --git a/packages/components/modules/messages/GroupDetails/ProfileCard/MemeberOptionsMenu/index.tsx b/packages/components/modules/messages/GroupDetails/ProfileCard/MemeberOptionsMenu/index.tsx new file mode 100644 index 00000000..ad580fc9 --- /dev/null +++ b/packages/components/modules/messages/GroupDetails/ProfileCard/MemeberOptionsMenu/index.tsx @@ -0,0 +1,26 @@ +import { FC } from 'react' + +import { MenuItem, MenuList, Typography } from '@mui/material' + +import { MemberOptionsMenuProps } from './types' + +const MemberOptionsMenu: FC = ({ + isMe, + onViewProfileClicked, + onRemoveClicked, +}) => ( + + + View Profile + + {isMe && ( + + + Leave Group + + + )} + +) + +export default MemberOptionsMenu diff --git a/packages/components/modules/messages/GroupDetails/ProfileCard/MemeberOptionsMenu/types.ts b/packages/components/modules/messages/GroupDetails/ProfileCard/MemeberOptionsMenu/types.ts new file mode 100644 index 00000000..e9490518 --- /dev/null +++ b/packages/components/modules/messages/GroupDetails/ProfileCard/MemeberOptionsMenu/types.ts @@ -0,0 +1,5 @@ +export interface MemberOptionsMenuProps { + isMe: boolean + onViewProfileClicked: VoidFunction + onRemoveClicked: VoidFunction +} diff --git a/packages/components/modules/messages/GroupDetails/ProfileCard/index.tsx b/packages/components/modules/messages/GroupDetails/ProfileCard/index.tsx index 389de181..b1751086 100644 --- a/packages/components/modules/messages/GroupDetails/ProfileCard/index.tsx +++ b/packages/components/modules/messages/GroupDetails/ProfileCard/index.tsx @@ -16,6 +16,7 @@ import { useFragment } from 'react-relay' import { ProfileItemFragment$key } from '../../../../__generated__/ProfileItemFragment.graphql' import { ProfileItemFragment } from '../../../profiles/graphql/queries/ProfileItem' import AdminOptionsMenu from './AdminOptionsMenu' +import MemberOptionsMenu from './MemeberOptionsMenu' import { ADMIN_LABEL, CHAT_ROOM_PARTICIPANT_ROLES } from './constants' import { MainContainer } from './styled' import { ProfileCardProps } from './types' @@ -34,12 +35,43 @@ const ProfileCard: FC = ({ const showMenu = hasAdminPermissions const { currentProfile } = useCurrentProfile() const popover = usePopover() + const isMe = currentProfile?.id === id const handleRemoveClicked = () => { popover.onClose() initiateRemoval(id, name) } + const renderMenuItems = () => { + if (isMe) { + return ( + + ) + } + + if (!isMe && hasAdminPermissions) { + return ( + + ) + } + + return ( + + ) + } + return ( = ({ - + {renderMenuItems()} ) : ( diff --git a/packages/components/modules/messages/GroupDetails/index.tsx b/packages/components/modules/messages/GroupDetails/index.tsx index 8a926730..d16a6f54 100644 --- a/packages/components/modules/messages/GroupDetails/index.tsx +++ b/packages/components/modules/messages/GroupDetails/index.tsx @@ -3,10 +3,8 @@ import { FC, Suspense, useRef, useState } from 'react' import { useCurrentProfile } from '@baseapp-frontend/authentication' -import { CircledAvatar, ConfirmDialog, LoadingState } from '@baseapp-frontend/design-system' -import { useNotification } from '@baseapp-frontend/utils' +import { CircledAvatar, LoadingState } from '@baseapp-frontend/design-system' -import { LoadingButton } from '@mui/lab' import { Box, Typography, useTheme } from '@mui/material' import { ConnectionHandler, usePaginationFragment, usePreloadedQuery } from 'react-relay' import { Virtuoso } from 'react-virtuoso' @@ -14,8 +12,8 @@ import { Virtuoso } from 'react-virtuoso' import { ChatRoomParticipantsPaginationQuery } from '../../../__generated__/ChatRoomParticipantsPaginationQuery.graphql' import { GroupDetailsQuery as GroupDetailsQueryType } from '../../../__generated__/GroupDetailsQuery.graphql' import { MembersListFragment$key } from '../../../__generated__/MembersListFragment.graphql' +import LeaveGroupDialog from '../__shared__/LeaveGroupDialog' import { MembersListFragment } from '../graphql/fragments/MembersList' -import { useUpdateChatRoomMutation } from '../graphql/mutations/UpdateChatRoom' import { GroupDetailsQuery } from '../graphql/queries/GroupDetailsQuery' import useRoomListSubscription from '../graphql/subscriptions/useRoomListSubscription' import { getParticipantCountString, useGroupNameAndAvatar } from '../utils' @@ -73,8 +71,6 @@ const GroupDetails: FC = ({ const [removingParticipantId, setRemovingParticipantId] = useState(undefined) const removingParticipantName = useRef(undefined) - const [commit, isMutationInFlight] = useUpdateChatRoomMutation() - const { sendToast } = useNotification() const initiateRemoval = (id: string, name: string | null | undefined) => { setRemovingParticipantId(id) @@ -158,7 +154,25 @@ const GroupDetails: FC = ({ return ( <> - {renderDeleteDialog()} + {/* TODO: Deal with sole admin removal (will be done in another story) */} + = ({ + title = 'Leave group chat?', + content = 'You will stop receiving messages from this conversation and people will see that you left.', + onClose, + open, + profileId, + removingParticipantId, + removingParticipantName, + roomId, +}) => { + const [commit, isMutationInFlight] = useUpdateChatRoomMutation() + const { sendToast } = useNotification() + + const onRemoveConfirmed = () => { + if (!roomId || !profileId) return + commit({ + variables: { + input: { + roomId, + profileId, + removeParticipants: [removingParticipantId ?? profileId], + }, + connections: [ConnectionHandler.getConnectionID(roomId, 'ChatRoom_participants')], + }, + onCompleted: (response) => { + if ( + removingParticipantId && + removingParticipantId !== profileId && + !response?.chatRoomUpdate?.errors + ) { + sendToast(`${removingParticipantName} was successfully removed`) + } + onClose() + }, + onError: (error) => { + sendToast(error.message, { type: 'error' }) + }, + }) + } + + return ( + + {removingParticipantId === profileId ? 'Leave group' : 'Remove'} + + } + onClose={onClose} + open={open} + /> + ) +} + +export default LeaveGroupDialog diff --git a/packages/components/modules/messages/__shared__/LeaveGroupDialog/types.ts b/packages/components/modules/messages/__shared__/LeaveGroupDialog/types.ts new file mode 100644 index 00000000..8df287f6 --- /dev/null +++ b/packages/components/modules/messages/__shared__/LeaveGroupDialog/types.ts @@ -0,0 +1,10 @@ +export interface LeaveGroupDialogProps { + title?: string + content?: string + profileId?: string + roomId?: string + removingParticipantId?: string + removingParticipantName?: string | null + open: boolean + onClose: VoidFunction +} diff --git a/packages/components/modules/messages/graphql/subscriptions/useRoomListSubscription.tsx b/packages/components/modules/messages/graphql/subscriptions/useRoomListSubscription.tsx index d6344222..57490f5f 100644 --- a/packages/components/modules/messages/graphql/subscriptions/useRoomListSubscription.tsx +++ b/packages/components/modules/messages/graphql/subscriptions/useRoomListSubscription.tsx @@ -2,8 +2,6 @@ import { useMemo } from 'react' -import { useNotification } from '@baseapp-frontend/utils' - import { ConnectionHandler, graphql, useSubscription } from 'react-relay' import { RecordSourceSelectorProxy } from 'relay-runtime' @@ -47,10 +45,10 @@ const useRoomListSubscription = ({ }: { connections: string[] profileId: string - onRemoval?: () => void + onRemoval?: VoidFunction + isRemoval?: boolean }) => { const { id: selectedRoom, resetChatRoom } = useChatRoom() - const { sendToast } = useNotification() const config = useMemo(() => { const wasRemovedFromChatRoom = (data: useRoomListSubscription$data | null | undefined) => @@ -94,9 +92,6 @@ const useRoomListSubscription = ({ resetChatRoom() } onRemoval?.() - sendToast(`You were removed from ${data?.chatRoomOnRoomUpdate?.room?.node?.title}`, { - type: 'info', - }) } }, } diff --git a/packages/design-system/components/avatars/CircledAvatar/types.ts b/packages/design-system/components/avatars/CircledAvatar/types.ts index fb06d0b2..d435d4a6 100644 --- a/packages/design-system/components/avatars/CircledAvatar/types.ts +++ b/packages/design-system/components/avatars/CircledAvatar/types.ts @@ -5,7 +5,7 @@ import { AvatarWithPlaceholderProps } from '../AvatarWithPlaceholder/types' export interface AvatarContainerProps extends BoxProps { width: number height: number - hasError: boolean + hasError?: boolean } export type CircledAvatarProps = AvatarContainerProps & AvatarWithPlaceholderProps From 853a9506e4567c42a76e73424f839f3cf94578f5 Mon Sep 17 00:00:00 2001 From: Pedro Tiburcio Date: Thu, 16 Jan 2025 08:14:10 -0500 Subject: [PATCH 2/2] fix: PR fixes --- .../ChatRoom/ChatRoomHeader/index.tsx | 7 +-- .../index.tsx | 0 .../types.ts | 0 .../GroupDetails/ProfileCard/index.tsx | 2 +- .../modules/messages/GroupDetails/index.tsx | 46 ++----------------- packages/components/schema.graphql | 25 +++++----- 6 files changed, 19 insertions(+), 61 deletions(-) rename packages/components/modules/messages/GroupDetails/ProfileCard/{MemeberOptionsMenu => MemberOptionsMenu}/index.tsx (100%) rename packages/components/modules/messages/GroupDetails/ProfileCard/{MemeberOptionsMenu => MemberOptionsMenu}/types.ts (100%) diff --git a/packages/components/modules/messages/ChatRoom/ChatRoomHeader/index.tsx b/packages/components/modules/messages/ChatRoom/ChatRoomHeader/index.tsx index 654f32f0..8290219d 100644 --- a/packages/components/modules/messages/ChatRoom/ChatRoomHeader/index.tsx +++ b/packages/components/modules/messages/ChatRoom/ChatRoomHeader/index.tsx @@ -88,10 +88,7 @@ const ChatRoomHeader: FC = ({ )} - onChatRoomOptionsClicked(e)} - aria-label="Show chatroom options" - > + = ({ {}} onDetailsClicked={() => - roomHeader.isGroup ? onDisplayGroupDetailsClicked : undefined + roomHeader.isGroup ? onDisplayGroupDetailsClicked() : undefined } onLeaveClicked={() => setOpen(true)} /> diff --git a/packages/components/modules/messages/GroupDetails/ProfileCard/MemeberOptionsMenu/index.tsx b/packages/components/modules/messages/GroupDetails/ProfileCard/MemberOptionsMenu/index.tsx similarity index 100% rename from packages/components/modules/messages/GroupDetails/ProfileCard/MemeberOptionsMenu/index.tsx rename to packages/components/modules/messages/GroupDetails/ProfileCard/MemberOptionsMenu/index.tsx diff --git a/packages/components/modules/messages/GroupDetails/ProfileCard/MemeberOptionsMenu/types.ts b/packages/components/modules/messages/GroupDetails/ProfileCard/MemberOptionsMenu/types.ts similarity index 100% rename from packages/components/modules/messages/GroupDetails/ProfileCard/MemeberOptionsMenu/types.ts rename to packages/components/modules/messages/GroupDetails/ProfileCard/MemberOptionsMenu/types.ts diff --git a/packages/components/modules/messages/GroupDetails/ProfileCard/index.tsx b/packages/components/modules/messages/GroupDetails/ProfileCard/index.tsx index b1751086..f7bf4a6c 100644 --- a/packages/components/modules/messages/GroupDetails/ProfileCard/index.tsx +++ b/packages/components/modules/messages/GroupDetails/ProfileCard/index.tsx @@ -16,7 +16,7 @@ import { useFragment } from 'react-relay' import { ProfileItemFragment$key } from '../../../../__generated__/ProfileItemFragment.graphql' import { ProfileItemFragment } from '../../../profiles/graphql/queries/ProfileItem' import AdminOptionsMenu from './AdminOptionsMenu' -import MemberOptionsMenu from './MemeberOptionsMenu' +import MemberOptionsMenu from './MemberOptionsMenu' import { ADMIN_LABEL, CHAT_ROOM_PARTICIPANT_ROLES } from './constants' import { MainContainer } from './styled' import { ProfileCardProps } from './types' diff --git a/packages/components/modules/messages/GroupDetails/index.tsx b/packages/components/modules/messages/GroupDetails/index.tsx index d16a6f54..2dec802a 100644 --- a/packages/components/modules/messages/GroupDetails/index.tsx +++ b/packages/components/modules/messages/GroupDetails/index.tsx @@ -36,13 +36,14 @@ const GroupDetails: FC = ({ const { currentProfile } = useCurrentProfile() const { avatar, title } = useGroupNameAndAvatar(group) const theme = useTheme() + const profileId = currentProfile?.id ?? '' const connections = group?.id ? [ConnectionHandler.getConnectionID(group.id, 'ChatRoom_participants')] : [] // TODO: Is there a safer way to ensure the current profile id is not undefined? useRoomListSubscription({ - profileId: currentProfile?.id!, + profileId, connections, onRemoval: onBackButtonClicked, }) @@ -52,9 +53,7 @@ const GroupDetails: FC = ({ MembersListFragment$key >(MembersListFragment, group) const members = data?.participants - const me = members?.edges.find( - (edge) => currentProfile?.id && edge?.node?.profile?.id === currentProfile?.id, - ) + const me = members?.edges.find((edge) => profileId && edge?.node?.profile?.id === profileId) const isAdmin = me?.node?.role === CHAT_ROOM_PARTICIPANT_ROLES.admin const renderLoadingState = () => { @@ -82,45 +81,6 @@ const GroupDetails: FC = ({ removingParticipantName.current = undefined } - const onRemoveConfirmed = () => { - if (!group?.id || !currentProfile?.id) return - commit({ - variables: { - input: { - roomId: group.id, - profileId: currentProfile?.id, - removeParticipants: [removingParticipantId], - }, - connections: [ConnectionHandler.getConnectionID(group.id, 'ChatRoom_participants')], - }, - onCompleted: (response) => { - if (!response?.chatRoomUpdate?.errors) { - sendToast(`${removingParticipantName.current} was successfully removed`) - } - handleRemoveDialogClose() - }, - }) - } - - const renderDeleteDialog = () => ( - - Remove - - } - onClose={handleRemoveDialogClose} - open={removingParticipantId !== undefined} - /> - ) - const renderItem = (item: GroupMembersEdge) => { if (item.node) { return ( diff --git a/packages/components/schema.graphql b/packages/components/schema.graphql index c71e66f4..ed75c160 100644 --- a/packages/components/schema.graphql +++ b/packages/components/schema.graphql @@ -9,15 +9,15 @@ type ActivityLog implements Node { id: ID! createdAt: DateTime! updatedAt: DateTime! + user: User + ipAddress: String + verb: String + visibility: VisibilityTypes + url: String pk: Int! metadata: GenericScalar events(offset: Int, before: String, after: String, first: Int, last: Int, createdFrom: Date, createdTo: Date, userPk: Decimal): NodeLogEventConnection - user: User profile: Profile - visibility: VisibilityTypes - verb: String - ipAddress: String - url: String } type ActivityLogConnection { @@ -352,7 +352,7 @@ type Comment implements Node & CommentsInterface & ReactionsInterface & Permissi Determine if the logged in user has a specific permission for this object. """ hasPerm(perm: String!): Boolean - nodeActivityLogs(visibility: VisibilityTypes, first: Int = 10, offset: Int, before: String, after: String, last: Int, createdFrom: Date, createdTo: Date, userPk: Decimal, profilePk: Decimal): ActivityLogConnection + nodeActivityLogs(visibility: VisibilityTypes, first: Int = 10, offset: Int, before: String, after: String, last: Int, createdFrom: Date, createdTo: Date, userPk: Decimal, profilePk: Decimal, userName: String): ActivityLogConnection pk: Int! target: CommentsInterface } @@ -729,7 +729,7 @@ interface Node { } interface NodeActivityLogInterface { - nodeActivityLogs(visibility: VisibilityTypes, first: Int = 10, offset: Int, before: String, after: String, last: Int, createdFrom: Date, createdTo: Date, userPk: Decimal, profilePk: Decimal): ActivityLogConnection + nodeActivityLogs(visibility: VisibilityTypes, first: Int = 10, offset: Int, before: String, after: String, last: Int, createdFrom: Date, createdTo: Date, userPk: Decimal, profilePk: Decimal, userName: String): ActivityLogConnection } type NodeLogEvent implements Node { @@ -1142,6 +1142,7 @@ type Profile implements Node & PermissionsInterface & PageInterface & FollowsInt reactions(offset: Int, before: String, after: String, first: Int, last: Int, id: ID): ReactionConnection! ratings(offset: Int, before: String, after: String, first: Int, last: Int): RateConnection! user: User + activitylogSet(offset: Int, before: String, after: String, first: Int, last: Int, createdFrom: Date, createdTo: Date, userPk: Decimal, profilePk: Decimal, userName: String): ActivityLogConnection! members( offset: Int before: String @@ -1156,8 +1157,8 @@ type Profile implements Node & PermissionsInterface & PageInterface & FollowsInt ): ProfileUserRoleConnection chatroomparticipantSet(offset: Int, before: String, after: String, first: Int, last: Int, profile_TargetContentType: ID): ChatRoomParticipantConnection! unreadmessagecountSet(offset: Int, before: String, after: String, first: Int, last: Int): UnreadMessageCountConnection! - linkedOnContentCapitalSet(offset: Int, before: String, after: String, first: Int, last: Int, verb: Verbs): MessageConnection! - linkedOnContentSmallSet(offset: Int, before: String, after: String, first: Int, last: Int, verb: Verbs): MessageConnection! + linkedAsContentActorSet(offset: Int, before: String, after: String, first: Int, last: Int, verb: Verbs): MessageConnection! + linkedAsContentTargetSet(offset: Int, before: String, after: String, first: Int, last: Int, verb: Verbs): MessageConnection! messageSet(offset: Int, before: String, after: String, first: Int, last: Int, verb: Verbs): MessageConnection! following(offset: Int, before: String, after: String, first: Int, last: Int, targetIsFollowingBack: Boolean): FollowConnection followers(offset: Int, before: String, after: String, first: Int, last: Int, targetIsFollowingBack: Boolean): FollowConnection @@ -1190,7 +1191,7 @@ type Profile implements Node & PermissionsInterface & PageInterface & FollowsInt ): ChatRoomConnection unreadMessagesCount: Int pk: Int! - activityLogs(visibility: VisibilityTypes, first: Int = 10, offset: Int, before: String, after: String, last: Int, createdFrom: Date, createdTo: Date, userPk: Decimal, profilePk: Decimal): ActivityLogConnection + activityLogs(visibility: VisibilityTypes, first: Int = 10, offset: Int, before: String, after: String, last: Int, createdFrom: Date, createdTo: Date, userPk: Decimal, profilePk: Decimal, userName: String): ActivityLogConnection target: ProfileInterface } @@ -1348,7 +1349,7 @@ type ProfileUserRoleEdge { } type Query { - activityLogs(visibility: VisibilityTypes, first: Int = 10, offset: Int, before: String, after: String, last: Int, createdFrom: Date, createdTo: Date, userPk: Decimal, profilePk: Decimal): ActivityLogConnection + activityLogs(visibility: VisibilityTypes, first: Int = 10, offset: Int, before: String, after: String, last: Int, createdFrom: Date, createdTo: Date, userPk: Decimal, profilePk: Decimal, userName: String): ActivityLogConnection organization( """The ID of the object""" id: ID! @@ -1759,7 +1760,7 @@ type User implements Node & PermissionsInterface & NotificationsInterface & Page ): ProfileConnection profile: Profile pk: Int! - activityLogs(visibility: VisibilityTypes, first: Int = 10, offset: Int, before: String, after: String, last: Int, createdFrom: Date, createdTo: Date, userPk: Decimal, profilePk: Decimal): ActivityLogConnection + activityLogs(visibility: VisibilityTypes, first: Int = 10, offset: Int, before: String, after: String, last: Int, createdFrom: Date, createdTo: Date, userPk: Decimal, profilePk: Decimal, userName: String): ActivityLogConnection isAuthenticated: Boolean fullName: String shortName: String