5180 fichiers 38.5 Mo 0 téléchargements 466 vues mis à jour il y a 7 heures ui
nitro-v36-with-renderer-v36 / src / components / wired / views / triggers / WiredTriggerAvatarSaysSomethingView.tsx
WiredTriggerAvatarSaysSomethingView.tsx 5 Ko Télécharger le fichier
import { FC, useEffect, useState } from 'react';
import { LocalizeText, localizeWithFallback, WiredFurniType } from '../../../../api';
import { Text } from '../../../../common';
import { useWired } from '../../../../hooks';
import { OctaneInput } from '../../../../layout';
import { WiredTriggerBaseView } from './WiredTriggerBaseView';
import { Checkbox } from '../../../../common/Checkbox';
import { Radio } from '../../../../common/Radio';
import { NativeTextTree } from '../../../../common/native-text/NativeTextTree';

const MATCH_CONTAINS = 0;
const MATCH_EXACT = 1;
const MATCH_ALL = 2;

interface WiredTriggerAvatarSaysSomethingViewProps {
    /**
     * The say-your-username trigger (code 31) fires on the speaker's own name, so it has no keyword
     * and no match mode; only the hide and owner-only switches are its own.
     */
    usernameOnly?: boolean;
}

export const WiredTriggerAvatarSaysSomethingView: FC<WiredTriggerAvatarSaysSomethingViewProps> = ({ usernameOnly = false }) => {
    const [message, setMessage] = useState('');
    const [matchMode, setMatchMode] = useState(MATCH_CONTAINS);
    const [hideMessage, setHideMessage] = useState(false);
    const [ownerOnly, setOwnerOnly] = useState(false);
    const { trigger = null, setStringParam = null, setIntParams = null } = useWired();

    const save = () => {
        setStringParam(usernameOnly ? '' : message);
        // Official layout: [owner only, match mode, hide the message].
        setIntParams([ownerOnly ? 1 : 0, usernameOnly ? MATCH_CONTAINS : matchMode, hideMessage ? 1 : 0]);
    };

    useEffect(() => {
        setMessage(trigger?.stringData ?? '');
        setOwnerOnly(trigger?.intData?.[0] === 1);
        setMatchMode(trigger?.intData?.length > 1 ? trigger.intData[1] : MATCH_CONTAINS);
        setHideMessage(trigger?.intData?.[2] === 1);
    }, [trigger]);

    return (
        <NativeTextTree>
            <WiredTriggerBaseView hasSpecialInput={true} requiresFurni={WiredFurniType.STUFF_SELECTION_OPTION_NONE} save={save}>
                {usernameOnly && (
                    <Text small className="text-black/60">
                        {localizeWithFallback('wiredfurni.params.username_as_trigger.info', 'Fires when a user says their own username.')}
                    </Text>
                )}
                {!usernameOnly && (
                    <div className="flex flex-col gap-1">
                        <Text bold>{LocalizeText('wiredfurni.params.whatissaid')}</Text>
                        <OctaneInput
                            disabled={matchMode === MATCH_ALL}
                            maxLength={1000}
                            title={LocalizeText('wiredfurni.tooltip.chatinput')}
                            type="text"
                            value={message}
                            onChange={(event) => setMessage(event.target.value)}
                        />
                    </div>
                )}
                {!usernameOnly && (
                    <div className="flex flex-col gap-1">
                        <Text bold>{LocalizeText('wiredfurni.params.chattriggertype')}</Text>
                        <div className="flex items-center gap-1">
                            <Radio checked={matchMode === MATCH_CONTAINS} id="sayMatchContains" name="sayMatchMode" onCheckedChange={() => setMatchMode(MATCH_CONTAINS)} />
                            <Text>{LocalizeText('wiredfurni.params.chatcontains')}</Text>
                        </div>
                        <div className="flex items-center gap-1">
                            <Radio checked={matchMode === MATCH_EXACT} id="sayMatchExact" name="sayMatchMode" onCheckedChange={() => setMatchMode(MATCH_EXACT)} />
                            <Text>{LocalizeText('wiredfurni.params.exactmatch')}</Text>
                        </div>
                        <div className="flex items-center gap-1">
                            <Radio checked={matchMode === MATCH_ALL} id="sayMatchAll" name="sayMatchMode" onCheckedChange={() => setMatchMode(MATCH_ALL)} />
                            <Text>{LocalizeText('wiredfurni.params.allmatch')}</Text>
                        </div>
                    </div>
                )}
                <div className="flex flex-col gap-1">
                    <Text bold>{LocalizeText('wiredfurni.params.select_options')}</Text>
                    <div className="flex items-center gap-1">
                        <Checkbox checked={hideMessage} id="sayHideMessage" onCheckedChange={(nextChecked) => setHideMessage(nextChecked)} />
                        <Text>{LocalizeText('wiredfurni.params.chat.hide')}</Text>
                    </div>
                    <div className="flex items-center gap-1">
                        <Checkbox checked={ownerOnly} id="sayOwnerOnly" onCheckedChange={(nextChecked) => setOwnerOnly(nextChecked)} />
                        <Text>{LocalizeText('wiredfurni.params.chat.onlyowner')}</Text>
                    </div>
                </div>
            </WiredTriggerBaseView>
        </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