5180 fichiers 38.5 Mo 0 téléchargements 300 vues mis à jour il y a 6 heures ui
nitro-v36-with-renderer-v36 / src / components / navigator / views / NavigatorDoorStateView.tsx
NavigatorDoorStateView.tsx 5.2 Ko Télécharger le fichier
import { FC, useEffect, useState } from 'react';
import { CreateRoomSession, DoorStateType, GoToDesktop, LocalizeText } from '../../../api';
import { Button, OctaneCardContentView, OctaneCardHeaderView, OctaneCardView, Text } from '../../../common';
import { NativeTextTree } from '../../../common/native-text/NativeTextTree';
import { useDoorState } from '../../../hooks';
import { OctaneInput } from '../../../layout';

const VISIBLE_STATES = [
    DoorStateType.START_DOORBELL,
    DoorStateType.STATE_WAITING,
    DoorStateType.STATE_NO_ANSWER,
    DoorStateType.START_PASSWORD,
    DoorStateType.STATE_WRONG_PASSWORD
];
const DOORBELL_STATES = [DoorStateType.START_DOORBELL, DoorStateType.STATE_WAITING, DoorStateType.STATE_NO_ANSWER];

export const NavigatorDoorStateView: FC<{}> = (props) => {
    const [password, setPassword] = useState('');
    const { snapshot, setSnapshot, reset } = useDoorState();

    const onClose = () => {
        if (snapshot.state === DoorStateType.STATE_WAITING) GoToDesktop();
        reset();
    };

    const ring = () => {
        if (!snapshot.roomInfo) return;
        CreateRoomSession(snapshot.roomInfo.roomId);
        setSnapshot((prev) => ({ ...prev, state: DoorStateType.STATE_PENDING_SERVER }));
    };

    const tryEntering = () => {
        if (!snapshot.roomInfo) return;
        CreateRoomSession(snapshot.roomInfo.roomId, password);
        setSnapshot((prev) => ({ ...prev, state: DoorStateType.STATE_PENDING_SERVER }));
    };

    useEffect(() => {
        if (snapshot.state !== DoorStateType.STATE_NO_ANSWER) return;
        GoToDesktop();
    }, [snapshot.state]);

    if (snapshot.state === DoorStateType.NONE) return null;
    if (VISIBLE_STATES.indexOf(snapshot.state) === -1) return null;

    const isDoorbell = DOORBELL_STATES.indexOf(snapshot.state) >= 0;

    return (
        <NativeTextTree>
            <OctaneCardView
                className="octane-navigator-doorbell min-w-0 w-[min(320px,calc(100vw-16px))] max-w-[calc(100vw-16px)] max-h-[calc(100vh-16px)]"
                theme="primary-slim"
            >
                <OctaneCardHeaderView headerText={LocalizeText(isDoorbell ? 'navigator.doorbell.title' : 'navigator.password.title')} onCloseClick={onClose} />
                <OctaneCardContentView className="octane-navigator-air__door-state">
                    <div className="flex flex-col gap-1">
                        <Text bold>{snapshot.roomInfo && snapshot.roomInfo.roomName}</Text>
                        {snapshot.state === DoorStateType.START_DOORBELL && <Text>{LocalizeText('navigator.doorbell.info')}</Text>}
                        {snapshot.state === DoorStateType.STATE_WAITING && <Text>{LocalizeText('navigator.doorbell.waiting')}</Text>}
                        {snapshot.state === DoorStateType.STATE_NO_ANSWER && <Text>{LocalizeText('navigator.doorbell.no.answer')}</Text>}
                        {snapshot.state === DoorStateType.START_PASSWORD && <Text>{LocalizeText('navigator.password.info')}</Text>}
                        {snapshot.state === DoorStateType.STATE_WRONG_PASSWORD && <Text>{LocalizeText('navigator.password.retryinfo')}</Text>}
                    </div>
                    {isDoorbell && (
                        <div className="flex flex-col gap-1">
                            {snapshot.state === DoorStateType.START_DOORBELL && (
                                <Button variant="secondary" onClick={ring}>
                                    {LocalizeText('navigator.doorbell.button.ring')}
                                </Button>
                            )}
                            <Button variant="secondary" onClick={onClose}>
                                {LocalizeText('generic.cancel')}
                            </Button>
                        </div>
                    )}
                    {!isDoorbell && (
                        <>
                            <div className="flex flex-col gap-1">
                                <Text>{LocalizeText('navigator.password.enter')}</Text>
                                <OctaneInput
                                    autoFocus
                                    type="password"
                                    value={password}
                                    onChange={(event) => setPassword(event.target.value)}
                                    onKeyDown={(event) => {
                                        if (event.key === 'Enter' && password.length) tryEntering();
                                    }}
                                />
                            </div>
                            <div className="flex flex-col gap-1">
                                <Button disabled={!password.length} variant="secondary" onClick={tryEntering}>
                                    {LocalizeText('navigator.password.button.try')}
                                </Button>
                                <Button variant="secondary" onClick={onClose}>
                                    {LocalizeText('generic.cancel')}
                                </Button>
                            </div>
                        </>
                    )}
                </OctaneCardContentView>
            </OctaneCardView>
        </NativeTextTree>
    );
};
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