5180 fichiers 38.5 Mo 0 téléchargements 417 vues mis à jour il y a 7 heures ui
nitro-v36-with-renderer-v36 / src / components / navigator / views / room-settings / NavigatorRoomSettingsModTabView.tsx
NavigatorRoomSettingsModTabView.tsx 8.2 Ko Télécharger le fichier
import {
    BannedUserData,
    BannedUsersFromRoomEvent,
    RoomBannedUsersComposer,
    RoomModerationSettings,
    RoomUnbanUserComposer,
    UserUnbannedFromRoomEvent
} from '@octane/renderer';
import { FC, useEffect, useState } from 'react';
import { IRoomData, LocalizeText, SendMessageComposer } from '../../../../api';
import { BaseButton, Button, Column, Flex, Grid, Text, UserProfileIconView } from '../../../../common';
import { useMessageEvent } from '../../../../hooks';
import { NavigatorRoomSettingsSectionView } from './NavigatorRoomSettingsSectionView';
import { Select } from '../../../../common/Select';
import { NativeTextTree } from '../../../../common/native-text/NativeTextTree';

interface NavigatorRoomSettingsTabViewProps {
    roomData: IRoomData;
    handleChange: (field: string, value: string | number | boolean) => void;
}

export const NavigatorRoomSettingsModTabView: FC<NavigatorRoomSettingsTabViewProps> = (props) => {
    const { roomData = null, handleChange = null } = props;
    const [selectedUserId, setSelectedUserId] = useState<number>(-1);
    const [bannedUsers, setBannedUsers] = useState<BannedUserData[]>([]);

    const unBanUser = (userId: number) => {
        setBannedUsers((prevValue) => {
            const newValue = [...prevValue];

            const index = newValue.findIndex((value) => value.userId === userId);

            if (index >= 0) newValue.splice(index, 1);

            return newValue;
        });

        SendMessageComposer(new RoomUnbanUserComposer(userId, roomData.roomId));

        setSelectedUserId(-1);
    };

    useMessageEvent<BannedUsersFromRoomEvent>(BannedUsersFromRoomEvent, (event) => {
        const parser = event.getParser();

        if (!roomData || roomData.roomId !== parser.roomId) return;

        setBannedUsers(parser.bannedUsers);
    });

    // AIR's RoomSettingsCtrl drops an unbanned user from the list as the server confirms it,
    // including an unban made by someone else with rights while the window is open.
    useMessageEvent<UserUnbannedFromRoomEvent>(UserUnbannedFromRoomEvent, (event) => {
        const parser = event.getParser();

        if (!parser || !roomData || roomData.roomId !== parser.roomId) return;

        setBannedUsers((prevValue) => prevValue.filter((user) => user.userId !== parser.userId));
        setSelectedUserId((prevValue) => (prevValue === parser.userId ? -1 : prevValue));
    });

    useEffect(() => {
        SendMessageComposer(new RoomBannedUsersComposer(roomData.roomId));
    }, [roomData.roomId]);

    return (
        <NativeTextTree>
            <Grid>
                <Column size={6}>
                    <NavigatorRoomSettingsSectionView
                        title={`${LocalizeText('navigator.roomsettings.moderation.banned.users')} (${bannedUsers.length})`}
                        gap={1}
                        className="h-full"
                    >
                        <Flex overflow="hidden" className="octane-card-panel list-container p-2">
                            <Column fullWidth overflow="auto" gap={1}>
                                {bannedUsers &&
                                    bannedUsers.length > 0 &&
                                    bannedUsers.map((user, index) => {
                                        return (
                                            <Flex key={index} shrink alignItems="center" gap={1} overflow="hidden">
                                                <UserProfileIconView userId={user.userId} />
                                                <Text
                                                    pointer
                                                    grow
                                                    className="border-0 bg-transparent p-0 text-left"
                                                    component={BaseButton}
                                                    onClick={(event) => setSelectedUserId(user.userId)}
                                                >
                                                    {' '}
                                                    {user.userName}
                                                </Text>
                                            </Flex>
                                        );
                                    })}
                            </Column>
                        </Flex>
                        <Button disabled={selectedUserId <= 0} variant="secondary" onClick={(event) => unBanUser(selectedUserId)}>
                            {LocalizeText('navigator.roomsettings.moderation.unban')}{' '}
                            {selectedUserId > 0 && bannedUsers.find((user) => user.userId === selectedUserId)?.userName}
                        </Button>
                    </NavigatorRoomSettingsSectionView>
                </Column>
                <Column size={6}>
                    <NavigatorRoomSettingsSectionView title={LocalizeText('navigator.roomsettings.moderation')} gap={2} className="h-full">
                        <Column gap={1}>
                            <Text bold small>
                                {LocalizeText('navigator.roomsettings.moderation.mute.header')}
                            </Text>
                            <Select
                                className="form-select form-select-sm"
                                value={roomData.moderationSettings.allowMute}
                                onChange={(event) => handleChange('moderation_mute', event.target.value)}
                            >
                                <option value={RoomModerationSettings.MODERATION_LEVEL_NONE}>{LocalizeText('navigator.roomsettings.moderation.none')}</option>
                                <option value={RoomModerationSettings.MODERATION_LEVEL_USER_WITH_RIGHTS}>
                                    {LocalizeText('navigator.roomsettings.moderation.rights')}
                                </option>
                            </Select>
                        </Column>
                        <Column gap={1}>
                            <Text bold small>
                                {LocalizeText('navigator.roomsettings.moderation.kick.header')}
                            </Text>
                            <Select
                                className="form-select form-select-sm"
                                value={roomData.moderationSettings.allowKick}
                                onChange={(event) => handleChange('moderation_kick', event.target.value)}
                            >
                                <option value={RoomModerationSettings.MODERATION_LEVEL_NONE}>{LocalizeText('navigator.roomsettings.moderation.none')}</option>
                                <option value={RoomModerationSettings.MODERATION_LEVEL_USER_WITH_RIGHTS}>
                                    {LocalizeText('navigator.roomsettings.moderation.rights')}
                                </option>
                                <option value={RoomModerationSettings.MODERATION_LEVEL_ALL}>{LocalizeText('navigator.roomsettings.moderation.all')}</option>
                            </Select>
                        </Column>
                        <Column gap={1}>
                            <Text bold small>
                                {LocalizeText('navigator.roomsettings.moderation.ban.header')}
                            </Text>
                            <Select
                                className="form-select form-select-sm"
                                value={roomData.moderationSettings.allowBan}
                                onChange={(event) => handleChange('moderation_ban', event.target.value)}
                            >
                                <option value={RoomModerationSettings.MODERATION_LEVEL_NONE}>{LocalizeText('navigator.roomsettings.moderation.none')}</option>
                                <option value={RoomModerationSettings.MODERATION_LEVEL_USER_WITH_RIGHTS}>
                                    {LocalizeText('navigator.roomsettings.moderation.rights')}
                                </option>
                            </Select>
                        </Column>
                    </NavigatorRoomSettingsSectionView>
                </Column>
            </Grid>
        </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