5180 fichiers 38.5 Mo 0 téléchargements 476 vues mis à jour il y a 7 heures ui
nitro-v36-with-renderer-v36 / src / components / navigator / views / search / NavigatorSearchResultItemView.tsx
NavigatorSearchResultItemView.tsx 5.6 Ko Télécharger le fichier
import { GetSessionDataManager, RoomDataParser } from '@octane/renderer';
import { FC, KeyboardEvent, MouseEvent } from 'react';
import { CreateRoomSession, DoorStateType, TryVisitRoom } from '../../../../api';
import { LayoutBadgeImageView, LayoutRoomThumbnailView } from '../../../../common';
import { NativeTextTree } from '../../../../common/native-text/NativeTextTree';
import { useDoorState, useNavigatorRoomInfoPopupStore } from '../../../../hooks';
import { NavigatorSearchResultItemInfoView } from './NavigatorSearchResultItemInfoView';
import { NavigatorUserCountView } from './NavigatorUserCountView';

export interface NavigatorSearchResultItemViewProps {
    roomData: RoomDataParser;
    thumbnail?: boolean;
    eventTitle?: boolean;
    stripe?: boolean;
}

export const NavigatorSearchResultItemView: FC<NavigatorSearchResultItemViewProps> = (props) => {
    const { roomData = null, thumbnail = false, eventTitle = false, stripe = false } = props;
    const { setSnapshot: setDoorData } = useDoorState();
    const title = eventTitle && roomData.roomAdName ? roomData.roomAdName : roomData.roomName;

    const doorClass = () => {
        if (roomData.doorMode === RoomDataParser.DOORBELL_STATE) return 'octane-navigator-air__door octane-navigator-air__door--doorbell';
        if (roomData.doorMode === RoomDataParser.PASSWORD_STATE) return 'octane-navigator-air__door octane-navigator-air__door--password';
        if (roomData.doorMode === RoomDataParser.INVISIBLE_STATE) return 'octane-navigator-air__door octane-navigator-air__door--invisible';

        return '';
    };

    const visitRoom = (event: MouseEvent) => {
        event.stopPropagation();
        if (roomData.ownerId !== GetSessionDataManager().userId) {
            if (roomData.habboGroupId !== 0) {
                TryVisitRoom(roomData.roomId);
                return;
            }

            switch (roomData.doorMode) {
                case RoomDataParser.DOORBELL_STATE:
                    setDoorData((prevValue) => {
                        const newValue = { ...prevValue };
                        newValue.roomInfo = roomData;
                        newValue.state = DoorStateType.START_DOORBELL;
                        return newValue;
                    });
                    return;
                case RoomDataParser.PASSWORD_STATE:
                    setDoorData((prevValue) => {
                        const newValue = { ...prevValue };
                        newValue.roomInfo = roomData;
                        newValue.state = DoorStateType.START_PASSWORD;
                        return newValue;
                    });
                    return;
            }
        }

        CreateRoomSession(roomData.roomId);
    };

    const handleKeyDown = (event: KeyboardEvent) => {
        // The info button inside the row has its own keys; only the row itself visits the room.
        if (event.target !== event.currentTarget) return;
        if (event.key !== 'Enter' && event.key !== ' ') return;

        event.preventDefault();
        visitRoom(event as unknown as MouseEvent);
    };

    const retargetPopup = (event: MouseEvent<HTMLElement>) => {
        useNavigatorRoomInfoPopupStore.getState().retargetIfVisible(roomData, thumbnail ? 'tile' : 'row', event.currentTarget.getBoundingClientRect());
    };

    if (thumbnail)
        return (
            <NativeTextTree>
                <div
                    role="button"
                    tabIndex={0}
                    aria-label={title}
                    className={`octane-navigator-air__tile${stripe ? ' is-stripe' : ''}`}
                    onClick={visitRoom}
                    onKeyDown={handleKeyDown}
                    onMouseEnter={retargetPopup}
                >
                    <LayoutRoomThumbnailView className="octane-navigator-air__tile-thumb" customUrl={roomData.officialRoomPicRef} roomId={roomData.roomId}>
                        {roomData.habboGroupId > 0 && (
                            <LayoutBadgeImageView badgeCode={roomData.groupBadgeCode} className="octane-navigator-air__tile-badge" isGroup={true} />
                        )}
                        <NavigatorUserCountView userCount={roomData.userCount} maxUserCount={roomData.maxUserCount} />
                        {roomData.doorMode !== RoomDataParser.OPEN_STATE && <i className={`octane-navigator-air__tile-door ${doorClass()}`} />}
                    </LayoutRoomThumbnailView>
                    <div className="octane-navigator-air__tile-name">
                        <span>{title}</span>
                        <NavigatorSearchResultItemInfoView roomData={roomData} thumbnail={true} />
                    </div>
                </div>
            </NativeTextTree>
        );

    return (
        <NativeTextTree>
            <div
                role="button"
                tabIndex={0}
                aria-label={title}
                className={`octane-navigator-air__row${stripe ? ' is-stripe' : ''}`}
                onClick={visitRoom}
                onKeyDown={handleKeyDown}
                onMouseEnter={retargetPopup}
            >
                <NavigatorUserCountView userCount={roomData.userCount} maxUserCount={roomData.maxUserCount} />
                <span className="octane-navigator-air__row-name">{title}</span>
                {roomData.doorMode !== RoomDataParser.OPEN_STATE && <i className={`octane-navigator-air__row-door ${doorClass()}`} />}
                {roomData.habboGroupId > 0 && <i className="octane-navigator-air__row-group octane-navigator-air__group" />}
                <NavigatorSearchResultItemInfoView roomData={roomData} />
            </div>
        </NativeTextTree>
    );
};
15Sujets
1Dépôts
20Membres
3En ligne
Profile
Inscrit
Dernière visite
Messages
0
Votes positifs
0
Votes négatifs
0

Nous utilisons des cookies pour assurer le bon fonctionnement du site et améliorer votre expérience. en savoir plus

Autoriser