5180 fichiers 38.5 Mo 0 téléchargements 427 vues mis à jour il y a 7 heures ui
nitro-v36-with-renderer-v36 / src / hooks / rooms / widgets / furniture / useFurnitureYoutubeWidget.ts
useFurnitureYoutubeWidget.ts 5.5 Ko Télécharger le fichier
import {
    ControlYoutubeDisplayPlaybackMessageComposer,
    GetRoomEngine,
    GetSessionDataManager,
    GetYoutubeDisplayStatusMessageComposer,
    RoomEngineTriggerWidgetEvent,
    RoomId,
    SecurityLevel,
    SetYoutubeDisplayPlaylistMessageComposer,
    YoutubeControlVideoMessageEvent,
    YoutubeDisplayPlaylist,
    YoutubeDisplayPlaylistsEvent,
    YoutubeDisplayVideoMessageEvent
} from '@octane/renderer';
import { useRef, useState } from 'react';
import { HasSessionPermission, IsOwnerOfFurniture, SendMessageComposer, YoutubeVideoPlaybackStateEnum } from '../../../../api';
import { useMessageEvent, useOctaneEvent } from '../../../events';
import { useFurniRemovedEvent } from '../../engine';

const CONTROL_COMMAND_PREVIOUS_VIDEO = 0;
const CONTROL_COMMAND_NEXT_VIDEO = 1;
const CONTROL_COMMAND_PAUSE_VIDEO = 2;
const CONTROL_COMMAND_CONTINUE_VIDEO = 3;

const useFurnitureYoutubeWidgetState = () => {
    const [objectId, setObjectId] = useState(-1);
    const [category, setCategory] = useState(-1);
    const objectIdRef = useRef(-1);
    const [videoId, setVideoId] = useState<string>(null);
    const [videoStart, setVideoStart] = useState<number>(null);
    const [videoEnd, setVideoEnd] = useState<number>(null);
    const [currentVideoState, setCurrentVideoState] = useState(-1);
    const [selectedVideo, setSelectedVideo] = useState<string>(null);
    const [playlists, setPlaylists] = useState<YoutubeDisplayPlaylist[]>(null);
    const [hasControl, setHasControl] = useState(false);

    const onClose = () => {
        objectIdRef.current = -1;
        setObjectId(-1);
        setCategory(-1);
        setVideoId(null);
        setVideoStart(null);
        setVideoEnd(null);
        setCurrentVideoState(-1);
        setSelectedVideo(null);
        setPlaylists(null);
        setHasControl(false);
    };

    const previous = () => SendMessageComposer(new ControlYoutubeDisplayPlaybackMessageComposer(objectId, CONTROL_COMMAND_PREVIOUS_VIDEO));

    const next = () => SendMessageComposer(new ControlYoutubeDisplayPlaybackMessageComposer(objectId, CONTROL_COMMAND_NEXT_VIDEO));

    const pause = () =>
        hasControl && videoId && videoId.length && SendMessageComposer(new ControlYoutubeDisplayPlaybackMessageComposer(objectId, CONTROL_COMMAND_PAUSE_VIDEO));

    const play = () =>
        hasControl &&
        videoId &&
        videoId.length &&
        SendMessageComposer(new ControlYoutubeDisplayPlaybackMessageComposer(objectId, CONTROL_COMMAND_CONTINUE_VIDEO));

    const selectVideo = (video: string) => {
        if (selectedVideo === video) {
            setSelectedVideo(null);
            SendMessageComposer(new SetYoutubeDisplayPlaylistMessageComposer(objectId, ''));

            return;
        }

        setSelectedVideo(video);
        SendMessageComposer(new SetYoutubeDisplayPlaylistMessageComposer(objectId, video));
    };

    useOctaneEvent<RoomEngineTriggerWidgetEvent>(RoomEngineTriggerWidgetEvent.REQUEST_YOUTUBE, (event) => {
        if (RoomId.isRoomPreviewerId(event.roomId)) return;

        const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category);

        if (!roomObject) return;

        objectIdRef.current = event.objectId;
        setObjectId(event.objectId);
        setCategory(event.category);
        setHasControl(HasSessionPermission('acc_anyroomowner', SecurityLevel.EMPLOYEE) || IsOwnerOfFurniture(roomObject));

        SendMessageComposer(new GetYoutubeDisplayStatusMessageComposer(event.objectId));
    });

    useMessageEvent<YoutubeDisplayVideoMessageEvent>(YoutubeDisplayVideoMessageEvent, (event) => {
        const parser = event.getParser();
        const currentObjectId = objectIdRef.current;

        if (currentObjectId === -1 || currentObjectId !== parser.furniId) return;

        setVideoId(parser.videoId);
        setVideoStart(parser.startAtSeconds);
        setVideoEnd(parser.endAtSeconds);
        setCurrentVideoState(parser.state);
    });

    useMessageEvent<YoutubeDisplayPlaylistsEvent>(YoutubeDisplayPlaylistsEvent, (event) => {
        const parser = event.getParser();
        const currentObjectId = objectIdRef.current;

        if (currentObjectId === -1 || currentObjectId !== parser.furniId) return;

        setPlaylists(parser.playlists);
        setSelectedVideo(parser.selectedPlaylistId);
        setVideoId(null);
        setCurrentVideoState(-1);
        setVideoEnd(null);
        setVideoStart(null);
    });

    useMessageEvent<YoutubeControlVideoMessageEvent>(YoutubeControlVideoMessageEvent, (event) => {
        const parser = event.getParser();
        const currentObjectId = objectIdRef.current;

        if (currentObjectId === -1 || currentObjectId !== parser.furniId) return;

        switch (parser.commandId) {
            case 1:
                setCurrentVideoState(YoutubeVideoPlaybackStateEnum.PLAYING);
                break;
            case 2:
                setCurrentVideoState(YoutubeVideoPlaybackStateEnum.PAUSED);
                break;
        }
    });

    useFurniRemovedEvent(objectId !== -1 && category !== -1, (event) => {
        if (event.id !== objectId || event.category !== category) return;

        onClose();
    });

    return {
        objectId,
        videoId,
        videoStart,
        videoEnd,
        currentVideoState,
        selectedVideo,
        playlists,
        hasControl,
        onClose,
        previous,
        next,
        pause,
        play,
        selectVideo
    };
};

export const useFurnitureYoutubeWidget = useFurnitureYoutubeWidgetState;
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