diff options
| author | Larvan2 <[email protected]> | 2026-03-15 15:01:57 +0800 |
|---|---|---|
| committer | Larvan2 <[email protected]> | 2026-03-15 15:01:57 +0800 |
| commit | 0e420859f5f7011ba124c965d8319bf3bf4c5fe3 (patch) | |
| tree | 2fc344b757e119ebae6e0b6243121fddba61603c /src/components/rules | |
| parent | 17c4d2855ffb6914fcbece27367bafdd27a4c182 (diff) | |
refactor: reorganize code
Diffstat (limited to 'src/components/rules')
| -rw-r--r-- | src/components/rules/RuleProviderItem.tsx | 2 | ||||
| -rw-r--r-- | src/components/rules/RulesPageFab.tsx | 2 | ||||
| -rw-r--r-- | src/components/rules/rules.hooks.tsx | 85 |
3 files changed, 3 insertions, 86 deletions
diff --git a/src/components/rules/RuleProviderItem.tsx b/src/components/rules/RuleProviderItem.tsx index 0f654dd..7077ed1 100644 --- a/src/components/rules/RuleProviderItem.tsx +++ b/src/components/rules/RuleProviderItem.tsx @@ -3,7 +3,7 @@ import * as React from 'react'; import { Activity, Database, RefreshCw } from 'react-feather'; import Button from '~/components/Button'; -import { useUpdateRuleProviderItem } from '~/components/rules/rules.hooks'; +import { useUpdateRuleProviderItem } from '~/modules/rules/hooks'; import s from './RuleProviderItem.module.scss'; diff --git a/src/components/rules/RulesPageFab.tsx b/src/components/rules/RulesPageFab.tsx index 91b618f..f9dee23 100644 --- a/src/components/rules/RulesPageFab.tsx +++ b/src/components/rules/RulesPageFab.tsx @@ -1,9 +1,9 @@ import * as React from 'react'; import { useTranslation } from 'react-i18next'; -import { useUpdateAllRuleProviderItems } from '~/components/rules/rules.hooks'; import { Fab, position as fabPosition } from '~/components/shared/Fab'; import { RotateIcon } from '~/components/shared/RotateIcon'; +import { useUpdateAllRuleProviderItems } from '~/modules/rules/hooks'; import { ClashAPIConfig } from '~/types'; type RulesPageFabProps = { diff --git a/src/components/rules/rules.hooks.tsx b/src/components/rules/rules.hooks.tsx index bc6aeeb..6fb09cd 100644 --- a/src/components/rules/rules.hooks.tsx +++ b/src/components/rules/rules.hooks.tsx @@ -1,84 +1 @@ -import * as React from 'react'; -import { useMutation, useQuery, useQueryClient } from 'react-query'; -import { useRecoilState } from 'recoil'; - -import { - fetchRuleProviders, - refreshRuleProviderByName, - updateRuleProviders, -} from '~/api/rule-provider'; -import { fetchRules } from '~/api/rules'; -import { ruleFilterText } from '~/store/rules'; -import type { ClashAPIConfig } from '~/types'; - -const { useCallback } = React; - -export function useUpdateRuleProviderItem( - name: string, - apiConfig: ClashAPIConfig -): [(ev: React.MouseEvent<HTMLButtonElement>) => unknown, boolean] { - const queryClient = useQueryClient(); - const { mutate, isLoading } = useMutation(refreshRuleProviderByName, { - onSuccess: () => { - queryClient.invalidateQueries('/providers/rules'); - }, - }); - const onClickRefreshButton = (ev: React.MouseEvent<HTMLButtonElement>) => { - ev.preventDefault(); - mutate({ name, apiConfig }); - }; - return [onClickRefreshButton, isLoading]; -} - -export function useUpdateAllRuleProviderItems( - apiConfig: ClashAPIConfig -): [(ev: React.MouseEvent<HTMLButtonElement>) => unknown, boolean] { - const queryClient = useQueryClient(); - const { data: provider } = useRuleProviderQuery(apiConfig); - const { mutate, isLoading } = useMutation(updateRuleProviders, { - onSuccess: () => { - queryClient.invalidateQueries('/providers/rules'); - }, - }); - const onClickRefreshButton = (ev: React.MouseEvent<HTMLButtonElement>) => { - ev.preventDefault(); - mutate({ names: provider.names, apiConfig }); - }; - return [onClickRefreshButton, isLoading]; -} - -export function useInvalidateQueries() { - const queryClient = useQueryClient(); - return useCallback(() => { - queryClient.invalidateQueries('/rules'); - queryClient.invalidateQueries('/providers/rules'); - }, [queryClient]); -} - -export function useRuleProviderQuery(apiConfig: ClashAPIConfig) { - return useQuery(['/providers/rules', apiConfig], () => - fetchRuleProviders('/providers/rules', apiConfig) - ); -} - -export function useRuleAndProvider(apiConfig: ClashAPIConfig) { - const { data: rules, isFetching } = useQuery(['/rules', apiConfig], () => - fetchRules('/rules', apiConfig) - ); - const { data: provider } = useRuleProviderQuery(apiConfig); - - const [filterText] = useRecoilState(ruleFilterText); - if (filterText === '') { - return { rules, provider, isFetching }; - } else { - const f = filterText.toLowerCase(); - return { - rules: rules.filter((r) => r.payload.toLowerCase().indexOf(f) >= 0), - isFetching, - provider: { - byName: provider.byName, - names: provider.names.filter((t) => t.toLowerCase().indexOf(f) >= 0), - }, - }; - } -} +export * from '~/modules/rules/hooks'; |
