5180 fichiers 38.5 Mo 0 téléchargements 304 vues mis à jour il y a 6 heures ui
nitro-v36-with-renderer-v36 / src / hooks / rooms / widgets / useDoorState.ts
useDoorState.ts 3.2 Ko Télécharger le fichier
import {
    DoorbellMessageEvent,
    FlatAccessDeniedMessageEvent,
    GenericErrorEvent,
    GetGuestRoomResultEvent,
    GetSessionDataManager,
    RoomDataParser,
    RoomDoorbellAcceptedEvent
} from '@octane/renderer';
import { useCallback, useState } from 'react';
import { registerSharedHook, useSharedHook } from '@/state/useSharedHook';
import { DoorStateType, GenericErrorCode } from '../../../api';
import { useMessageEvent } from '../../events';

export type DoorStateSnapshot = {
    roomInfo: RoomDataParser | null;
    state: number;
};

const INITIAL: DoorStateSnapshot = { roomInfo: null, state: DoorStateType.NONE };

const useDoorStateStore = () => {
    const [snapshot, setSnapshot] = useState<DoorStateSnapshot>(INITIAL);

    const handleDoorbell = useCallback((event: DoorbellMessageEvent) => {
        const parser = event.getParser();
        if (parser.userName && parser.userName.length > 0) return;
        setSnapshot((prev) => ({ ...prev, state: DoorStateType.STATE_WAITING }));
    }, []);

    const handleAccepted = useCallback((event: RoomDoorbellAcceptedEvent) => {
        const parser = event.getParser();
        if (parser.userName && parser.userName.length > 0) return;
        setSnapshot((prev) => ({ ...prev, state: DoorStateType.STATE_ACCEPTED }));
    }, []);

    const handleDenied = useCallback((event: FlatAccessDeniedMessageEvent) => {
        const parser = event.getParser();
        if (parser.userName && parser.userName.length > 0) return;
        setSnapshot((prev) => ({ ...prev, state: DoorStateType.STATE_NO_ANSWER }));
    }, []);

    const handleGenericError = useCallback((event: GenericErrorEvent) => {
        const parser = event.getParser();
        if (parser.errorCode !== GenericErrorCode.WRONG_ROOM_PASSWORD) return;
        setSnapshot((prev) => ({ ...prev, state: DoorStateType.STATE_WRONG_PASSWORD }));
    }, []);

    const handleGuestRoom = useCallback((event: GetGuestRoomResultEvent) => {
        const parser = event.getParser();
        if (parser.roomEnter) {
            setSnapshot(INITIAL);
            return;
        }
        if (!parser.roomForward) return;
        if (parser.data.ownerName === GetSessionDataManager().userName) return;
        if (parser.isGroupMember) return;
        if (parser.data.doorMode === RoomDataParser.DOORBELL_STATE) {
            setSnapshot({ roomInfo: parser.data, state: DoorStateType.START_DOORBELL });
            return;
        }
        if (parser.data.doorMode === RoomDataParser.PASSWORD_STATE) {
            setSnapshot({ roomInfo: parser.data, state: DoorStateType.START_PASSWORD });
        }
    }, []);

    useMessageEvent<DoorbellMessageEvent>(DoorbellMessageEvent, handleDoorbell);
    useMessageEvent<RoomDoorbellAcceptedEvent>(RoomDoorbellAcceptedEvent, handleAccepted);
    useMessageEvent<FlatAccessDeniedMessageEvent>(FlatAccessDeniedMessageEvent, handleDenied);
    useMessageEvent<GenericErrorEvent>(GenericErrorEvent, handleGenericError);
    useMessageEvent<GetGuestRoomResultEvent>(GetGuestRoomResultEvent, handleGuestRoom);

    const reset = useCallback(() => setSnapshot(INITIAL), []);

    return { snapshot, setSnapshot, reset };
};

export const useDoorState = () => useSharedHook(useDoorStateStore);

registerSharedHook(useDoorStateStore);
15Sujets
1Dépôts
20Membres
2En 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