// SPDX-License-Identifier: AGPL-3.0-or-later import {GroupDMAvatar} from '@app/features/app/components/shared/GroupDMAvatar'; import type {Channel} from '@app/features/channel/models/Channel'; import * as ChannelUtils from '@app/features/channel/utils/ChannelUtils'; import {GuildIcon} from '@app/features/guild/components/popouts/GuildIcon'; import {GO_BACK_DESCRIPTOR} from '@app/features/i18n/utils/CommonMessageDescriptors'; import {focusChannelTextareaAfterNavigation} from '@app/features/messaging/utils/ChannelTextareaFocusUtils'; import * as NavigationCommands from '@app/features/navigation/commands/NavigationCommands'; import SelectedChannel from '@app/features/navigation/state/SelectedChannel'; import {BottomSheet} from '@app/features/ui/bottom_sheet/BottomSheet'; import * as ModalCommands from '@app/features/ui/commands/ModalCommands'; import {Scroller} from '@app/features/ui/components/Scroller'; import {StatusAwareAvatar} from '@app/features/ui/components/StatusAwareAvatar'; import styles from '@app/features/user/components/modals/MutualItemsSheet.module.css'; import {getMutualItemsDescriptor} from '@app/features/user/components/modals/user_profile_modal/MutualItemsDescriptors'; import {getMutualCommunityDisplayItems} from '@app/features/user/components/modals/user_profile_modal/MutualItemsUtils'; import type {Profile} from '@app/features/user/models/Profile'; import {User} from '@app/features/user/models/User'; import UserProfileMobile from '@app/features/user/state/UserProfileMobile'; import * as NicknameUtils from '@app/features/user/utils/NicknameUtils'; import {ME} from '@fluxer/constants/src/AppConstants'; import type {UserPartial} from '@fluxer/schema/src/domains/user/UserResponseSchemas'; import {msg, plural} from '@lingui/core/macro'; import {useLingui as useLinguiRuntime} from '@lingui/react'; import {useLingui} from '@lingui/react/macro'; import {ArrowLeftIcon} from '@phosphor-icons/react'; import {observer} from 'mobx-react-lite'; import type React from 'react'; const MUTUAL_FRIENDS_DESCRIPTOR = msg({ message: 'Mutual friends', comment: 'Short label in the mutual items sheet. Keep it concise.', }); type MutualItemsView = 'friends' | 'communities_groups'; interface MutualItemsSheetProps { isOpen: boolean; onClose: () => void; view: MutualItemsView; profile: Profile; mutualGroups: ReadonlyArray; } export const MutualItemsSheet: React.FC = observer( ({isOpen, onClose, view, profile, mutualGroups}) => { const {i18n} = useLingui(); const mutualCommunitiesCount = getMutualCommunityDisplayItems(profile.mutualGuilds ?? []).length; const mutualGroupsCount = mutualGroups.length; const title = (() => { switch (view) { case 'friends': return i18n._(MUTUAL_FRIENDS_DESCRIPTOR); case 'communities_groups': return i18n._( getMutualItemsDescriptor({ mutualCommunitiesCount, mutualGroupsCount, includeCount: false, }), ); } })(); return ( } title={title} data-flx="user.mutual-items-sheet.bottom-sheet" >
{view === 'friends' && ( )} {view === 'communities_groups' && ( )}
); }, ); const MutualFriendsList: React.FC<{profile: Profile; onClose: () => void}> = observer(({profile, onClose}) => { const friends = profile.mutualFriends ?? []; return ( <> {friends.map((friend: UserPartial) => { const friendRecord = new User(friend); return ( ); })} ); }); const MutualCommunitiesGroupsList: React.FC<{ profile: Profile; groups: ReadonlyArray; onClose: () => void; }> = observer(({profile, groups, onClose}) => { useLinguiRuntime(); const mutualCommunityDisplayItems = getMutualCommunityDisplayItems(profile.mutualGuilds ?? []); return ( <> {groups.map((group) => { const memberCount = group.recipientIds.length + 1; const memberLabel = plural( {count: memberCount}, { one: '# member', other: '# members', }, ); return ( ); })} {groups.length > 0 && mutualCommunityDisplayItems.length > 0 && (
)} {mutualCommunityDisplayItems.map(({guild, nick}) => ( ))} ); });