/* eslint-disable react/display-name */ /* eslint-disable react/prop-types */ import React, { useEffect } from 'react'; import PropTypes from 'prop-types'; import { Trans, useTranslation } from 'react-i18next'; import { useDispatch, useSelector } from 'react-redux'; import ReactTable from 'react-table'; import { getAllBlockedServices } from '../../../../actions/services'; import { splitByNewLine, countClientsStatistics, sortIp, getService, } from '../../../../helpers/helpers'; import { MODAL_TYPE } from '../../../../helpers/constants'; import Card from '../../../ui/Card'; import CellWrap from '../../../ui/CellWrap'; import LogsSearchLink from '../../../ui/LogsSearchLink'; import Modal from '../Modal'; const ClientsTable = ({ clients, normalizedTopClients, isModalOpen, modalClientName, modalType, addClient, updateClient, deleteClient, toggleClientModal, processingAdding, processingDeleting, processingUpdating, getStats, supportedTags, }) => { const [t] = useTranslation(); const dispatch = useDispatch(); const services = useSelector((store) => store?.services); useEffect(() => { dispatch(getAllBlockedServices()); }, []); const handleFormAdd = (values) => { addClient(values); }; const handleFormUpdate = (values, name) => { updateClient(values, name); }; const handleSubmit = (values) => { const config = values; if (values) { if (values.blocked_services) { config.blocked_services = Object .keys(values.blocked_services) .filter((service) => values.blocked_services[service]); } if (values.upstreams && typeof values.upstreams === 'string') { config.upstreams = splitByNewLine(values.upstreams); } else { config.upstreams = []; } if (values.tags) { config.tags = values.tags.map((tag) => tag.value); } else { config.tags = []; } } if (modalType === MODAL_TYPE.EDIT_FILTERS) { handleFormUpdate(config, modalClientName); } else { handleFormAdd(config); } }; const getOptionsWithLabels = (options) => ( options.map((option) => ({ value: option, label: option, })) ); const getClient = (name, clients) => { const client = clients.find((item) => name === item.name); if (client) { const { upstreams, tags, whois_info, ...values } = client; return { upstreams: (upstreams && upstreams.join('\n')) || '', tags: (tags && getOptionsWithLabels(tags)) || [], ...values, }; } return { ids: [''], tags: [], use_global_settings: true, use_global_blocked_services: true, }; }; const handleDelete = (data) => { // eslint-disable-next-line no-alert if (window.confirm(t('client_confirm_delete', { key: data.name }))) { deleteClient(data); getStats(); } }; const columns = [ { Header: t('table_client'), accessor: 'ids', minWidth: 150, Cell: (row) => { const { value } = row; return (
{value.map((address) => (
{address}
))}
); }, sortMethod: sortIp, }, { Header: t('table_name'), accessor: 'name', minWidth: 120, Cell: CellWrap, }, { Header: t('settings'), accessor: 'use_global_settings', minWidth: 120, Cell: ({ value }) => { const title = value ? ( settings_global ) : ( settings_custom ); return (
{title}
); }, }, { Header: t('blocked_services'), accessor: 'blocked_services', minWidth: 180, Cell: (row) => { const { value, original } = row; if (original.use_global_blocked_services) { return settings_global; } if (value && services.allServices) { return (
{value.map((service) => { const serviceInfo = getService(services.allServices, service); if (serviceInfo?.icon_svg) { return (
); } return null; })}
); } return (
); }, }, { Header: t('upstreams'), accessor: 'upstreams', minWidth: 120, Cell: ({ value }) => { const title = value && value.length > 0 ? ( settings_custom ) : ( settings_global ); return (
{title}
); }, }, { Header: t('tags_title'), accessor: 'tags', minWidth: 140, Cell: (row) => { const { value } = row; if (!value || value.length < 1) { return '–'; } return (
{value.map((tag) => (
{tag}
))}
); }, }, { Header: t('requests_count'), id: 'statistics', accessor: (row) => countClientsStatistics( row.ids, normalizedTopClients.auto, ), sortMethod: (a, b) => b - a, minWidth: 120, Cell: (row) => { const content = CellWrap(row); if (!row.value) { return content; } return {content}; }, }, { Header: t('actions_table_header'), accessor: 'actions', maxWidth: 100, sortable: false, resizable: false, Cell: (row) => { const clientName = row.original.name; return (
); }, }, ]; const currentClientData = getClient(modalClientName, clients); const tagsOptions = getOptionsWithLabels(supportedTags); return ( <> ); }; ClientsTable.propTypes = { clients: PropTypes.array.isRequired, normalizedTopClients: PropTypes.object.isRequired, toggleClientModal: PropTypes.func.isRequired, deleteClient: PropTypes.func.isRequired, addClient: PropTypes.func.isRequired, updateClient: PropTypes.func.isRequired, isModalOpen: PropTypes.bool.isRequired, modalType: PropTypes.string.isRequired, modalClientName: PropTypes.string.isRequired, processingAdding: PropTypes.bool.isRequired, processingDeleting: PropTypes.bool.isRequired, processingUpdating: PropTypes.bool.isRequired, getStats: PropTypes.func.isRequired, supportedTags: PropTypes.array.isRequired, }; export default ClientsTable;