import { ExtendedProfileChangedMessageEvent, GetSessionDataManager, NavigatorSearchComposer, NavigatorSearchEvent, RelationshipStatusInfoEvent, RelationshipStatusInfoMessageParser, RoomDataParser, RoomEngineObjectEvent, RoomObjectCategory, RoomObjectType, UserCurrentBadgesComposer, UserCurrentBadgesEvent, UserProfileEvent, UserProfileParser, UserRelationshipsComposer } from '@nitrots/nitro-renderer'; import { FC, useState } from 'react'; import { CreateRoomSession, GetRoomSession, GetUserProfile, LocalizeText, SendMessageComposer } from '../../api'; import { Flex, Text } from '../../common'; import { BadgeInfoView } from './BadgeInfoView'; import { useMessageEvent, useNitroEvent } from '../../hooks'; import { NitroCard } from '../../layout'; import { FriendsContainerView } from './FriendsContainerView'; import { GroupsContainerView } from './GroupsContainerView'; import { UserContainerView } from './UserContainerView'; type ProfileTab = 'badge' | 'amici' | 'stanze' | 'gruppi'; export const UserProfileView: FC<{}> = props => { const [ userProfile, setUserProfile ] = useState(null); const [ userBadges, setUserBadges ] = useState([]); const [ userRelationships, setUserRelationships ] = useState(null); const [ activeTab, setActiveTab ] = useState('badge'); const [ userRooms, setUserRooms ] = useState(null); const onClose = () => { setUserProfile(null); setUserBadges([]); setUserRelationships(null); setActiveTab('badge'); setUserRooms(null); }; const onLeaveGroup = () => { if(!userProfile || (userProfile.id !== GetSessionDataManager().userId)) return; GetUserProfile(userProfile.id); }; const onTabClick = (tab: ProfileTab) => { setActiveTab(tab); if(tab === 'stanze' && !userRooms && userProfile) { SendMessageComposer(new NavigatorSearchComposer('hotel_view', `owner:${ userProfile.username }`)); } }; useMessageEvent(UserCurrentBadgesEvent, event => { const parser = event.getParser(); if(!userProfile || (parser.userId !== userProfile.id)) return; setUserBadges(parser.badges); }); useMessageEvent(RelationshipStatusInfoEvent, event => { const parser = event.getParser(); if(!userProfile || (parser.userId !== userProfile.id)) return; setUserRelationships(parser); }); useMessageEvent(UserProfileEvent, event => { const parser = event.getParser(); let isSameProfile = false; setUserProfile(prevValue => { if(prevValue && prevValue.id) isSameProfile = (prevValue.id === parser.id); return parser; }); if(!isSameProfile) { setUserBadges([]); setUserRelationships(null); setActiveTab('badge'); setUserRooms(null); } SendMessageComposer(new UserCurrentBadgesComposer(parser.id)); SendMessageComposer(new UserRelationshipsComposer(parser.id)); }); useMessageEvent(ExtendedProfileChangedMessageEvent, event => { const parser = event.getParser(); if(parser.userId != userProfile?.id) return; GetUserProfile(parser.userId); }); useMessageEvent(NavigatorSearchEvent, event => { if(!userProfile || activeTab !== 'stanze') return; const parser = event.getParser(); const result = parser.result; if(!result) return; const rooms: RoomDataParser[] = []; for(const resultList of result.results) { if(resultList.rooms && resultList.rooms.length) { for(const room of resultList.rooms) rooms.push(room); } } setUserRooms(rooms); }); useNitroEvent(RoomEngineObjectEvent.SELECTED, event => { if(!userProfile) return; if(event.category !== RoomObjectCategory.UNIT) return; const userData = GetRoomSession().userDataManager.getUserDataByIndex(event.objectId); if(userData.type !== RoomObjectType.USER) return; GetUserProfile(userData.webID); }); if(!userProfile) return null; return (
onTabClick('badge') }> { LocalizeText('extendedprofile.tab.badge') } onTabClick('amici') }> { LocalizeText('extendedprofile.tab.friends') } onTabClick('stanze') }> { LocalizeText('extendedprofile.tab.rooms') } onTabClick('gruppi') }> { LocalizeText('extendedprofile.tab.groups') }
{ activeTab === 'badge' && (
{ userBadges && (userBadges.length > 0) ? userBadges.map((badge, index) => ( )) : ( { LocalizeText('extendedprofile.badge.empty') } ) }
) } { activeTab === 'amici' && (
{ userRelationships ? ( ) : ( { LocalizeText('generic.loading') } ) }
) } { activeTab === 'stanze' && (
{ !userRooms && ( { LocalizeText('extendedprofile.rooms.loading') } ) } { userRooms && userRooms.length === 0 && ( { LocalizeText('extendedprofile.rooms.empty') } ) } { userRooms && userRooms.length > 0 && userRooms.map(room => ( CreateRoomSession(room.roomId) }>
{ room.roomName } { room.description && { room.description } }
{ room.userCount }/{ room.maxUserCount }
)) }
) } { activeTab === 'gruppi' && (
) }
); };