File "TwoFaEnabledDropDown.js"

Full Path: /home/bytebmoc/tideswithin.com/utils/TwoFA/TwoFaEnabledDropDown.js
File size: 4.76 KB
MIME-type: text/x-java
Charset: utf-8

import {useRef, useEffect, useState} from '@wordpress/element';
import Select from 'react-select';
import useFields from "../FieldsData";
import useRolesData from './RolesStore';
import hoverTooltip from "../../utils/hoverTooltip";
import {__} from "@wordpress/i18n";

/**
 * TwoFaEnabledDropDown component represents a dropdown select for excluding roles
 * from two-factor authentication email.
 */
const TwoFaEnabledDropDown = (props) => {
    const {fetchRoles, roles, rolesLoaded} = useRolesData();
    const [selectedRoles, setSelectedRoles] = useState([]);
    const [otherRoles, setOtherRoles] = useState([]);
    const { updateField, getFieldValue, setChangedField, getField, fieldsLoaded, saveFields } = useFields();
    const selectRef = useRef(null);

    const loginProtectionEnabled = getFieldValue('login_protection_enabled');

    let disabledSelectPropBoolean = (props.disabled === true);
    let disabledSelectViaFieldConfig = (props.field.disabled === true);

    let selectDisabled = (
        disabledSelectViaFieldConfig
        || disabledSelectPropBoolean
    );

    let tooltipText = '';
    let emptyValues = [undefined, null, ''];

    if (selectDisabled
        && props.field.hasOwnProperty('disabledTooltipText')
        && !emptyValues.includes(props.field.disabledTooltipHoverText)
    ) {
        tooltipText = props.field.disabledTooltipHoverText;
    }

    hoverTooltip(
        selectRef,
        (selectDisabled && (tooltipText !== '')),
        tooltipText
    );

    useEffect(() => {
        if (getFieldValue('login_protection_enabled') === 1 && props.field.id === 'two_fa_enabled_roles_totp') {
            setChangedField(props.field.id, props.field.value);
            saveFields(true, false);
        }
    }, [loginProtectionEnabled]);

    useEffect(() => {
        if (!rolesLoaded) {
            fetchRoles(props.field.id);
        }
    }, [rolesLoaded]);

    useEffect(() => {
        if (props.field.id) {
            let otherField = getField(props.field.id);
            let roles = Array.isArray(otherField.value) ? otherField.value : [];
            setOtherRoles(roles);
        }
    }, [selectedRoles, getField(props.field.id)]);

    useEffect(() => {
        if (props.field.id) {
            let otherField = getField(props.field.id);
            let roles = Array.isArray(otherField.value) ? otherField.value : [];
            setSelectedRoles(roles.map((role) => ({ value: role, label: role.charAt(0).toUpperCase() + role.slice(1) })));
        }

        if (!props.field.value) {
            setChangedField(props.field.id, props.field.default);
            updateField(props.field.id, props.field.default);
            setSelectedRoles(props.field.default.map((role) => ({ value: role, label: role.charAt(0).toUpperCase() + role.slice(1) })));
        }
    }, [fieldsLoaded]);

    const handleChange = (selectedOptions) => {
        const rolesExcluded = selectedOptions.map(option => option.value);
        setSelectedRoles(selectedOptions);
        updateField(props.field.id, rolesExcluded);
        setChangedField(props.field.id, rolesExcluded);
    };

    const customStyles = {
        multiValue: (provided) => ({
            ...provided,
            borderRadius: '10px',
            backgroundColor: '#F5CD54',
        }),
        multiValueRemove: (base, state) => ({
            ...base,
            color: state.isHovered ? 'initial' : base.color,
            opacity: '0.7',
            ':hover': {
                backgroundColor: 'initial',
                color: 'initial',
                opacity: '1',
            },
        }),
        menuPortal: (base) => ({
            ...base,
            zIndex: 30,
        }),
    };

    const alreadySelected = selectedRoles.map(option => option.value);
    let filteredRoles = [];
    let inRolesInUse = [...alreadySelected, ...otherRoles];

    roles.forEach((item) => {
        if (!inRolesInUse.includes(item.value)) {
            filteredRoles.push(item);
        }
    });

    return (
        <div style={{marginTop: '5px'}} ref={selectRef}>
            <Select
                isMulti
                options={filteredRoles}
                onChange={handleChange}
                value={selectedRoles}
                menuPosition={"fixed"}
                styles={customStyles}
                isDisabled={selectDisabled}
            />
            {! loginProtectionEnabled &&
                <div className="rsssl-locked">
                    <div className="rsssl-locked-overlay"><span
                        className="rsssl-task-status rsssl-open">{__('Disabled', 'really-simple-ssl')}</span><span>{__('Activate Two-Factor Authentication to enable this block.', 'really-simple-ssl')}</span>
                    </div>
                </div>
            }
        </div>
    );
};

export default TwoFaEnabledDropDown;