diff options
| author | Oskar Nyberg <oskar@mullvad.net> | 2022-05-03 16:31:21 +0200 |
|---|---|---|
| committer | Oskar Nyberg <oskar@mullvad.net> | 2022-05-19 10:04:19 +0200 |
| commit | 6280b651cbc4e80c1ee3392273aa5c3d4d090f60 (patch) | |
| tree | d4c83ce3c089d38aa47f6e050c813adeb2504032 /gui/src | |
| parent | 22efd7779d228c904077bfafb98fc575a5c63438 (diff) | |
| download | mullvadvpn-6280b651cbc4e80c1ee3392273aa5c3d4d090f60.tar.xz mullvadvpn-6280b651cbc4e80c1ee3392273aa5c3d4d090f60.zip | |
Add filter by ownership to GUI
Diffstat (limited to 'gui/src')
| -rw-r--r-- | gui/src/renderer/components/Filter.tsx | 68 |
1 files changed, 62 insertions, 6 deletions
diff --git a/gui/src/renderer/components/Filter.tsx b/gui/src/renderer/components/Filter.tsx index 8a5f763a7c..a7b8272831 100644 --- a/gui/src/renderer/components/Filter.tsx +++ b/gui/src/renderer/components/Filter.tsx @@ -1,7 +1,8 @@ -import { useCallback, useState } from 'react'; +import { useCallback, useMemo, useState } from 'react'; import styled from 'styled-components'; import { colors } from '../../config.json'; +import { Ownership } from '../../shared/daemon-rpc-types'; import { messages } from '../../shared/gettext'; import { useAppContext } from '../context'; import { useHistory } from '../lib/history'; @@ -9,7 +10,9 @@ import { useBoolean } from '../lib/utilityHooks'; import { IReduxState, useSelector } from '../redux/store'; import Accordion from './Accordion'; import * as AppButton from './AppButton'; +import { AriaInputGroup, AriaLabel } from './AriaGroup'; import * as Cell from './cell'; +import Selector from './cell/Selector'; import { normalText } from './common-styles'; import ImageView from './ImageView'; import { BackAction } from './KeyboardNavigation'; @@ -44,6 +47,13 @@ export default function Filter() { const initialProviders = useSelector(providersSelector); const [providers, setProviders] = useState<Record<string, boolean>>(initialProviders); + const initialOwnership = useSelector((state) => + 'normal' in state.settings.relaySettings + ? state.settings.relaySettings.normal.ownership + : Ownership.any, + ); + const [ownership, setOwnership] = useState<Ownership>(initialOwnership); + const onApply = useCallback(async () => { // If all providers are selected it's represented as an empty array. const selectedProviders = Object.values(providers).every((provider) => provider) @@ -51,10 +61,10 @@ export default function Filter() { : Object.entries(providers) .filter(([, selected]) => selected) .map(([name]) => name); - await updateRelaySettings({ normal: { providers: selectedProviders } }); + await updateRelaySettings({ normal: { providers: selectedProviders, ownership } }); history.pop(); - }, [providers, history, updateRelaySettings]); + }, [providers, ownership, history, updateRelaySettings]); return ( <BackAction action={history.pop}> @@ -72,8 +82,8 @@ export default function Filter() { </NavigationItems> </NavigationBar> <StyledNavigationScrollbars> + <FilterByOwnership ownership={ownership} setOwnership={setOwnership} /> <FilterByProvider providers={providers} setProviders={setProviders} /> - <FilterByOwnership /> </StyledNavigationScrollbars> <StyledFooter> <AppButton.GreenButton @@ -110,8 +120,54 @@ function providersSelector(state: IReduxState): Record<string, boolean> { ); } -function FilterByOwnership() { - return null; +const StyledSelector = (styled(Selector)({ + marginBottom: 0, +}) as unknown) as new <T>() => Selector<T>; + +interface IFilterByOwnershipProps { + ownership: Ownership; + setOwnership: (ownership: Ownership) => void; +} + +function FilterByOwnership(props: IFilterByOwnershipProps) { + const [expanded, , , toggleExpanded] = useBoolean(false); + + const values = useMemo( + () => [ + { + label: messages.gettext('Any'), + value: Ownership.any, + }, + { + label: messages.pgettext('filter-view', 'Mullvad owned only'), + value: Ownership.mullvadOwned, + }, + { + label: messages.pgettext('filter-view', 'Rented only'), + value: Ownership.rented, + }, + ], + [], + ); + + return ( + <AriaInputGroup> + <Cell.CellButton onClick={toggleExpanded}> + <AriaLabel> + <Cell.Label>{messages.pgettext('filter-view', 'Ownership')}</Cell.Label> + </AriaLabel> + <ImageView + tintColor={colors.white80} + source={expanded ? 'icon-chevron-up' : 'icon-chevron-down'} + height={24} + /> + </Cell.CellButton> + + <Accordion expanded={expanded}> + <StyledSelector values={values} value={props.ownership} onSelect={props.setOwnership} /> + </Accordion> + </AriaInputGroup> + ); } interface IFilterByProviderProps { |
