diff options
| author | Haishan <[email protected]> | 2020-10-31 18:18:04 +0800 |
|---|---|---|
| committer | Haishan <[email protected]> | 2020-11-01 17:42:52 +0800 |
| commit | ff1a39d04e53b428e34d46c55ecd6689189b5443 (patch) | |
| tree | 94a60abe3d28a1d729b877356bdd38d75ce655a5 /src/components/Rules.js | |
| parent | e62c9165481ef12ee2310dee1c32f890b3fe4b78 (diff) | |
chore: run ts-migrate
Diffstat (limited to 'src/components/Rules.js')
| -rw-r--r-- | src/components/Rules.js | 142 |
1 files changed, 0 insertions, 142 deletions
diff --git a/src/components/Rules.js b/src/components/Rules.js deleted file mode 100644 index 949e5e9..0000000 --- a/src/components/Rules.js +++ /dev/null @@ -1,142 +0,0 @@ -import React from 'react'; -import { RotateCw } from 'react-feather'; -import { queryCache, useQuery } from 'react-query'; -import { areEqual, VariableSizeList } from 'react-window'; -import { useRecoilState } from 'recoil'; -import { fetchRuleProviders } from 'src/api/rule-provider'; -import { fetchRules } from 'src/api/rules'; -import { RuleProviderItem } from 'src/components/rules/RuleProviderItem'; -import { TextFilter } from 'src/components/rules/TextFilter'; -import { ruleFilterText } from 'src/store/rules'; - -import useRemainingViewPortHeight from '../hooks/useRemainingViewPortHeight'; -import { getClashAPIConfig } from '../store/app'; -import ContentHeader from './ContentHeader'; -import Rule from './Rule'; -import s from './Rules.module.css'; -import { Fab, position as fabPosition } from './shared/Fab'; -import { connect } from './StateProvider'; - -const { memo, useMemo, useCallback } = React; - -const paddingBottom = 30; - -function itemKey(index, { rules, provider }) { - const providerQty = provider.names.length; - - if (index < providerQty) { - return provider.names[index]; - } - const item = rules[index - providerQty]; - return item.id; -} - -function getItemSizeFactory({ provider }) { - return function getItemSize(idx) { - const providerQty = provider.names.length; - if (idx < providerQty) { - // provider - return 90; - } - // rule - return 80; - }; -} - -const Row = memo(({ index, style, data }) => { - const { rules, provider, apiConfig } = data; - const providerQty = provider.names.length; - - if (index < providerQty) { - const name = provider.names[index]; - const item = provider.byName[name]; - return ( - <div style={style} className={s.RuleProviderItemWrapper}> - <RuleProviderItem apiConfig={apiConfig} {...item} /> - </div> - ); - } - - const r = rules[index - providerQty]; - return ( - <div style={style}> - <Rule {...r} /> - </div> - ); -}, areEqual); - -const mapState = (s) => ({ - apiConfig: getClashAPIConfig(s), -}); - -export default connect(mapState)(Rules); - -function useRuleAndProvider(apiConfig) { - const { data: rules } = useQuery(['/rules', apiConfig], fetchRules, { - suspense: true, - }); - const { data: provider } = useQuery( - ['/providers/rules', apiConfig], - fetchRuleProviders, - { suspense: true } - ); - - const [filterText] = useRecoilState(ruleFilterText); - if (filterText === '') { - return { rules, provider }; - } else { - const f = filterText.toLowerCase(); - return { - rules: rules.filter((r) => r.payload.toLowerCase().indexOf(f) >= 0), - provider: { - byName: provider.byName, - names: provider.names.filter((t) => t.toLowerCase().indexOf(f) >= 0), - }, - }; - } -} - -function useInvalidateQueries() { - return useCallback(() => { - queryCache.invalidateQueries('/rules'); - queryCache.invalidateQueries('/providers/rules'); - }, []); -} - -function Rules({ apiConfig }) { - const [refRulesContainer, containerHeight] = useRemainingViewPortHeight(); - const refreshIcon = useMemo(() => <RotateCw width={16} />, []); - - const { rules, provider } = useRuleAndProvider(apiConfig); - const invalidateQueries = useInvalidateQueries(); - - const getItemSize = getItemSizeFactory({ rules, provider }); - - return ( - <div> - <div className={s.header}> - <ContentHeader title="Rules" /> - <TextFilter /> - </div> - <div ref={refRulesContainer} style={{ paddingBottom }}> - <VariableSizeList - height={containerHeight - paddingBottom} - width="100%" - itemCount={rules.length + provider.names.length} - itemSize={getItemSize} - itemData={{ rules, provider, apiConfig }} - itemKey={itemKey} - > - {Row} - </VariableSizeList> - </div> - - <Fab - icon={refreshIcon} - text="Refresh" - position={fabPosition} - onClick={invalidateQueries} - /> - </div> - ); -} |
