5180 fichiers 38.5 Mo 0 téléchargements 429 vues mis à jour il y a 7 heures ui
nitro-v36-with-renderer-v36 / src / hooks / rooms / widgets / furniture / useFurnitureVimeoWidget.ts
useFurnitureVimeoWidget.ts 2.9 Ko Télécharger le fichier
import {
    GetRoomEngine,
    RoomControllerLevel,
    RoomEngineTriggerWidgetEvent,
    RoomId,
    RoomObjectVariable,
    RoomWidgetEnum,
    SetObjectDataMessageComposer
} from '@octane/renderer';
import { useRef, useState } from 'react';
import { IsAnyRoomController, SendMessageComposer } from '../../../../api';
import { useOctaneEvent } from '../../../events';
import { useFurniRemovedEvent } from '../../engine';
import { useRoom } from '../../useRoom';
import { readVimeoVideoId, sanitizeVimeoVideoIdInput, VIMEO_VIDEO_ID_KEY } from './useFurnitureVimeoWidget.helpers';

/**
 * The official Vimeo furni widget (`RWE_VIMEO`, handler `class_3348`): the furni's
 * OPEN_WIDGET opens the viewer on the `videoId` of its map stuff data, CLOSE_WIDGET
 * (the furni going away) closes it. Room rights holders can change the id; the
 * server's `InteractionVimeo` accepts it through the set-object-data packet.
 */
const useFurnitureVimeoWidgetState = () => {
    const [objectId, setObjectId] = useState(-1);
    const [category, setCategory] = useState(-1);
    const [videoId, setVideoId] = useState(0);
    const objectIdRef = useRef(-1);
    const { roomSession = null } = useRoom();

    const canEdit = !!roomSession && (roomSession.isRoomOwner || roomSession.controllerLevel >= RoomControllerLevel.GUEST || IsAnyRoomController());

    const onClose = () => {
        objectIdRef.current = -1;
        setObjectId(-1);
        setCategory(-1);
        setVideoId(0);
    };

    const saveVideoId = (value: string) => {
        if (objectIdRef.current === -1 || !canEdit) return;

        const digits = sanitizeVimeoVideoIdInput(value) || '0';
        const data = new Map<string, string>();

        data.set(VIMEO_VIDEO_ID_KEY, digits);
        SendMessageComposer(new SetObjectDataMessageComposer(objectIdRef.current, data));
        setVideoId(Number(digits));
    };

    useOctaneEvent<RoomEngineTriggerWidgetEvent>([RoomEngineTriggerWidgetEvent.OPEN_WIDGET, RoomEngineTriggerWidgetEvent.CLOSE_WIDGET], (event) => {
        if (event.widget !== RoomWidgetEnum.VIMEO || RoomId.isRoomPreviewerId(event.roomId)) return;

        if (event.type === RoomEngineTriggerWidgetEvent.CLOSE_WIDGET) {
            if (objectIdRef.current === event.objectId) onClose();

            return;
        }

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

        if (!roomObject) return;

        objectIdRef.current = event.objectId;
        setObjectId(event.objectId);
        setCategory(event.category);
        setVideoId(readVimeoVideoId(roomObject.model.getValue<unknown>(RoomObjectVariable.FURNITURE_DATA)));
    });

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

        onClose();
    });

    return { objectId, videoId, canEdit, onClose, saveVideoId };
};

export const useFurnitureVimeoWidget = useFurnitureVimeoWidgetState;
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