5180 fichiers 38.5 Mo 0 téléchargements 388 vues mis à jour il y a 7 heures ui
nitro-v36-with-renderer-v36 / src / components / room / widgets / room-filter-words / RoomFilterWordsWidgetView.tsx
RoomFilterWordsWidgetView.tsx 4.7 Ko Télécharger le fichier
import { UpdateRoomFilterMessageComposer } from '@octane/renderer';
import { FC, useState } from 'react';
import { LocalizeText, SendMessageComposer } from '../../../../api';
import { Button, Column, Flex, Grid, OctaneCardContentView, OctaneCardHeaderView, OctaneCardView, Text } from '../../../../common';
import { useFilterWordsWidget, useNavigatorData } from '../../../../hooks';
import { classNames, OctaneInput } from '../../../../layout';
import { BaseButton } from '../../../../common/BaseButton';
import '../../../../css/room/RoomWidgetsSweepAir.css';
import { NativeTextTree } from '../../../../common/native-text/NativeTextTree';

/** The longest word the server keeps (RoomWordFilterModifyEvent cuts anything longer). */
export const MAX_WORD_LENGTH = 25;

export const RoomFilterWordsWidgetView: FC<{}> = (props) => {
    const [word, setWord] = useState<string>('bobba');
    const [selectedWord, setSelectedWord] = useState<string>('');
    const [isSelectingWord, setIsSelectingWord] = useState<boolean>(false);
    const { wordsFilter = [], isVisible = null, setWordsFilter, onClose = null } = useFilterWordsWidget();
    const { navigatorData } = useNavigatorData();

    const processAction = (isAddingWord: boolean) => {
        if (isSelectingWord ? !selectedWord : !word) return;

        SendMessageComposer(new UpdateRoomFilterMessageComposer(navigatorData.enteredGuestRoom.roomId, isAddingWord, isSelectingWord ? selectedWord : word));
        setSelectedWord('');
        setWord('bobba');
        setIsSelectingWord(false);

        if (isAddingWord && wordsFilter.includes(isSelectingWord ? selectedWord : word)) return;

        setWordsFilter((prevValue) => {
            const newWords = [...prevValue];

            isAddingWord ? newWords.push(isSelectingWord ? selectedWord : word) : newWords.splice(newWords.indexOf(isSelectingWord ? selectedWord : word), 1);

            return newWords;
        });
    };

    const onTyping = (word: string) => {
        setWord(word);
        setIsSelectingWord(false);
    };

    const onSelectedWord = (word: string) => {
        setSelectedWord(word);
        setIsSelectingWord(true);
    };

    if (!isVisible) return null;

    return (
        <NativeTextTree>
            <OctaneCardView
                isResizable={false}
                className="octane-room-filter-words min-w-0 w-[min(340px,calc(100vw-16px))] max-w-[calc(100vw-16px)] max-h-[calc(100vh-16px)]"
                theme="primary-slim"
            >
                <OctaneCardHeaderView headerText={LocalizeText('navigator.roomsettings.roomfilter')} onCloseClick={() => onClose()} />
                <OctaneCardContentView className="text-black">
                    <Grid className="flex items-center gap-2 justify-end">
                        <OctaneInput maxLength={MAX_WORD_LENGTH} type="text" value={word} onChange={(event) => onTyping(event.target.value)} />
                        <Button variant="secondary" onClick={() => processAction(true)}>{LocalizeText('navigator.roomsettings.roomfilter.addword')}</Button>
                    </Grid>
                    <Column
                        className="min-h-[calc(1.5em+ .5rem+2px)] px-[.5rem] py-[.25rem] rounded-[.2rem] form-control-sm"
                        gap={0}
                        overflow="auto"
                        style={{ height: '100px' }}
                    >
                        {wordsFilter &&
                            wordsFilter.length > 0 &&
                            wordsFilter.map((word, index) => {
                                return (
                                    <Flex component={BaseButton} type="button"
                                        key={index}
                                        pointer
                                        alignItems="center"
                                        className={classNames('rounded p-1', selectedWord === word && 'bg-muted')}
                                        onClick={(event) => onSelectedWord(word)}
                                    >
                                        <Text truncate>{word}</Text>
                                    </Flex>
                                );
                            })}
                    </Column>
                    <Grid className="flex items-center gap-2 justify-end">
                        <Button disabled={wordsFilter.length === 0 || !isSelectingWord} variant="secondary" onClick={() => processAction(false)}>
                            {LocalizeText('navigator.roomsettings.roomfilter.removeword')}
                        </Button>
                    </Grid>
                </OctaneCardContentView>
            </OctaneCardView>
        </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