import { CreateLinkEvent, GetSessionDataManager, RoomControllerLevel, RoomObjectCategory, RoomObjectVariable, RoomUnitGiveHandItemComposer, SetRelationshipStatusComposer, TradingOpenComposer } from '@nitrots/nitro-renderer'; import { FC, useEffect, useMemo, useState } from 'react'; import { FaChevronLeft, FaChevronRight } from 'react-icons/fa'; import { AvatarInfoUser, DispatchUiEvent, GetOwnRoomObject, GetUserProfile, LocalizeText, MessengerFriend, ReportType, RoomWidgetUpdateChatInputContentEvent, SendMessageComposer } from '../../../../../api'; import { Flex } from '../../../../../common'; import { useFriends, useHelp, useIsUserIgnored, useRoom, useSessionInfo, useWiredTools } from '../../../../../hooks'; import { ContextMenuHeaderView } from '../../context-menu/ContextMenuHeaderView'; import { ContextMenuListItemView } from '../../context-menu/ContextMenuListItemView'; import { ContextMenuView } from '../../context-menu/ContextMenuView'; interface AvatarInfoWidgetAvatarViewProps { avatarInfo: AvatarInfoUser; onClose: () => void; } const MODE_NORMAL = 0; const MODE_MODERATE = 1; const MODE_MODERATE_BAN = 2; const MODE_MODERATE_MUTE = 3; const MODE_AMBASSADOR = 4; const MODE_AMBASSADOR_MUTE = 5; const MODE_RELATIONSHIP = 6; export const AvatarInfoWidgetAvatarView: FC = props => { const { avatarInfo = null, onClose = null } = props; const [ mode, setMode ] = useState(MODE_NORMAL); const { canRequestFriend = null } = useFriends(); const { report = null } = useHelp(); const { roomSession = null, isHandItemBlocked = false } = useRoom(); const { userRespectRemaining = 0, respectUser = null } = useSessionInfo(); const { openInspectionForUser, showInspectButton } = useWiredTools(); // Reactive: the menu auto-flips Ignore <-> Unignore if the state // changes while the popup is open. Direct hook call (no useBetween // scope here) so useSyncExternalStore installs against the real // React dispatcher. const isIgnored = useIsUserIgnored(avatarInfo.name); const isShowGiveRights = useMemo(() => { return (avatarInfo.amIOwner && (avatarInfo.targetRoomControllerLevel < RoomControllerLevel.GUEST) && !avatarInfo.isGuildRoom); }, [ avatarInfo ]); const isShowRemoveRights = useMemo(() => { return (avatarInfo.amIOwner && (avatarInfo.targetRoomControllerLevel === RoomControllerLevel.GUEST) && !avatarInfo.isGuildRoom); }, [ avatarInfo ]); const moderateMenuHasContent = useMemo(() => { return (avatarInfo.canBeKicked || avatarInfo.canBeBanned || avatarInfo.canBeMuted || isShowGiveRights || isShowRemoveRights); }, [ isShowGiveRights, isShowRemoveRights, avatarInfo ]); const canGiveHandItem = useMemo(() => { if(isHandItemBlocked) return false; let flag = false; const roomObject = GetOwnRoomObject(); if(roomObject) { const carryId = roomObject.model.getValue(RoomObjectVariable.FIGURE_CARRY_OBJECT); if((carryId > 0) && (carryId < 999999)) flag = true; } return flag; }, [ isHandItemBlocked ]); const processAction = (name: string) => { let hideMenu = true; if(name) { switch(name) { case 'moderate': hideMenu = false; setMode(MODE_MODERATE); break; case 'ban': hideMenu = false; setMode(MODE_MODERATE_BAN); break; case 'mute': hideMenu = false; setMode(MODE_MODERATE_MUTE); break; case 'ambassador': hideMenu = false; setMode(MODE_AMBASSADOR); break; case 'ambassador_mute': hideMenu = false; setMode(MODE_AMBASSADOR_MUTE); break; case 'back_moderate': hideMenu = false; setMode(MODE_MODERATE); break; case 'back_ambassador': hideMenu = false; setMode(MODE_AMBASSADOR); break; case 'back': hideMenu = false; setMode(MODE_NORMAL); break; case 'whisper': DispatchUiEvent(new RoomWidgetUpdateChatInputContentEvent(RoomWidgetUpdateChatInputContentEvent.WHISPER, avatarInfo.name)); break; case 'friend': CreateLinkEvent(`friends/request/${ avatarInfo.webID }/${ avatarInfo.name }`); break; case 'relationship': hideMenu = false; setMode(MODE_RELATIONSHIP); break; case 'respect': { respectUser(avatarInfo.webID); if((userRespectRemaining - 1) >= 1) hideMenu = false; break; } case 'ignore': GetSessionDataManager().ignoreUser(avatarInfo.name); break; case 'unignore': GetSessionDataManager().unignoreUser(avatarInfo.name); break; case 'kick': roomSession.sendKickMessage(avatarInfo.webID); break; case 'ban_hour': roomSession.sendBanMessage(avatarInfo.webID, 'RWUAM_BAN_USER_HOUR'); break; case 'ban_day': roomSession.sendBanMessage(avatarInfo.webID, 'RWUAM_BAN_USER_DAY'); break; case 'perm_ban': roomSession.sendBanMessage(avatarInfo.webID, 'RWUAM_BAN_USER_PERM'); break; case 'mute_2min': roomSession.sendMuteMessage(avatarInfo.webID, 2); break; case 'mute_5min': roomSession.sendMuteMessage(avatarInfo.webID, 5); break; case 'mute_10min': roomSession.sendMuteMessage(avatarInfo.webID, 10); break; case 'give_rights': roomSession.sendGiveRightsMessage(avatarInfo.webID); break; case 'remove_rights': roomSession.sendTakeRightsMessage(avatarInfo.webID); break; case 'trade': SendMessageComposer(new TradingOpenComposer(avatarInfo.roomIndex)); break; case 'report': report(ReportType.BULLY, { reportedUserId: avatarInfo.webID }); break; case 'inspect': openInspectionForUser(avatarInfo.roomIndex); break; case 'pass_hand_item': SendMessageComposer(new RoomUnitGiveHandItemComposer(avatarInfo.webID)); break; case 'ambassador_alert': roomSession.sendAmbassadorAlertMessage(avatarInfo.webID); break; case 'ambassador_kick': roomSession.sendKickMessage(avatarInfo.webID); break; case 'ambassador_mute_2min': roomSession.sendMuteMessage(avatarInfo.webID, 2); break; case 'ambassador_mute_10min': roomSession.sendMuteMessage(avatarInfo.webID, 10); break; case 'ambassador_mute_60min': roomSession.sendMuteMessage(avatarInfo.webID, 60); break; case 'ambassador_mute_18hour': roomSession.sendMuteMessage(avatarInfo.webID, 1080); break; case 'rship_heart': SendMessageComposer(new SetRelationshipStatusComposer(avatarInfo.webID, MessengerFriend.RELATIONSHIP_HEART)); break; case 'rship_smile': SendMessageComposer(new SetRelationshipStatusComposer(avatarInfo.webID, MessengerFriend.RELATIONSHIP_SMILE)); break; case 'rship_bobba': SendMessageComposer(new SetRelationshipStatusComposer(avatarInfo.webID, MessengerFriend.RELATIONSHIP_BOBBA)); break; case 'rship_none': SendMessageComposer(new SetRelationshipStatusComposer(avatarInfo.webID, MessengerFriend.RELATIONSHIP_NONE)); break; } } if(hideMenu) onClose(); }; useEffect(() => { setMode(MODE_NORMAL); }, [ avatarInfo ]); return ( GetUserProfile(avatarInfo.webID) } dangerouslySetInnerHTML={ { __html: `${ avatarInfo.name }` } }> { (mode === MODE_NORMAL) && <> { canRequestFriend(avatarInfo.webID) && processAction('friend') }> { LocalizeText('infostand.button.friend') } } processAction('trade') }> { LocalizeText('infostand.button.trade') } processAction('whisper') }> { LocalizeText('infostand.button.whisper') } { (userRespectRemaining > 0) && processAction('respect') }> { LocalizeText('infostand.button.respect', [ 'count' ], [ userRespectRemaining.toString() ]) } } { !canRequestFriend(avatarInfo.webID) && processAction('relationship') }> { LocalizeText('infostand.link.relationship') } } { !isIgnored && processAction('ignore') }> { LocalizeText('infostand.button.ignore') } } { isIgnored && processAction('unignore') }> { LocalizeText('infostand.button.unignore') } } processAction('report') }> { LocalizeText('infostand.button.report') } { showInspectButton && processAction('inspect') }> Inspect } { moderateMenuHasContent && processAction('moderate') }> { LocalizeText('infostand.link.moderate') } } { avatarInfo.isAmbassador && processAction('ambassador') }> { LocalizeText('infostand.link.ambassador') } } { canGiveHandItem && processAction('pass_hand_item') }> { LocalizeText('avatar.widget.pass_hand_item') } } } { (mode === MODE_MODERATE) && <> processAction('kick') }> { LocalizeText('infostand.button.kick') } processAction('mute') }> { LocalizeText('infostand.button.mute') } processAction('ban') }> { LocalizeText('infostand.button.ban') } { isShowGiveRights && processAction('give_rights') }> { LocalizeText('infostand.button.giverights') } } { isShowRemoveRights && processAction('remove_rights') }> { LocalizeText('infostand.button.removerights') } } processAction('back') }> { LocalizeText('generic.back') } } { (mode === MODE_MODERATE_BAN) && <> processAction('ban_hour') }> { LocalizeText('infostand.button.ban_hour') } processAction('ban_day') }> { LocalizeText('infostand.button.ban_day') } processAction('perm_ban') }> { LocalizeText('infostand.button.perm_ban') } processAction('back_moderate') }> { LocalizeText('generic.back') } } { (mode === MODE_MODERATE_MUTE) && <> processAction('mute_2min') }> { LocalizeText('infostand.button.mute_2min') } processAction('mute_5min') }> { LocalizeText('infostand.button.mute_5min') } processAction('mute_10min') }> { LocalizeText('infostand.button.mute_10min') } processAction('back_moderate') }> { LocalizeText('generic.back') } } { (mode === MODE_AMBASSADOR) && <> processAction('ambassador_alert') }> { LocalizeText('infostand.button.alert') } processAction('ambassador_kick') }> { LocalizeText('infostand.button.kick') } processAction('ambassador_mute') }> { LocalizeText('infostand.button.mute') } processAction('back') }> { LocalizeText('generic.back') } } { (mode === MODE_AMBASSADOR_MUTE) && <> processAction('ambassador_mute_2min') }> { LocalizeText('infostand.button.mute_2min') } processAction('ambassador_mute_10min') }> { LocalizeText('infostand.button.mute_10min') } processAction('ambassador_mute_60min') }> { LocalizeText('infostand.button.mute_60min') } processAction('ambassador_mute_18hr') }> { LocalizeText('infostand.button.mute_18hour') } processAction('back_ambassador') }> { LocalizeText('generic.back') } } { (mode === MODE_RELATIONSHIP) && <> processAction('rship_heart') }>
processAction('rship_smile') }>
processAction('rship_bobba') }>
processAction('rship_none') }> { LocalizeText('avatar.widget.clear_relationship') } processAction('back') }> { LocalizeText('generic.back') } } ); };