import React, { useEffect } from 'react'; import { HashLink as Link } from 'react-router-hash-link'; import { Trans, useTranslation } from 'react-i18next'; import classNames from 'classnames'; import Statistics from './Statistics'; import Counters from './Counters'; import Clients from './Clients'; import QueriedDomains from './QueriedDomains'; import BlockedDomains from './BlockedDomains'; import { DISABLE_PROTECTION_TIMINGS, ONE_SECOND_IN_MS, SETTINGS_URLS, TIME_UNITS } from '../../helpers/constants'; import { msToSeconds, msToMinutes, msToHours, msToDays } from '../../helpers/helpers'; import PageTitle from '../ui/PageTitle'; import Loading from '../ui/Loading'; import './Dashboard.css'; import Dropdown from '../ui/Dropdown'; import UpstreamResponses from './UpstreamResponses'; import UpstreamAvgTime from './UpstreamAvgTime'; import { AccessData, DashboardData, StatsData } from '../../initialState'; interface DashboardProps { dashboard: DashboardData; stats: StatsData; access: AccessData; getStats: (...args: unknown[]) => unknown; getStatsConfig: (...args: unknown[]) => unknown; toggleProtection: (...args: unknown[]) => unknown; getClients: (...args: unknown[]) => unknown; getAccessList: () => (dispatch: any) => void; } const Dashboard = ({ getAccessList, getStats, getStatsConfig, dashboard: { protectionEnabled, processingProtection, protectionDisabledDuration }, toggleProtection, stats, access, }: DashboardProps) => { const { t } = useTranslation(); const getAllStats = () => { getAccessList(); getStats(); getStatsConfig(); }; useEffect(() => { getAllStats(); }, []); const getSubtitle = () => { if (!stats.enabled) { return t('stats_disabled_short'); } const msIn7Days = 604800000; if (stats.timeUnits === TIME_UNITS.HOURS && stats.interval === msIn7Days) { return t('for_last_days', { count: msToDays(stats.interval) }); } return stats.timeUnits === TIME_UNITS.HOURS ? t('for_last_hours', { count: msToHours(stats.interval) }) : t('for_last_days', { count: msToDays(stats.interval) }); }; const buttonClass = classNames('btn btn-sm dashboard-protection-button', { 'btn-gray': protectionEnabled, 'btn-success': !protectionEnabled, }); const refreshButton = ( ); const statsProcessing = stats.processingStats || stats.processingGetConfig || access.processing; const subtitle = getSubtitle(); const DISABLE_PROTECTION_ITEMS = [ { text: t('disable_for_seconds', { count: msToSeconds(DISABLE_PROTECTION_TIMINGS.HALF_MINUTE) }), disableTime: DISABLE_PROTECTION_TIMINGS.HALF_MINUTE, }, { text: t('disable_for_minutes', { count: msToMinutes(DISABLE_PROTECTION_TIMINGS.MINUTE) }), disableTime: DISABLE_PROTECTION_TIMINGS.MINUTE, }, { text: t('disable_for_minutes', { count: msToMinutes(DISABLE_PROTECTION_TIMINGS.TEN_MINUTES) }), disableTime: DISABLE_PROTECTION_TIMINGS.TEN_MINUTES, }, { text: t('disable_for_hours', { count: msToHours(DISABLE_PROTECTION_TIMINGS.HOUR) }), disableTime: DISABLE_PROTECTION_TIMINGS.HOUR, }, { text: t('disable_until_tomorrow'), disableTime: DISABLE_PROTECTION_TIMINGS.TOMORROW, }, ]; const getDisableProtectionItems = () => Object.values(DISABLE_PROTECTION_ITEMS).map((item: any, index: any) => (