import { ActionAvatar } from "@/app/components/ActionAvatar/ActionAvatar"; import { Breadcrumbs } from "@/app/components/Breadcrumbs/Breadcrumbs"; import { GroupInvite } from "@/app/components/GroupInvite/GroupInvite"; import { InternalScreen } from "@/app/components/InternalScreen/InternalScreen"; import { KeyImage } from "@/app/components/KeyImage/KeyImage"; import { SettingsInput } from "@/app/components/SettingsInput/SettingsInput"; import { SettingsPaper } from "@/app/components/SettingsPaper/SettingsPaper"; import { SettingsText } from "@/app/components/SettingsText/SettingsText"; import { SettingsTitle } from "@/app/components/SettingsTitle/SettingsTitle"; import { UsersTable } from "@/app/components/UsersTable/UsersTable"; import { VerifiedBadge } from "@/app/components/VerifiedBadge/VerifiedBadge"; import { useRosettaColors } from "@/app/hooks/useRosettaColors"; import { usePublicKey } from "@/app/providers/AccountProvider/usePublicKey"; import { useGroupMembers } from "@/app/providers/InformationProvider/useGroupMembers"; import { useGroups } from "@/app/providers/DialogProvider/useGroups"; import { useGroupInformation } from "@/app/providers/InformationProvider/useGroupInformation"; import { Button, Flex, Paper, Skeleton, Text, useMantineTheme } from "@mantine/core"; import { IconBan, IconDoorExit, IconMessage } from "@tabler/icons-react"; import { useEffect, useState } from "react"; import { useNavigate, useParams } from "react-router-dom"; import { modals } from "@mantine/modals"; export function GroupInfo() { const params = useParams(); const {groupInfo} = useGroupInformation(params.id!); const {members, loading: membersLoading} = useGroupMembers(params.id!, true); const publicKey = usePublicKey(); const isAdmin = members.length > 0 && members[0] == publicKey; const colors = useRosettaColors(); const navigate = useNavigate(); const [groupKey, setGroupKey] = useState(''); const {getGroupKey, leaveGroup, banUserOnGroup, loading, getPrefix} = useGroups(); const theme = useMantineTheme(); useEffect(() => { initGroupKey(); }, [params.id]); const initGroupKey = async () => { const key = await getGroupKey(groupInfo.groupId); setGroupKey(key); } const leaveGroupWithModal = () => { modals.openConfirmModal({ title: 'Leave group', centered: true, children: ( You are attempting to leave the group. Are you sure you want to proceed? ), withCloseButton: false, labels: { confirm: 'Leave', cancel: "Cancel" }, confirmProps: { color: 'red' }, onConfirm: () => { leaveGroup(groupInfo.groupId); } }); } const banUserWithModal = (userPublicKey: string) => { modals.openConfirmModal({ title: 'Ban user from group', centered: true, children: ( You are attempting to ban this user from the group. ), withCloseButton: false, labels: { confirm: 'Ban', cancel: "Cancel" }, confirmProps: { color: 'red' }, onConfirm: () => { confirmBan(userPublicKey); } }); } const confirmBan = (userPublicKey: string) => { banUserOnGroup(userPublicKey, groupInfo.groupId); } return ( <> } onClick={leaveGroupWithModal} p={0} pr={6} variant={'transparent'}>Leave }> {(members.length > 0 || !membersLoading) && ( <> {groupInfo.title.trim()} {members.length} member{members.length !== 1 ? 's' : ''} {groupInfo.description.trim().length > 0 && ( Information {groupInfo.description.trim()} )} {isAdmin && ( )} navigate('/main/groupencrypt/' + groupKey)} hit="Encryption key" settingsIcon={ }> Click to see encryption key for secure group communication {members.length > 0 && isAdmin && ( <> Group Members ( <> navigate('/main/chat/' + userPublicKey)} stroke={1.4} size={20} color={colors.brandColor}> {publicKey == userPublicKey && ( )} {publicKey != userPublicKey && isAdmin && ( banUserWithModal(userPublicKey)} stroke={1.4} size={20} color={colors.error}> )} )} usersPublicKeys={members} /> Members are listed in order of group creation. The first member is the group admin and can manage group settings. )} {!isAdmin && ( Group administrator has marked in messages with )} )} {membersLoading && members.length <= 0 && ( <> )} ); }