From 8e48c01e7aada6978e92a6da1d040f3ef0d37945 Mon Sep 17 00:00:00 2001 From: Haishan Date: Fri, 20 Mar 2020 22:19:56 +0800 Subject: feat: remembers group collapse state for https://github.com/haishanh/yacd/issues/480 --- src/components/ProxyProvider.js | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) (limited to 'src/components/ProxyProvider.js') diff --git a/src/components/ProxyProvider.js b/src/components/ProxyProvider.js index 32071ab..9486128 100644 --- a/src/components/ProxyProvider.js +++ b/src/components/ProxyProvider.js @@ -3,7 +3,7 @@ import { RotateCw, Zap } from 'react-feather'; import { formatDistance } from 'date-fns'; import { motion } from 'framer-motion'; -import { connect } from './StateProvider'; +import { connect, useStoreActions } from './StateProvider'; import Collapsible from './Collapsible'; import CollapsibleSectionHeader from './CollapsibleSectionHeader'; import { @@ -13,7 +13,7 @@ import { } from './ProxyGroup'; import Button from './Button'; -import { getClashAPIConfig } from '../store/app'; +import { getClashAPIConfig, getCollapsibleIsOpen } from '../store/app'; import { getDelay, getRtFilterSwitch, @@ -31,7 +31,8 @@ type Props = { type: 'Proxy' | 'Rule', vehicleType: 'HTTP' | 'File' | 'Compatible', updatedAt?: string, - dispatch: any => void + dispatch: any => void, + isOpen: boolean }; function ProxyProvider({ @@ -39,6 +40,7 @@ function ProxyProvider({ proxies, vehicleType, updatedAt, + isOpen, dispatch, apiConfig }: Props) { @@ -53,8 +55,17 @@ function ProxyProvider({ setIsHealthcheckLoading(false); }, [apiConfig, dispatch, name, setIsHealthcheckLoading]); - const [isCollapsibleOpen, setCollapsibleOpen] = useState(false); - const toggle = useCallback(() => setCollapsibleOpen(x => !x), []); + const { + app: { updateCollapsibleIsOpen } + } = useStoreActions(); + + // const [isCollapsibleOpen, setCollapsibleOpen] = useState(false); + // const toggle = useCallback(() => setCollapsibleOpen(x => !x), []); + + const toggle = useCallback(() => { + updateCollapsibleIsOpen('proxyProvider', name, !isOpen); + }, [isOpen, updateCollapsibleIsOpen, name]); + const timeAgo = formatDistance(new Date(updatedAt), new Date()); return (
@@ -62,13 +73,13 @@ function ProxyProvider({ name={name} toggle={toggle} type={vehicleType} - isOpen={isCollapsibleOpen} + isOpen={isOpen} qty={proxies.length} />
Updated {timeAgo} ago
- +
- +
@@ -112,13 +123,15 @@ function Refresh() { ); } -const mapState = (s, { proxies }) => { +const mapState = (s, { proxies, name }) => { const filterByRt = getRtFilterSwitch(s); const delay = getDelay(s); + const collapsibleIsOpen = getCollapsibleIsOpen(s); const apiConfig = getClashAPIConfig(s); return { apiConfig, - proxies: filterAvailableProxiesAndSort(proxies, delay, filterByRt) + proxies: filterAvailableProxiesAndSort(proxies, delay, filterByRt), + isOpen: collapsibleIsOpen[`proxyProvider:${name}`] }; }; -- cgit v1.3.1