import cx from 'clsx'; import React from 'react'; import { useTranslation } from 'react-i18next'; import { List as VirtualList, RowComponentProps } from 'react-window'; import ContentHeader from '~/components/ContentHeader'; import { RuleProviderItem } from '~/components/rules/RuleProviderItem'; import { RulesPageFab } from '~/components/rules/RulesPageFab'; import { TextFilter } from '~/components/shared/TextFitler'; import { useRulesPage } from '~/modules/rules/hooks'; import { formatQty, getItemSizeFactory, RulesListItemData } from '~/modules/rules/utils'; import { ruleFilterText } from '~/store/rules'; import { ClashAPIConfig } from '~/types'; import useRemainingViewPortHeight from '../hooks/useRemainingViewPortHeight'; import Rule from './Rule'; import s from './Rules.module.scss'; type RulesRowProps = { data: RulesListItemData; }; function Row({ index, style, data }: RowComponentProps) { const { rules, provider, apiConfig } = data; if (!rules) { const name = provider.names[index]; const item = provider.byName[name]; return (
); } const r = rules[index]; return (
); } type RulesProps = { apiConfig: ClashAPIConfig; }; export default function Rules({ apiConfig }: RulesProps) { const [refRulesContainer, containerHeight] = useRemainingViewPortHeight(); const { rules, provider, activeTab, setActiveTab, isRulesTab, handleTabKeyDown } = useRulesPage(apiConfig); const getItemSize = getItemSizeFactory({ isRulesTab }); const { t } = useTranslation(); return (
setActiveTab('rules')} onKeyDown={handleTabKeyDown('rules')} role="button" tabIndex={0} > {t('Rules')} {formatQty(rules.length)}
{provider.names.length > 0 && (
setActiveTab('providers')} onKeyDown={handleTabKeyDown('providers')} role="button" tabIndex={0} > {t('rule_provider')} {formatQty(provider.names.length)}
)}
{provider && provider.names && provider.names.length > 0 ? ( ) : null}
); }