mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-23 19:49:50 +02:00
to core
This commit is contained in:
1 parent
444705347f
commit
1c505818a4
11 files changed
+75
-41
No files matched your search
@@ -1,6 +1,6 @@
|
|||||||
import { GameDefinitions, TankDefinition } from "@blitzkit/protos";
|
import { GameDefinitions, TankDefinition } from "@blitzkit/protos";
|
||||||
import { tankClassOrder } from "../config/tankClassOrder";
|
import { tankClassOrder } from "../config/tankClassOrder";
|
||||||
import { treeTypeOrder } from "./treeTypeOrder";
|
import { treeTypeOrder } from "../config/treeTypeOrder";
|
||||||
|
|
||||||
export function metaSortTank(
|
export function metaSortTank(
|
||||||
tanks: TankDefinition[],
|
tanks: TankDefinition[],
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import { GunDefinition } from "@blitzkit/protos";
|
||||||
|
import { CaseType } from "../types";
|
||||||
|
|
||||||
|
export const gunTypeOrder: CaseType<GunDefinition>[] = [
|
||||||
|
"regular",
|
||||||
|
"auto_loader",
|
||||||
|
"auto_reloader",
|
||||||
|
];
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
export * from "./gunTypeOrder";
|
||||||
|
export * from "./tankClassOrder";
|
||||||
|
export * from "./treeTypeOrder";
|
||||||
File renamed without changes.
@@ -1,6 +1,7 @@
|
|||||||
export * from "./api";
|
export * from "./api";
|
||||||
export * from "./blitz";
|
export * from "./blitz";
|
||||||
export * from "./blitzkit";
|
export * from "./blitzkit";
|
||||||
|
export * from "./config";
|
||||||
export * from "./imgur";
|
export * from "./imgur";
|
||||||
export * from "./math";
|
export * from "./math";
|
||||||
export * from "./patreon";
|
export * from "./patreon";
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
export type CaseType<T> = T extends {
|
||||||
|
gun_type?: { $case: infer U; value: any };
|
||||||
|
}
|
||||||
|
? U
|
||||||
|
: never;
|
||||||
@@ -4,6 +4,7 @@ export * from "./blitzStrings";
|
|||||||
export * from "./blitzTankFilterDefinitionCategory";
|
export * from "./blitzTankFilterDefinitionCategory";
|
||||||
export * from "./camouflagesXml";
|
export * from "./camouflagesXml";
|
||||||
export * from "./camouflagesYaml";
|
export * from "./camouflagesYaml";
|
||||||
|
export * from "./caseType";
|
||||||
export * from "./chassisDefinitionsList";
|
export * from "./chassisDefinitionsList";
|
||||||
export * from "./combatRolesYaml";
|
export * from "./combatRolesYaml";
|
||||||
export * from "./consumablesCommon";
|
export * from "./consumablesCommon";
|
||||||
|
|||||||
+10
-1
@@ -5,7 +5,11 @@ import { ClassLight } from "./components/ClassLight";
|
|||||||
import { ClassMedium } from "./components/ClassMedium";
|
import { ClassMedium } from "./components/ClassMedium";
|
||||||
import { ClassTankDestroyer } from "./components/ClassTankDestroyer";
|
import { ClassTankDestroyer } from "./components/ClassTankDestroyer";
|
||||||
|
|
||||||
export const classIcons: Record<
|
interface ClassIconProps extends ComponentProps<"svg"> {
|
||||||
|
class: TankClass;
|
||||||
|
}
|
||||||
|
|
||||||
|
const classIcons: Record<
|
||||||
TankClass,
|
TankClass,
|
||||||
(props: ComponentProps<"svg">) => ReactNode
|
(props: ComponentProps<"svg">) => ReactNode
|
||||||
> = {
|
> = {
|
||||||
@@ -14,3 +18,8 @@ export const classIcons: Record<
|
|||||||
[TankClass.TANK_CLASS_LIGHT]: ClassLight,
|
[TankClass.TANK_CLASS_LIGHT]: ClassLight,
|
||||||
[TankClass.TANK_CLASS_MEDIUM]: ClassMedium,
|
[TankClass.TANK_CLASS_MEDIUM]: ClassMedium,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export function ClassIcon({ class: tankClass, ...props }: ClassIconProps) {
|
||||||
|
const Icon = classIcons[tankClass];
|
||||||
|
return <Icon {...props} />;
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
import type { CaseType } from "@blitzkit/core";
|
||||||
|
import type { GunDefinition } from "@blitzkit/protos";
|
||||||
|
import type { ComponentProps, ReactNode } from "react";
|
||||||
|
import { GunAutoloaderIcon } from "../GunAutoloaderIcon";
|
||||||
|
import { GunAutoreloaderIcon } from "../GunAutoreloaderIcon";
|
||||||
|
import { GunRegularIcon } from "../GunRegularIcon";
|
||||||
|
|
||||||
|
const typeIcons: Record<
|
||||||
|
CaseType<GunDefinition>,
|
||||||
|
(props: ComponentProps<"svg">) => ReactNode
|
||||||
|
> = {
|
||||||
|
regular: GunRegularIcon,
|
||||||
|
auto_loader: GunAutoloaderIcon,
|
||||||
|
auto_reloader: GunAutoreloaderIcon,
|
||||||
|
};
|
||||||
|
|
||||||
|
interface Props extends ComponentProps<"svg"> {
|
||||||
|
type: CaseType<GunDefinition>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function GunIcon({ type, ...props }: Props) {
|
||||||
|
const Icon = typeIcons[type];
|
||||||
|
return <Icon {...props} />;
|
||||||
|
}
|
||||||
@@ -1,7 +1,8 @@
|
|||||||
import { alias, TIER_ROMAN_NUMERALS } from "@blitzkit/core";
|
import { alias, gunTypeOrder, TIER_ROMAN_NUMERALS } from "@blitzkit/core";
|
||||||
|
import { tankClassOrder } from "@blitzkit/core/src/config/tankClassOrder";
|
||||||
import { literals } from "@blitzkit/i18n";
|
import { literals } from "@blitzkit/i18n";
|
||||||
import locales from "@blitzkit/i18n/locales.json";
|
import locales from "@blitzkit/i18n/locales.json";
|
||||||
import { ShellType, TankType, type GunDefinition } from "@blitzkit/protos";
|
import { ShellType, TankType } from "@blitzkit/protos";
|
||||||
import {
|
import {
|
||||||
LockClosedIcon,
|
LockClosedIcon,
|
||||||
LockOpen2Icon,
|
LockOpen2Icon,
|
||||||
@@ -9,18 +10,16 @@ import {
|
|||||||
TrashIcon,
|
TrashIcon,
|
||||||
} from "@radix-ui/react-icons";
|
} from "@radix-ui/react-icons";
|
||||||
import { times } from "lodash-es";
|
import { times } from "lodash-es";
|
||||||
import { Fragment, type ComponentProps, type ReactNode } from "react";
|
import { Fragment } from "react";
|
||||||
import { api } from "../../api/dynamic";
|
import { api } from "../../api/dynamic";
|
||||||
import { useLocale } from "../../hooks/useLocale";
|
import { useLocale } from "../../hooks/useLocale";
|
||||||
|
import { useStrings } from "../../hooks/useStrings";
|
||||||
import { App } from "../../stores/app";
|
import { App } from "../../stores/app";
|
||||||
import { TankFilters, type CaseType } from "../../stores/tankFilters";
|
import { TankFilters } from "../../stores/tankFilters";
|
||||||
import { Button } from "../Button";
|
import { Button } from "../Button";
|
||||||
import { classIcons } from "../ClassIcon";
|
import { ClassIcon } from "../ClassIcon";
|
||||||
import { DropdownMenu } from "../DropdownMenu";
|
import { DropdownMenu } from "../DropdownMenu";
|
||||||
import { Flex } from "../Flex";
|
import { Flex } from "../Flex";
|
||||||
import { GunAutoloaderIcon } from "../GunAutoloaderIcon";
|
|
||||||
import { GunAutoreloaderIcon } from "../GunAutoreloaderIcon";
|
|
||||||
import { GunRegularIcon } from "../GunRegularIcon";
|
|
||||||
import { IconButton } from "../IconButton";
|
import { IconButton } from "../IconButton";
|
||||||
import { MissingShellIcon } from "../MissingShellIcon";
|
import { MissingShellIcon } from "../MissingShellIcon";
|
||||||
import { ResearchedIcon } from "../ResearchedIcon";
|
import { ResearchedIcon } from "../ResearchedIcon";
|
||||||
@@ -140,25 +139,12 @@ const shellTypeIcons: Record<ShellType, string> = {
|
|||||||
[ShellType.SHELL_TYPE_HEAT]: "hc",
|
[ShellType.SHELL_TYPE_HEAT]: "hc",
|
||||||
};
|
};
|
||||||
|
|
||||||
const GUN_TYPE_ICONS: Record<
|
|
||||||
CaseType<GunDefinition>,
|
|
||||||
(props: ComponentProps<"svg">) => ReactNode
|
|
||||||
> = {
|
|
||||||
regular: GunRegularIcon,
|
|
||||||
auto_loader: GunAutoloaderIcon,
|
|
||||||
auto_reloader: GunAutoreloaderIcon,
|
|
||||||
};
|
|
||||||
|
|
||||||
const TANK_TYPE_COLORS: Record<TankType, string> = {
|
const TANK_TYPE_COLORS: Record<TankType, string> = {
|
||||||
[TankType.TANK_TYPE_RESEARCHABLE]: "gray",
|
[TankType.TANK_TYPE_RESEARCHABLE]: "gray",
|
||||||
[TankType.TANK_TYPE_PREMIUM]: "amber",
|
[TankType.TANK_TYPE_PREMIUM]: "amber",
|
||||||
[TankType.TANK_TYPE_COLLECTOR]: "blue",
|
[TankType.TANK_TYPE_COLLECTOR]: "blue",
|
||||||
};
|
};
|
||||||
|
|
||||||
const GUN_TYPES = Object.keys(
|
|
||||||
GUN_TYPE_ICONS,
|
|
||||||
) as (keyof typeof GUN_TYPE_ICONS)[];
|
|
||||||
|
|
||||||
const MAX_ICONS = 4;
|
const MAX_ICONS = 4;
|
||||||
|
|
||||||
const TIERS = times(10, (i) => 10 - i);
|
const TIERS = times(10, (i) => 10 - i);
|
||||||
@@ -200,7 +186,7 @@ function ResetButton() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function TiersFilter() {
|
function TiersFilter() {
|
||||||
const { strings } = useLocale();
|
const strings = useStrings();
|
||||||
const tiersRaw = TankFilters.use((state) => state.tiers);
|
const tiersRaw = TankFilters.use((state) => state.tiers);
|
||||||
const tiers = tiersRaw.length === 0 ? TIERS : tiersRaw;
|
const tiers = tiersRaw.length === 0 ? TIERS : tiersRaw;
|
||||||
|
|
||||||
@@ -277,7 +263,7 @@ function NationsFilter() {
|
|||||||
const rawNations = TankFilters.use((state) => state.nations);
|
const rawNations = TankFilters.use((state) => state.nations);
|
||||||
const nations =
|
const nations =
|
||||||
rawNations.length === 0 ? gameDefinitions.nations : rawNations;
|
rawNations.length === 0 ? gameDefinitions.nations : rawNations;
|
||||||
const { strings } = useLocale();
|
const strings = useStrings();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<DropdownMenu.Root modal={false}>
|
<DropdownMenu.Root modal={false}>
|
||||||
@@ -359,9 +345,9 @@ function NationsFilter() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function ClassFilter() {
|
function ClassFilter() {
|
||||||
const { strings } = useLocale();
|
const strings = useStrings();
|
||||||
const rawClasses = TankFilters.use((state) => state.classes);
|
const rawClasses = TankFilters.use((state) => state.classes);
|
||||||
const classes = rawClasses.length === 0 ? TANK_CLASSES : rawClasses;
|
const classes = rawClasses.length === 0 ? tankClassOrder : rawClasses;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<DropdownMenu.Root modal={false}>
|
<DropdownMenu.Root modal={false}>
|
||||||
@@ -369,10 +355,10 @@ function ClassFilter() {
|
|||||||
<Button size="minor" color="gray" variant="surface">
|
<Button size="minor" color="gray" variant="surface">
|
||||||
<Flex>
|
<Flex>
|
||||||
{classes.map((tankClass, index) => {
|
{classes.map((tankClass, index) => {
|
||||||
const Icon = classIcons[tankClass];
|
|
||||||
return (
|
return (
|
||||||
<Icon
|
<ClassIcon
|
||||||
key={tankClass}
|
key={tankClass}
|
||||||
|
class={tankClass}
|
||||||
style={{
|
style={{
|
||||||
color: "var(--gray-12)",
|
color: "var(--gray-12)",
|
||||||
opacity: 1,
|
opacity: 1,
|
||||||
@@ -389,9 +375,8 @@ function ClassFilter() {
|
|||||||
</DropdownMenu.Trigger>
|
</DropdownMenu.Trigger>
|
||||||
|
|
||||||
<DropdownMenu.Content>
|
<DropdownMenu.Content>
|
||||||
{TANK_CLASSES.map((tankClass) => {
|
{tankClassOrder.map((tankClass) => {
|
||||||
const selected = rawClasses.includes(tankClass);
|
const selected = rawClasses.includes(tankClass);
|
||||||
const Icon = classIcons[tankClass];
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<DropdownMenu.CheckboxItem
|
<DropdownMenu.CheckboxItem
|
||||||
@@ -411,7 +396,10 @@ function ClassFilter() {
|
|||||||
}}
|
}}
|
||||||
checked={selected}
|
checked={selected}
|
||||||
>
|
>
|
||||||
<Icon style={{ width: "1.25em", height: "1.25em" }} />
|
<ClassIcon
|
||||||
|
class={tankClass}
|
||||||
|
style={{ width: "1.25em", height: "1.25em" }}
|
||||||
|
/>
|
||||||
|
|
||||||
{strings.common.tank_class_medium[tankClass]}
|
{strings.common.tank_class_medium[tankClass]}
|
||||||
</DropdownMenu.CheckboxItem>
|
</DropdownMenu.CheckboxItem>
|
||||||
@@ -440,8 +428,8 @@ function ClassFilter() {
|
|||||||
|
|
||||||
function GunTypeFilter() {
|
function GunTypeFilter() {
|
||||||
const rawGunTypes = TankFilters.use((state) => state.gunType);
|
const rawGunTypes = TankFilters.use((state) => state.gunType);
|
||||||
const gunTypes = rawGunTypes.length === 0 ? GUN_TYPES : rawGunTypes;
|
const gunTypes = rawGunTypes.length === 0 ? gunTypeOrder : rawGunTypes;
|
||||||
const { strings } = useLocale();
|
const strings = useStrings();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<DropdownMenu.Root modal={false}>
|
<DropdownMenu.Root modal={false}>
|
||||||
|
|||||||
@@ -1,17 +1,12 @@
|
|||||||
|
import type { CaseType } from "@blitzkit/core";
|
||||||
import type {
|
import type {
|
||||||
GunDefinition,
|
GunDefinition,
|
||||||
ShellType,
|
ShellType,
|
||||||
TankClass,
|
TankClass,
|
||||||
TankType,
|
TankType,
|
||||||
} from "@blitzkit/core";
|
} from "@blitzkit/protos";
|
||||||
import { Varuna } from "varuna";
|
import { Varuna } from "varuna";
|
||||||
|
|
||||||
export type CaseType<T> = T extends {
|
|
||||||
gun_type?: { $case: infer U; value: any };
|
|
||||||
}
|
|
||||||
? U
|
|
||||||
: never;
|
|
||||||
|
|
||||||
export interface TankFilters {
|
export interface TankFilters {
|
||||||
tiers: number[];
|
tiers: number[];
|
||||||
nations: string[];
|
nations: string[];
|
||||||
|
|||||||
Reference in new issue
Block a user