mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-25 03:29:51 +01:00
fix: cleaner clear button
This commit is contained in:
1 parent
e20d65d218
commit
bdc013b4c8
2 files changed
+57
-40
No files matched your search
@@ -756,7 +756,7 @@
|
|||||||
},
|
},
|
||||||
|
|
||||||
"tank_search": {
|
"tank_search": {
|
||||||
"clear_filters": "Clear",
|
"clear_filters": "Clear filters",
|
||||||
"search_bar_hint": "Search tanks...",
|
"search_bar_hint": "Search tanks...",
|
||||||
"recent": "Recently viewed",
|
"recent": "Recently viewed",
|
||||||
"select_all": "Select all",
|
"select_all": "Select all",
|
||||||
|
|||||||
@@ -6,17 +6,16 @@ import {
|
|||||||
TIER_ROMAN_NUMERALS,
|
TIER_ROMAN_NUMERALS,
|
||||||
} from '@blitzkit/core';
|
} from '@blitzkit/core';
|
||||||
import { useStore } from '@nanostores/react';
|
import { useStore } from '@nanostores/react';
|
||||||
import { ReloadIcon } from '@radix-ui/react-icons';
|
|
||||||
import {
|
import {
|
||||||
Box,
|
Box,
|
||||||
Button,
|
|
||||||
Flex,
|
Flex,
|
||||||
IconButton,
|
IconButton,
|
||||||
Inset,
|
Inset,
|
||||||
|
Link,
|
||||||
Popover,
|
Popover,
|
||||||
Text,
|
Text,
|
||||||
} from '@radix-ui/themes';
|
} from '@radix-ui/themes';
|
||||||
import { times } from 'lodash-es';
|
import { isEqual, times } from 'lodash-es';
|
||||||
import { awaitableGameDefinitions } from '../../../core/awaitables/gameDefinitions';
|
import { awaitableGameDefinitions } from '../../../core/awaitables/gameDefinitions';
|
||||||
import { Var } from '../../../core/radix/var';
|
import { Var } from '../../../core/radix/var';
|
||||||
import { useLocale } from '../../../hooks/useLocale';
|
import { useLocale } from '../../../hooks/useLocale';
|
||||||
@@ -121,8 +120,10 @@ function ShellFilter({ index, premium }: { index: number; premium?: boolean }) {
|
|||||||
export function FilterControl({ compact }: FilterControlProps) {
|
export function FilterControl({ compact }: FilterControlProps) {
|
||||||
const tankFilters = useStore($tankFilters);
|
const tankFilters = useStore($tankFilters);
|
||||||
const { strings } = useLocale();
|
const { strings } = useLocale();
|
||||||
|
const clearable = !isEqual(tankFilters, initialTankFilters);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
<Flex direction="column" align="center">
|
||||||
<Flex
|
<Flex
|
||||||
height="fit-content"
|
height="fit-content"
|
||||||
gap="2"
|
gap="2"
|
||||||
@@ -130,11 +131,14 @@ export function FilterControl({ compact }: FilterControlProps) {
|
|||||||
justify="center"
|
justify="center"
|
||||||
>
|
>
|
||||||
<Flex
|
<Flex
|
||||||
|
flexShrink="0"
|
||||||
direction={compact ? 'row' : { initial: 'row', md: 'column' }}
|
direction={compact ? 'row' : { initial: 'row', md: 'column' }}
|
||||||
overflow="hidden"
|
overflow="hidden"
|
||||||
style={{ borderRadius: 'var(--radius-5)' }}
|
style={{ borderRadius: 'var(--radius-5)' }}
|
||||||
>
|
>
|
||||||
<Flex direction={compact ? 'column' : { md: 'row', initial: 'column' }}>
|
<Flex
|
||||||
|
direction={compact ? 'column' : { md: 'row', initial: 'column' }}
|
||||||
|
>
|
||||||
{times(5, (index) => {
|
{times(5, (index) => {
|
||||||
const tier = index + 1;
|
const tier = index + 1;
|
||||||
const selected = tankFilters.tiers?.includes(tier);
|
const selected = tankFilters.tiers?.includes(tier);
|
||||||
@@ -153,7 +157,10 @@ export function FilterControl({ compact }: FilterControlProps) {
|
|||||||
tankFilters.tiers.filter((t) => t !== tier),
|
tankFilters.tiers.filter((t) => t !== tier),
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
$tankFilters.setKey('tiers', [...tankFilters.tiers, tier]);
|
$tankFilters.setKey('tiers', [
|
||||||
|
...tankFilters.tiers,
|
||||||
|
tier,
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
@@ -171,7 +178,9 @@ export function FilterControl({ compact }: FilterControlProps) {
|
|||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<Flex direction={compact ? 'column' : { md: 'row', initial: 'column' }}>
|
<Flex
|
||||||
|
direction={compact ? 'column' : { md: 'row', initial: 'column' }}
|
||||||
|
>
|
||||||
{times(5, (index) => {
|
{times(5, (index) => {
|
||||||
const tier = index + 6;
|
const tier = index + 6;
|
||||||
const selected = tankFilters.tiers?.includes(tier);
|
const selected = tankFilters.tiers?.includes(tier);
|
||||||
@@ -190,7 +199,10 @@ export function FilterControl({ compact }: FilterControlProps) {
|
|||||||
tankFilters.tiers.filter((t) => t !== tier),
|
tankFilters.tiers.filter((t) => t !== tier),
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
$tankFilters.setKey('tiers', [...tankFilters.tiers, tier]);
|
$tankFilters.setKey('tiers', [
|
||||||
|
...tankFilters.tiers,
|
||||||
|
tier,
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
@@ -202,11 +214,14 @@ export function FilterControl({ compact }: FilterControlProps) {
|
|||||||
</Flex>
|
</Flex>
|
||||||
|
|
||||||
<Flex
|
<Flex
|
||||||
|
flexShrink="0"
|
||||||
direction={compact ? 'row' : { initial: 'row', md: 'column' }}
|
direction={compact ? 'row' : { initial: 'row', md: 'column' }}
|
||||||
overflow="hidden"
|
overflow="hidden"
|
||||||
style={{ borderRadius: 'var(--radius-5)' }}
|
style={{ borderRadius: 'var(--radius-5)' }}
|
||||||
>
|
>
|
||||||
<Flex direction={compact ? 'column' : { md: 'row', initial: 'column' }}>
|
<Flex
|
||||||
|
direction={compact ? 'column' : { md: 'row', initial: 'column' }}
|
||||||
|
>
|
||||||
{gameDefinitions.nations
|
{gameDefinitions.nations
|
||||||
.slice(0, Math.ceil(gameDefinitions.nations.length / 2))
|
.slice(0, Math.ceil(gameDefinitions.nations.length / 2))
|
||||||
.map((nation) => {
|
.map((nation) => {
|
||||||
@@ -250,7 +265,9 @@ export function FilterControl({ compact }: FilterControlProps) {
|
|||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<Flex direction={compact ? 'column' : { md: 'row', initial: 'column' }}>
|
<Flex
|
||||||
|
direction={compact ? 'column' : { md: 'row', initial: 'column' }}
|
||||||
|
>
|
||||||
{gameDefinitions.nations
|
{gameDefinitions.nations
|
||||||
.slice(Math.ceil(gameDefinitions.nations.length / 2))
|
.slice(Math.ceil(gameDefinitions.nations.length / 2))
|
||||||
.map((nation) => {
|
.map((nation) => {
|
||||||
@@ -366,7 +383,9 @@ export function FilterControl({ compact }: FilterControlProps) {
|
|||||||
}
|
}
|
||||||
radius="none"
|
radius="none"
|
||||||
color={
|
color={
|
||||||
tankFilters.gunType.includes('auto_loader') ? undefined : 'gray'
|
tankFilters.gunType.includes('auto_loader')
|
||||||
|
? undefined
|
||||||
|
: 'gray'
|
||||||
}
|
}
|
||||||
highContrast
|
highContrast
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
@@ -387,7 +406,9 @@ export function FilterControl({ compact }: FilterControlProps) {
|
|||||||
</IconButton>
|
</IconButton>
|
||||||
<IconButton
|
<IconButton
|
||||||
variant={
|
variant={
|
||||||
tankFilters.gunType.includes('auto_reloader') ? 'solid' : 'soft'
|
tankFilters.gunType.includes('auto_reloader')
|
||||||
|
? 'solid'
|
||||||
|
: 'soft'
|
||||||
}
|
}
|
||||||
radius="none"
|
radius="none"
|
||||||
color={
|
color={
|
||||||
@@ -414,18 +435,15 @@ export function FilterControl({ compact }: FilterControlProps) {
|
|||||||
</IconButton>
|
</IconButton>
|
||||||
</Flex>
|
</Flex>
|
||||||
|
|
||||||
<Box display={{ initial: 'none', md: 'block' }}>
|
<Flex
|
||||||
<Button
|
overflow="hidden"
|
||||||
color="red"
|
style={{ borderRadius: 'var(--radius-full)' }}
|
||||||
onClick={() => {
|
direction={compact ? 'column' : { md: 'row', initial: 'column' }}
|
||||||
$tankFilters.set(initialTankFilters);
|
|
||||||
$tankopediaSort.set(initialTankopediaSort);
|
|
||||||
}}
|
|
||||||
>
|
>
|
||||||
<ReloadIcon />
|
<ShellFilter index={0} />
|
||||||
{strings.website.common.tank_search.clear_filters}
|
<ShellFilter index={1} premium />
|
||||||
</Button>
|
<ShellFilter index={2} />
|
||||||
</Box>
|
</Flex>
|
||||||
</Flex>
|
</Flex>
|
||||||
|
|
||||||
<Flex gap="2" align="start">
|
<Flex gap="2" align="start">
|
||||||
@@ -467,11 +485,15 @@ export function FilterControl({ compact }: FilterControlProps) {
|
|||||||
</IconButton>
|
</IconButton>
|
||||||
<IconButton
|
<IconButton
|
||||||
variant={
|
variant={
|
||||||
tankFilters.types?.includes(TankType.PREMIUM) ? 'solid' : 'soft'
|
tankFilters.types?.includes(TankType.PREMIUM)
|
||||||
|
? 'solid'
|
||||||
|
: 'soft'
|
||||||
}
|
}
|
||||||
radius="none"
|
radius="none"
|
||||||
color={
|
color={
|
||||||
tankFilters.types?.includes(TankType.PREMIUM) ? 'amber' : 'gray'
|
tankFilters.types?.includes(TankType.PREMIUM)
|
||||||
|
? 'amber'
|
||||||
|
: 'gray'
|
||||||
}
|
}
|
||||||
highContrast
|
highContrast
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
@@ -584,30 +606,25 @@ export function FilterControl({ compact }: FilterControlProps) {
|
|||||||
/>
|
/>
|
||||||
</IconButton>
|
</IconButton>
|
||||||
</Flex>
|
</Flex>
|
||||||
|
|
||||||
<Flex
|
|
||||||
overflow="hidden"
|
|
||||||
style={{ borderRadius: 'var(--radius-full)' }}
|
|
||||||
direction={compact ? 'column' : { md: 'row', initial: 'column' }}
|
|
||||||
>
|
|
||||||
<ShellFilter index={0} />
|
|
||||||
<ShellFilter index={1} premium />
|
|
||||||
<ShellFilter index={2} />
|
|
||||||
</Flex>
|
</Flex>
|
||||||
</Flex>
|
</Flex>
|
||||||
</Flex>
|
</Flex>
|
||||||
|
|
||||||
<Box display={{ initial: 'block', md: 'none' }} ml="4">
|
{clearable && (
|
||||||
<IconButton
|
<Link
|
||||||
color="red"
|
color="red"
|
||||||
onClick={() => {
|
underline="always"
|
||||||
|
mt="4"
|
||||||
|
href="#"
|
||||||
|
onClick={(event) => {
|
||||||
|
event.preventDefault();
|
||||||
$tankFilters.set(initialTankFilters);
|
$tankFilters.set(initialTankFilters);
|
||||||
$tankopediaSort.set(initialTankopediaSort);
|
$tankopediaSort.set(initialTankopediaSort);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<ReloadIcon />
|
{strings.website.common.tank_search.clear_filters}
|
||||||
</IconButton>
|
</Link>
|
||||||
</Box>
|
)}
|
||||||
</Flex>
|
</Flex>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user