From bdc013b4c8c5db47d7f1d01c96d194f78f84740d Mon Sep 17 00:00:00 2001 From: tresabhi <43380238+tresabhi@users.noreply.github.com> Date: Wed, 16 Apr 2025 23:34:30 -0500 Subject: [PATCH] fix: cleaner clear button --- packages/i18n/strings/en.json | 2 +- .../TankSearch/components/FilterControl.tsx | 881 +++++++++--------- 2 files changed, 450 insertions(+), 433 deletions(-) diff --git a/packages/i18n/strings/en.json b/packages/i18n/strings/en.json index 980ebccb0..849f2daa9 100644 --- a/packages/i18n/strings/en.json +++ b/packages/i18n/strings/en.json @@ -756,7 +756,7 @@ }, "tank_search": { - "clear_filters": "Clear", + "clear_filters": "Clear filters", "search_bar_hint": "Search tanks...", "recent": "Recently viewed", "select_all": "Select all", diff --git a/packages/website/src/components/TankSearch/components/FilterControl.tsx b/packages/website/src/components/TankSearch/components/FilterControl.tsx index b8f4da472..189c3893f 100644 --- a/packages/website/src/components/TankSearch/components/FilterControl.tsx +++ b/packages/website/src/components/TankSearch/components/FilterControl.tsx @@ -6,17 +6,16 @@ import { TIER_ROMAN_NUMERALS, } from '@blitzkit/core'; import { useStore } from '@nanostores/react'; -import { ReloadIcon } from '@radix-ui/react-icons'; import { Box, - Button, Flex, IconButton, Inset, + Link, Popover, Text, } from '@radix-ui/themes'; -import { times } from 'lodash-es'; +import { isEqual, times } from 'lodash-es'; import { awaitableGameDefinitions } from '../../../core/awaitables/gameDefinitions'; import { Var } from '../../../core/radix/var'; import { useLocale } from '../../../hooks/useLocale'; @@ -121,493 +120,511 @@ function ShellFilter({ index, premium }: { index: number; premium?: boolean }) { export function FilterControl({ compact }: FilterControlProps) { const tankFilters = useStore($tankFilters); const { strings } = useLocale(); + const clearable = !isEqual(tankFilters, initialTankFilters); return ( - + - - {times(5, (index) => { - const tier = index + 1; - const selected = tankFilters.tiers?.includes(tier); - - return ( - { - if (tankFilters.tiers.includes(tier)) { - $tankFilters.setKey( - 'tiers', - tankFilters.tiers.filter((t) => t !== tier), - ); - } else { - $tankFilters.setKey('tiers', [...tankFilters.tiers, tier]); - } - }} - > - {TIER_ROMAN_NUMERALS[tier]} - - ); - })} - - - - - - {times(5, (index) => { - const tier = index + 6; - const selected = tankFilters.tiers?.includes(tier); - - return ( - { - if (tankFilters.tiers.includes(tier)) { - $tankFilters.setKey( - 'tiers', - tankFilters.tiers.filter((t) => t !== tier), - ); - } else { - $tankFilters.setKey('tiers', [...tankFilters.tiers, tier]); - } - }} - > - {TIER_ROMAN_NUMERALS[tier]} - - ); - })} - - - - - - {gameDefinitions.nations - .slice(0, Math.ceil(gameDefinitions.nations.length / 2)) - .map((nation) => { - const selected = tankFilters.nations?.includes(nation); - - return ( - { - if (tankFilters.nations.includes(nation)) { - $tankFilters.setKey( - 'nations', - tankFilters.nations.filter((n) => n !== nation), - ); - } else { - $tankFilters.setKey('nations', [ - ...tankFilters.nations, - nation, - ]); - } - }} - > - - - ); - })} - - - - - - {gameDefinitions.nations - .slice(Math.ceil(gameDefinitions.nations.length / 2)) - .map((nation) => { - const selected = tankFilters.nations?.includes(nation); - - return ( - { - if (tankFilters.nations.includes(nation)) { - $tankFilters.setKey( - 'nations', - tankFilters.nations.filter((n) => n !== nation), - ); - } else { - $tankFilters.setKey('nations', [ - ...tankFilters.nations, - nation, - ]); - } - }} - > - - - ); - })} - - - - - + - {TANK_CLASSES.map((tankClass) => { - const Icon = classIcons[tankClass]; - const selected = tankFilters.classes?.includes(tankClass); + {times(5, (index) => { + const tier = index + 1; + const selected = tankFilters.tiers?.includes(tier); return ( { - if (tankFilters.classes.includes(tankClass)) { + if (tankFilters.tiers.includes(tier)) { $tankFilters.setKey( - 'classes', - tankFilters.classes.filter((c) => c !== tankClass), + 'tiers', + tankFilters.tiers.filter((t) => t !== tier), ); } else { - $tankFilters.setKey('classes', [ - ...tankFilters.classes, - tankClass, + $tankFilters.setKey('tiers', [ + ...tankFilters.tiers, + tier, ]); } }} > - + {TIER_ROMAN_NUMERALS[tier]} ); })} + + - { - if (tankFilters.gunType.includes('regular')) { - $tankFilters.setKey( - 'gunType', - tankFilters.gunType.filter((t) => t !== 'regular'), - ); - } else { - $tankFilters.setKey('gunType', [ - ...tankFilters.gunType, - 'regular', - ]); - } - }} - > - - - { - if (tankFilters.gunType.includes('auto_loader')) { - $tankFilters.setKey( - 'gunType', - tankFilters.gunType.filter((t) => t !== 'auto_loader'), - ); - } else { - $tankFilters.setKey('gunType', [ - ...tankFilters.gunType, - 'auto_loader', - ]); - } - }} - > - - - { - if (tankFilters.gunType.includes('auto_reloader')) { - $tankFilters.setKey( - 'gunType', - tankFilters.gunType.filter((t) => t !== 'auto_reloader'), - ); - } else { - $tankFilters.setKey('gunType', [ - ...tankFilters.gunType, - 'auto_reloader', - ]); - } - }} - > - - - + {times(5, (index) => { + const tier = index + 6; + const selected = tankFilters.tiers?.includes(tier); - - - + return ( + { + if (tankFilters.tiers.includes(tier)) { + $tankFilters.setKey( + 'tiers', + tankFilters.tiers.filter((t) => t !== tier), + ); + } else { + $tankFilters.setKey('tiers', [ + ...tankFilters.tiers, + tier, + ]); + } + }} + > + {TIER_ROMAN_NUMERALS[tier]} + + ); + })} + - + - { - if (tankFilters.types.includes(TankType.RESEARCHABLE)) { - $tankFilters.setKey( - 'types', - tankFilters.types.filter( - (t) => t !== TankType.RESEARCHABLE, - ), - ); - } else { - $tankFilters.setKey('types', [ - ...tankFilters.types, - TankType.RESEARCHABLE, - ]); - } - }} + {gameDefinitions.nations + .slice(0, Math.ceil(gameDefinitions.nations.length / 2)) + .map((nation) => { + const selected = tankFilters.nations?.includes(nation); + + return ( + { + if (tankFilters.nations.includes(nation)) { + $tankFilters.setKey( + 'nations', + tankFilters.nations.filter((n) => n !== nation), + ); + } else { + $tankFilters.setKey('nations', [ + ...tankFilters.nations, + nation, + ]); + } + }} + > + + + ); + })} + + + + + + {gameDefinitions.nations + .slice(Math.ceil(gameDefinitions.nations.length / 2)) + .map((nation) => { + const selected = tankFilters.nations?.includes(nation); + + return ( + { + if (tankFilters.nations.includes(nation)) { + $tankFilters.setKey( + 'nations', + tankFilters.nations.filter((n) => n !== nation), + ); + } else { + $tankFilters.setKey('nations', [ + ...tankFilters.nations, + nation, + ]); + } + }} + > + + + ); + })} + + + + + + - - - { - if (tankFilters.types.includes(TankType.PREMIUM)) { - $tankFilters.setKey( - 'types', - tankFilters.types.filter((t) => t !== TankType.PREMIUM), - ); - } else { - $tankFilters.setKey('types', [ - ...tankFilters.types, - TankType.PREMIUM, - ]); - } - }} + {TANK_CLASSES.map((tankClass) => { + const Icon = classIcons[tankClass]; + const selected = tankFilters.classes?.includes(tankClass); + + return ( + { + if (tankFilters.classes.includes(tankClass)) { + $tankFilters.setKey( + 'classes', + tankFilters.classes.filter((c) => c !== tankClass), + ); + } else { + $tankFilters.setKey('classes', [ + ...tankFilters.classes, + tankClass, + ]); + } + }} + > + + + ); + })} + + + - { + if (tankFilters.gunType.includes('regular')) { + $tankFilters.setKey( + 'gunType', + tankFilters.gunType.filter((t) => t !== 'regular'), + ); + } else { + $tankFilters.setKey('gunType', [ + ...tankFilters.gunType, + 'regular', + ]); + } + }} + > + + + { + if (tankFilters.gunType.includes('auto_loader')) { + $tankFilters.setKey( + 'gunType', + tankFilters.gunType.filter((t) => t !== 'auto_loader'), + ); + } else { + $tankFilters.setKey('gunType', [ + ...tankFilters.gunType, + 'auto_loader', + ]); + } + }} + > + + + { + if (tankFilters.gunType.includes('auto_reloader')) { + $tankFilters.setKey( + 'gunType', + tankFilters.gunType.filter((t) => t !== 'auto_reloader'), + ); + } else { + $tankFilters.setKey('gunType', [ + ...tankFilters.gunType, + 'auto_reloader', + ]); + } + }} + > + + + + + + + + + + + + + + { + if (tankFilters.types.includes(TankType.RESEARCHABLE)) { + $tankFilters.setKey( + 'types', + tankFilters.types.filter( + (t) => t !== TankType.RESEARCHABLE, + ), + ); + } else { + $tankFilters.setKey('types', [ + ...tankFilters.types, + TankType.RESEARCHABLE, + ]); + } + }} + > + + + { + if (tankFilters.types.includes(TankType.PREMIUM)) { + $tankFilters.setKey( + 'types', + tankFilters.types.filter((t) => t !== TankType.PREMIUM), + ); + } else { + $tankFilters.setKey('types', [ + ...tankFilters.types, + TankType.PREMIUM, + ]); + } + }} > - - - - { - if (tankFilters.types.includes(TankType.COLLECTOR)) { - $tankFilters.setKey( - 'types', - tankFilters.types.filter((t) => t !== TankType.COLLECTOR), - ); - } else { - $tankFilters.setKey('types', [ - ...tankFilters.types, - TankType.COLLECTOR, - ]); + + + + + - { + if (tankFilters.types.includes(TankType.COLLECTOR)) { + $tankFilters.setKey( + 'types', + tankFilters.types.filter((t) => t !== TankType.COLLECTOR), + ); + } else { + $tankFilters.setKey('types', [ + ...tankFilters.types, + TankType.COLLECTOR, + ]); + } + }} > - - - - + + + + + - - { - $tankFilters.setKey('testing', 'include'); - }} + - - - { - $tankFilters.setKey('testing', 'exclude'); - }} - > - - - { - $tankFilters.setKey('testing', 'only'); - }} - > - - - - - - - - + { + $tankFilters.setKey('testing', 'include'); + }} + > + + + { + $tankFilters.setKey('testing', 'exclude'); + }} + > + + + { + $tankFilters.setKey('testing', 'only'); + }} + > + + + - - { + underline="always" + mt="4" + href="#" + onClick={(event) => { + event.preventDefault(); $tankFilters.set(initialTankFilters); $tankopediaSort.set(initialTankopediaSort); }} > - - - + {strings.website.common.tank_search.clear_filters} + + )} ); }