From 33ebbbeb65ca05fe92b199d9b23557a8419833df Mon Sep 17 00:00:00 2001 From: tresabhi <43380238+tresabhi@users.noreply.github.com> Date: Tue, 4 Aug 2026 14:02:52 -0500 Subject: [PATCH] imports --- .../blitzkit/api/server/8_skillDefinitions.ts | 7 +-- packages/core/src/types/tankmenAvatar.ts | 4 +- .../src/components/CrewSkillManager.tsx | 12 +++--- .../ModuleButtons/ConsumableButton.tsx | 7 ++- .../ModuleButtons/EquipmentButton.tsx | 7 ++- .../ModuleButtons/ProvisionButton.tsx | 7 ++- .../src/components/ProvisionsManager.tsx | 4 +- .../components/Tankopedia/CalloutsSection.tsx | 5 ++- .../Characteristics/components/Crew.tsx | 4 +- .../Characteristics/components/Firepower.tsx | 4 +- .../components/CanvasContent.tsx | 4 +- .../components/ModelChunk.tsx | 4 +- .../GunFlexibilityVisualizer/index.tsx | 4 +- .../components/InfoWithDelta.tsx | 16 +++---- .../components/ShellSwitcher.tsx | 3 +- .../components/RicochetVisualizer/index.tsx | 4 +- .../components/Characteristics/index.tsx | 7 ++- .../components/Consumables.tsx | 12 +++--- .../components/Equalizer.tsx | 15 +------ .../components/Equipment.tsx | 6 +-- .../components/Miscellaneous.tsx | 7 ++- .../components/Modules.tsx | 9 ++-- .../components/Provisions.tsx | 4 +- .../components/Tankopedia/GameModeSection.tsx | 23 ++++------ .../HeroSection/components/Options/index.tsx | 9 ++-- .../TankSandbox/components/Control.tsx | 4 +- .../TankSandbox/components/InitialAligner.tsx | 4 +- .../Tankopedia/HeroSection/index.tsx | 4 +- .../Tankopedia/MetaSection/index.tsx | 43 ++++++++----------- .../TechTreeSection/components/Node.tsx | 8 ++-- .../Tankopedia/TechTreeSection/index.tsx | 8 ++-- .../core/awaitables/equipmentDefinitions.ts | 3 -- .../src/core/awaitables/skillDefinitions.ts | 3 -- .../website/src/core/blitzkit/hasEquipment.ts | 8 ++-- packages/website/src/hooks/useEquipment.ts | 14 +++--- .../[...locale]/tanks/[slug]/_index.tsx | 35 ++++++++------- .../[...locale]/tanks/[slug]/index.astro | 31 ++++++------- packages/website/src/stores/duel/index.ts | 4 +- packages/website/src/stores/tankopedia.ts | 4 +- 39 files changed, 153 insertions(+), 208 deletions(-) delete mode 100644 packages/website/src/core/awaitables/equipmentDefinitions.ts delete mode 100644 packages/website/src/core/awaitables/skillDefinitions.ts diff --git a/packages/core/src/blitzkit/api/server/8_skillDefinitions.ts b/packages/core/src/blitzkit/api/server/8_skillDefinitions.ts index 30b6794a5..9198618fa 100644 --- a/packages/core/src/blitzkit/api/server/8_skillDefinitions.ts +++ b/packages/core/src/blitzkit/api/server/8_skillDefinitions.ts @@ -1,4 +1,4 @@ -import { BlitzTankClass, SkillDefinitions, TankClass } from "@blitzkit/core"; +import { BlitzTankClass, SkillDefinitions } from "@blitzkit/core"; import { Cache } from "./0_base"; import { ServerBlitzKitAPI7 } from "./7_provisionDefinitions"; @@ -9,10 +9,7 @@ export abstract class ServerBlitzKitAPI8 extends ServerBlitzKitAPI7 { const skillDefinitions = SkillDefinitions.create(); for (const tankClass in this.tankmenAvatar!.root.skillsByClasses) { - const skills = - this.tankmenAvatar!.root.skillsByClasses[ - Number(tankClass) as TankClass - ]; + const skills = this.tankmenAvatar!.root.skillsByClasses[tankClass]; skillDefinitions.classes[ this.blitzTankClassToBlitzkit[tankClass as BlitzTankClass] diff --git a/packages/core/src/types/tankmenAvatar.ts b/packages/core/src/types/tankmenAvatar.ts index b57550cbc..a254e35a7 100644 --- a/packages/core/src/types/tankmenAvatar.ts +++ b/packages/core/src/types/tankmenAvatar.ts @@ -1,8 +1,6 @@ -import { TankClass } from "@blitzkit/core"; - export interface TankmenAvatar { roles: unknown; - skillsByClasses: Record; + skillsByClasses: Record; skills: { [name: string]: { userString: string; diff --git a/packages/website/src/components/CrewSkillManager.tsx b/packages/website/src/components/CrewSkillManager.tsx index 87e459f6b..2a0a17a2a 100644 --- a/packages/website/src/components/CrewSkillManager.tsx +++ b/packages/website/src/components/CrewSkillManager.tsx @@ -1,14 +1,14 @@ -import { asset, permanentSkills, romanize } from '@blitzkit/core'; -import { Flex } from '@radix-ui/themes'; -import { awaitableSkillDefinitions } from '../core/awaitables/skillDefinitions'; -import { GenericTankComponentButton } from './ModuleButtons/GenericTankComponentButton'; +import { permanentSkills, romanize } from "@blitzkit/core"; +import { Flex } from "@radix-ui/themes"; +import { api } from "../core/blitzkit/api"; +import { GenericTankComponentButton } from "./ModuleButtons/GenericTankComponentButton"; interface CrewSkillManagerProps { skillLevels: Record; onChange?: (skillLevels: Record) => void; } -const skillDefinitions = await awaitableSkillDefinitions; +const skillDefinitions = await api.skillDefinitions(); export function CrewSkillManager({ skillLevels, @@ -27,7 +27,7 @@ export function CrewSkillManager({ special={!permanentSkills.includes(skill)} selected={level > 0} discriminator={level === 0 ? undefined : romanize(level)} - icon={asset(`icons/skills/${skill}.webp`)} + icon={`/api/icons/skills/${skill}.webp`} onClick={(event) => { if (!onChange) return; diff --git a/packages/website/src/components/ModuleButtons/ConsumableButton.tsx b/packages/website/src/components/ModuleButtons/ConsumableButton.tsx index f6ddf6749..92069d40f 100644 --- a/packages/website/src/components/ModuleButtons/ConsumableButton.tsx +++ b/packages/website/src/components/ModuleButtons/ConsumableButton.tsx @@ -1,7 +1,6 @@ -import { asset } from "@blitzkit/core"; import { ClockIcon, ReloadIcon } from "@radix-ui/react-icons"; import { Flex, Text } from "@radix-ui/themes"; -import { awaitableConsumableDefinitions } from "../../core/awaitables/consumableDefinitions"; +import { api } from "../../core/blitzkit/api"; import { useDelta } from "../../hooks/useDelta"; import { useLocale } from "../../hooks/useLocale"; import { GenericTankComponentButton } from "./GenericTankComponentButton"; @@ -13,7 +12,7 @@ interface ConsumableButtonProps extends TankComponentButtonProps { cooldown?: number; } -const consumableDefinitions = await awaitableConsumableDefinitions; +const consumableDefinitions = await api.consumableDefinitions(); export function ConsumableButton({ consumable, @@ -29,7 +28,7 @@ export function ConsumableButton({ {(cooldown || duration) && ( diff --git a/packages/website/src/components/ModuleButtons/EquipmentButton.tsx b/packages/website/src/components/ModuleButtons/EquipmentButton.tsx index 337937832..8d839cf0f 100644 --- a/packages/website/src/components/ModuleButtons/EquipmentButton.tsx +++ b/packages/website/src/components/ModuleButtons/EquipmentButton.tsx @@ -1,5 +1,4 @@ -import { asset } from "@blitzkit/core"; -import { awaitableEquipmentDefinitions } from "../../core/awaitables/equipmentDefinitions"; +import { api } from "../../core/blitzkit/api"; import { useLocale } from "../../hooks/useLocale"; import { GenericTankComponentButton } from "./GenericTankComponentButton"; import type { TankComponentButtonProps } from "./TankComponentButton"; @@ -8,7 +7,7 @@ interface EquipmentButtonProps extends TankComponentButtonProps { equipment: number; } -const equipmentDefinitions = await awaitableEquipmentDefinitions; +const equipmentDefinitions = await api.equipmentDefinitions(); export function EquipmentButton({ equipment, ...props }: EquipmentButtonProps) { const { unwrap } = useLocale(); @@ -16,7 +15,7 @@ export function EquipmentButton({ equipment, ...props }: EquipmentButtonProps) { return ( ); diff --git a/packages/website/src/components/ModuleButtons/ProvisionButton.tsx b/packages/website/src/components/ModuleButtons/ProvisionButton.tsx index a3876df40..fb3225c83 100644 --- a/packages/website/src/components/ModuleButtons/ProvisionButton.tsx +++ b/packages/website/src/components/ModuleButtons/ProvisionButton.tsx @@ -1,5 +1,4 @@ -import { asset } from "@blitzkit/core"; -import { awaitableProvisionDefinitions } from "../../core/awaitables/provisionDefinitions"; +import { api } from "../../core/blitzkit/api"; import { useLocale } from "../../hooks/useLocale"; import { GenericTankComponentButton } from "./GenericTankComponentButton"; import type { TankComponentButtonProps } from "./TankComponentButton"; @@ -8,7 +7,7 @@ interface ProvisionButtonProps extends TankComponentButtonProps { provision: number; } -const provisionDefinitions = await awaitableProvisionDefinitions; +const provisionDefinitions = await api.provisionDefinitions(); export function ProvisionButton({ provision, ...props }: ProvisionButtonProps) { const { unwrap } = useLocale(); @@ -16,7 +15,7 @@ export function ProvisionButton({ provision, ...props }: ProvisionButtonProps) { return ( ); diff --git a/packages/website/src/components/ProvisionsManager.tsx b/packages/website/src/components/ProvisionsManager.tsx index 7ede38889..9d61baf15 100644 --- a/packages/website/src/components/ProvisionsManager.tsx +++ b/packages/website/src/components/ProvisionsManager.tsx @@ -1,5 +1,5 @@ import { Flex } from "@radix-ui/themes"; -import { awaitableProvisionDefinitions } from "../core/awaitables/provisionDefinitions"; +import { api } from "../core/blitzkit/api"; import { ProvisionButton } from "./ModuleButtons/ProvisionButton"; interface ProvisionsManagerProps { @@ -9,7 +9,7 @@ interface ProvisionsManagerProps { onChange?: (provisions: number[]) => void; } -const provisionDefinitions = await awaitableProvisionDefinitions; +const provisionDefinitions = await api.provisionDefinitions(); export function ProvisionsManager({ provisions, diff --git a/packages/website/src/components/Tankopedia/CalloutsSection.tsx b/packages/website/src/components/Tankopedia/CalloutsSection.tsx index 4bc97c35c..ac10eaf67 100644 --- a/packages/website/src/components/Tankopedia/CalloutsSection.tsx +++ b/packages/website/src/components/Tankopedia/CalloutsSection.tsx @@ -1,15 +1,16 @@ -import { assertSecret, fetchTankDefinitions } from "@blitzkit/core"; +import { assertSecret } from "@blitzkit/core"; import { MinusCircledIcon } from "@radix-ui/react-icons"; import { Callout, Flex } from "@radix-ui/themes"; import { uniq } from "lodash-es"; import { useEffect } from "react"; +import { api } from "../../core/blitzkit/api"; import { Duel } from "../../stores/duel"; import { TankopediaPersistent } from "../../stores/tankopediaPersistent"; import { AesonPlug } from "../AesonPlug"; import { ExperimentIcon } from "../ExperimentIcon"; import { MAX_RECENTLY_VIEWED } from "../TankSearch/constants"; -const tankDefinitions = await fetchTankDefinitions(); +const tankDefinitions = await api.tankDefinitions(); export function CalloutsSection() { const tank = Duel.use((state) => state.protagonist.tank); diff --git a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/Crew.tsx b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/Crew.tsx index 471b27da0..ff4118528 100644 --- a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/Crew.tsx +++ b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/Crew.tsx @@ -3,7 +3,7 @@ import { literals } from "@blitzkit/i18n"; import { AccessibilityIcon, InfoCircledIcon } from "@radix-ui/react-icons"; import { Flex, Heading, IconButton, Popover, Text } from "@radix-ui/themes"; import { Fragment } from "react/jsx-runtime"; -import { awaitableProvisionDefinitions } from "../../../../../../core/awaitables/provisionDefinitions"; +import { api } from "../../../../../../core/blitzkit/api"; import { useEquipment } from "../../../../../../hooks/useEquipment"; import { useLocale } from "../../../../../../hooks/useLocale"; import { Duel } from "../../../../../../stores/duel"; @@ -11,7 +11,7 @@ import { InfoWithDelta } from "./InfoWithDelta"; import { StatsTableWrapper } from "./StatsTableWrapper"; import type { StatsAcceptorProps } from "./TraverseVisualizer"; -const provisionDefinitions = await awaitableProvisionDefinitions; +const provisionDefinitions = await api.provisionDefinitions(); export function Crew({ stats }: StatsAcceptorProps) { const tank = Duel.use((state) => state.protagonist.tank); diff --git a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/Firepower.tsx b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/Firepower.tsx index 4fc066c22..3e2378d5f 100644 --- a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/Firepower.tsx +++ b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/Firepower.tsx @@ -1,4 +1,4 @@ -import { asset, isExplosive } from "@blitzkit/core"; +import { isExplosive } from "@blitzkit/core"; import { literals } from "@blitzkit/i18n"; import { Flex, Heading, IconButton, Tooltip } from "@radix-ui/themes"; import { useLocale } from "../../../../../../hooks/useLocale"; @@ -62,7 +62,7 @@ export function Firepower({ alt={unwrap(thisShell.name!)} width={16} height={16} - src={asset(`icons/shells/${thisShell.icon}.webp`)} + src={`/api/icons/shells/${thisShell.icon}.webp`} /> diff --git a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/GunFlexibilityVisualizer/components/CanvasContent.tsx b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/GunFlexibilityVisualizer/components/CanvasContent.tsx index b062628bc..2f1d7342c 100644 --- a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/GunFlexibilityVisualizer/components/CanvasContent.tsx +++ b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/GunFlexibilityVisualizer/components/CanvasContent.tsx @@ -1,7 +1,7 @@ import type { QuicklimeEvent } from "quicklime"; import { useEffect, useRef } from "react"; import type { Group } from "three"; -import { awaitableModelDefinitions } from "../../../../../../../../core/awaitables/modelDefinitions"; +import { api } from "../../../../../../../../core/blitzkit/api"; import { modelTransformEvent, type ModelTransformEventData, @@ -9,7 +9,7 @@ import { import { Duel } from "../../../../../../../../stores/duel"; import { ModelChunk } from "./ModelChunk"; -const modelDefinitions = await awaitableModelDefinitions; +const modelDefinitions = await api.modelDefinitions(); export function CanvasContent() { const hullWrapper = useRef(null); diff --git a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/GunFlexibilityVisualizer/components/ModelChunk.tsx b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/GunFlexibilityVisualizer/components/ModelChunk.tsx index 366971625..a32c75cb9 100644 --- a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/GunFlexibilityVisualizer/components/ModelChunk.tsx +++ b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/GunFlexibilityVisualizer/components/ModelChunk.tsx @@ -1,11 +1,11 @@ import { mauveDark } from "@radix-ui/colors"; import { LineBasicMaterial, MeshBasicMaterial } from "three"; -import { awaitableModelDefinitions } from "../../../../../../../../core/awaitables/modelDefinitions"; +import { api } from "../../../../../../../../core/blitzkit/api"; import { jsxTree } from "../../../../../../../../core/blitzkit/jsxTree"; import { useModel } from "../../../../../../../../hooks/useModel"; import { Duel } from "../../../../../../../../stores/duel"; -const modelDefinitions = await awaitableModelDefinitions; +const modelDefinitions = await api.modelDefinitions(); const surfaceMaterial: Record = { gun: new MeshBasicMaterial({ diff --git a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/GunFlexibilityVisualizer/index.tsx b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/GunFlexibilityVisualizer/index.tsx index a278a230a..171c1a73d 100644 --- a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/GunFlexibilityVisualizer/index.tsx +++ b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/GunFlexibilityVisualizer/index.tsx @@ -3,11 +3,11 @@ import { Box, Card, Flex } from "@radix-ui/themes"; import { clamp } from "lodash-es"; import { useRef, useState } from "react"; import { degToRad, radToDeg } from "three/src/math/MathUtils.js"; -import { awaitableModelDefinitions } from "../../../../../../../core/awaitables/modelDefinitions"; import { DEFAULT_PITCH_TRANSITION, applyPitchYawLimits, } from "../../../../../../../core/blitz/applyPitchYawLimits"; +import { api } from "../../../../../../../core/blitzkit/api"; import { hasEquipment } from "../../../../../../../core/blitzkit/hasEquipment"; import { modelTransformEvent } from "../../../../../../../core/blitzkit/modelTransform"; import { Var } from "../../../../../../../core/radix/var"; @@ -20,7 +20,7 @@ import { FlexibilityCanvas } from "./components/FlexibilityCanvas"; const ANGLE_COEFFICIENT = 1 / 10; -const modelDefinition = await awaitableModelDefinitions; +const modelDefinition = await api.modelDefinitions(); function mag(x: number) { return (1 / Math.PI) * Math.atan(ANGLE_COEFFICIENT * x) + 1 / 2; diff --git a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/InfoWithDelta.tsx b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/InfoWithDelta.tsx index f29d6993a..7d910738d 100644 --- a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/InfoWithDelta.tsx +++ b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/InfoWithDelta.tsx @@ -2,11 +2,7 @@ import { createDefaultSkills } from "@blitzkit/core"; import { Flex, Progress, Text } from "@radix-ui/themes"; import { clamp } from "lodash-es"; import { memo, useMemo, type ComponentProps, type ReactNode } from "react"; -import { awaitableEquipmentDefinitions } from "../../../../../../core/awaitables/equipmentDefinitions"; -import { awaitableModelDefinitions } from "../../../../../../core/awaitables/modelDefinitions"; -import { awaitableProvisionDefinitions } from "../../../../../../core/awaitables/provisionDefinitions"; -import { awaitableSkillDefinitions } from "../../../../../../core/awaitables/skillDefinitions"; -import { awaitableTankDefinitions } from "../../../../../../core/awaitables/tankDefinitions"; +import { api } from "../../../../../../core/blitzkit/api"; import { tankCharacteristics, type TankCharacteristics, @@ -41,11 +37,11 @@ const [ modelDefinitions, skillDefinitions, ] = await Promise.all([ - awaitableTankDefinitions, - awaitableProvisionDefinitions, - awaitableEquipmentDefinitions, - awaitableModelDefinitions, - awaitableSkillDefinitions, + api.tankDefinitions(), + api.provisionDefinitions(), + api.equipmentDefinitions(), + api.modelDefinitions(), + api.skillDefinitions(), ]); export const InfoWithDelta = memo( diff --git a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/RicochetVisualizer/components/ShellSwitcher.tsx b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/RicochetVisualizer/components/ShellSwitcher.tsx index 52d3b431d..68667a0a0 100644 --- a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/RicochetVisualizer/components/ShellSwitcher.tsx +++ b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/RicochetVisualizer/components/ShellSwitcher.tsx @@ -1,4 +1,3 @@ -import { asset } from "@blitzkit/core"; import { Flex, IconButton, Tooltip } from "@radix-ui/themes"; import { useLocale } from "../../../../../../../../hooks/useLocale"; import { Duel } from "../../../../../../../../stores/duel"; @@ -38,7 +37,7 @@ export function ShellSwitcher() { {unwrap(thisShell.name!)} diff --git a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/RicochetVisualizer/index.tsx b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/RicochetVisualizer/index.tsx index a688de0d7..52deb82c8 100644 --- a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/RicochetVisualizer/index.tsx +++ b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/RicochetVisualizer/index.tsx @@ -1,4 +1,4 @@ -import { asset, isExplosive } from "@blitzkit/core"; +import { isExplosive } from "@blitzkit/core"; import { literals } from "@blitzkit/i18n"; import { Box, Flex, Text } from "@radix-ui/themes"; import { useRef, useState } from "react"; @@ -124,7 +124,7 @@ export function RicochetVisualizer({ stats }: StatsAcceptorProps) { /> state.protagonist); const consumables = Duel.use((state) => state.protagonist.consumables); const consumablesList = Object.values( - consumableDefinitions.consumables + consumableDefinitions.consumables, ).filter((consumable) => checkConsumableProvisionInclusivity( consumable, protagonist.tank, - protagonist.gun - ) + protagonist.gun, + ), ); const cooldownBooster = Duel.use( - (state) => state.protagonist.cooldownBooster + (state) => state.protagonist.cooldownBooster, ); const hasConsumableDeliverySystem = useEquipment(118); const hasHighEndConsumables = useEquipment(101); diff --git a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Equalizer.tsx b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Equalizer.tsx index 1ec26568a..6940f664b 100644 --- a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Equalizer.tsx +++ b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Equalizer.tsx @@ -1,15 +1,4 @@ -import { asset } from "@blitzkit/core"; -import { InfoCircledIcon } from "@radix-ui/react-icons"; -import { - Badge, - Box, - Flex, - Heading, - Link, - Popover, - Switch, - Text, -} from "@radix-ui/themes"; +import { Badge, Box, Flex, Heading, Switch, Text } from "@radix-ui/themes"; import { useLocale } from "../../../../hooks/useLocale"; import { Duel } from "../../../../stores/duel"; import { Tankopedia } from "../../../../stores/tankopedia"; @@ -44,7 +33,7 @@ export function Equalizer() { style={{ cursor: "pointer", borderRadius: "var(--radius-3)", - backgroundImage: `url(${asset("icons/game_mode_banners/45.webp")})`, + backgroundImage: "url(/api/icons/game_mode_banners/45.webp)", backgroundSize: "cover", backgroundPosition: "center", overflow: "hidden", diff --git a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Equipment.tsx b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Equipment.tsx index 69a428b3f..17871441e 100644 --- a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Equipment.tsx +++ b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Equipment.tsx @@ -1,18 +1,18 @@ import { Button, Flex, Heading } from "@radix-ui/themes"; -import { awaitableEquipmentDefinitions } from "../../../../core/awaitables/equipmentDefinitions"; +import { api } from "../../../../core/blitzkit/api"; import { useLocale } from "../../../../hooks/useLocale"; import { Duel } from "../../../../stores/duel"; import { EquipmentManager } from "../../../EquipmentManager"; import { ConfigurationChildWrapper } from "./ConfigurationChildWrapper"; -const equipmentDefinitions = await awaitableEquipmentDefinitions; +const equipmentDefinitions = await api.equipmentDefinitions(); export function Equipment() { const protagonist = Duel.use((state) => state.protagonist); const equipmentPreset = equipmentDefinitions.presets[protagonist.tank.equipment_preset]; const equipmentMatrix = Duel.use( - (state) => state.protagonist.equipmentMatrix + (state) => state.protagonist.equipmentMatrix, ); const { strings } = useLocale(); diff --git a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Miscellaneous.tsx b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Miscellaneous.tsx index 16423a884..783b36646 100644 --- a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Miscellaneous.tsx +++ b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Miscellaneous.tsx @@ -1,4 +1,3 @@ -import { asset } from "@blitzkit/core"; import { Flex, Heading } from "@radix-ui/themes"; import { useLocale } from "../../../../hooks/useLocale"; import { Duel } from "../../../../stores/duel"; @@ -8,7 +7,7 @@ import { ConfigurationChildWrapper } from "./ConfigurationChildWrapper"; export function Miscellaneous() { const camouflage = Duel.use((state) => state.protagonist.camouflage); const cooldownBooster = Duel.use( - (state) => state.protagonist.cooldownBooster + (state) => state.protagonist.cooldownBooster, ); const { tank } = Duel.use((state) => state.protagonist); const { strings } = useLocale(); @@ -22,7 +21,7 @@ export function Miscellaneous() { {!tank.fixed_camouflage && ( )} 0} banner={ cooldownBooster === 0 diff --git a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Modules.tsx b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Modules.tsx index a290cf245..ef2e7fb2a 100644 --- a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Modules.tsx +++ b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Modules.tsx @@ -1,5 +1,4 @@ import { - asset, EngineDefinition, formatCompact, GunDefinition, @@ -20,7 +19,7 @@ import { Text, Tooltip, } from "@radix-ui/themes"; -import { awaitableTankDefinitions } from "../../../../core/awaitables/tankDefinitions"; +import { api } from "../../../../core/blitzkit/api"; import { useLocale } from "../../../../hooks/useLocale"; import { Duel } from "../../../../stores/duel"; import { LinkI18n } from "../../../LinkI18n"; @@ -111,7 +110,7 @@ function ModuleButton({ {unlock.cost!.type}{node}; } -const tankDefinitions = await awaitableTankDefinitions; +const tankDefinitions = await api.tankDefinitions(); export function Modules() { const tank = Duel.use((state) => state.protagonist.tank); diff --git a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Provisions.tsx b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Provisions.tsx index 258b23141..0be27f492 100644 --- a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Provisions.tsx +++ b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Provisions.tsx @@ -1,12 +1,12 @@ import { availableProvisions } from "@blitzkit/core"; import { Button, Flex, Heading } from "@radix-ui/themes"; -import { awaitableProvisionDefinitions } from "../../../../core/awaitables/provisionDefinitions"; +import { api } from "../../../../core/blitzkit/api"; import { useLocale } from "../../../../hooks/useLocale"; import { Duel } from "../../../../stores/duel"; import { ProvisionsManager } from "../../../ProvisionsManager"; import { ConfigurationChildWrapper } from "./ConfigurationChildWrapper"; -const provisionDefinitions = await awaitableProvisionDefinitions; +const provisionDefinitions = await api.provisionDefinitions(); export function Provisions() { const { tank, gun } = Duel.use((state) => state.protagonist); diff --git a/packages/website/src/components/Tankopedia/GameModeSection.tsx b/packages/website/src/components/Tankopedia/GameModeSection.tsx index a43a3fb94..3aadfb03e 100644 --- a/packages/website/src/components/Tankopedia/GameModeSection.tsx +++ b/packages/website/src/components/Tankopedia/GameModeSection.tsx @@ -1,16 +1,13 @@ -import { asset } from "@blitzkit/core"; import { Box, Flex, Heading, Text } from "@radix-ui/themes"; -import { awaitableConsumableDefinitions } from "../../core/awaitables/consumableDefinitions"; -import { awaitableGameDefinitions } from "../../core/awaitables/gameDefinitions"; -import { awaitableProvisionDefinitions } from "../../core/awaitables/provisionDefinitions"; +import { api } from "../../core/blitzkit/api"; import { useLocale } from "../../hooks/useLocale"; import { Duel } from "../../stores/duel"; const [gameDefinitions, consumableDefinitions, provisionDefinitions] = await Promise.all([ - awaitableGameDefinitions, - awaitableConsumableDefinitions, - awaitableProvisionDefinitions, + api.gameDefinitions(), + api.consumableDefinitions(), + api.provisionDefinitions(), ]); export function GameModeSection() { @@ -40,9 +37,7 @@ export function GameModeSection() { direction="column" style={{ borderRadius: "var(--radius-3)", - background: `url(${asset( - `icons/game_mode_banners/${id}.webp`, - )})`, + background: `url(/api/icons/game_mode_banners/${id}.webp)`, backgroundSize: "cover", backgroundPosition: "center", }} @@ -50,9 +45,7 @@ export function GameModeSection() { {unwrap(provisions.name!)} @@ -108,7 +101,7 @@ export function GameModeSection() { height: "1.5em", objectFit: "contain", }} - src={asset(`icons/consumables/${id}.webp`)} + src={`/api/icons/consumables/${id}.webp`} alt={unwrap(consumable.name!)} /> {unwrap(consumable.name!)} diff --git a/packages/website/src/components/Tankopedia/HeroSection/components/Options/index.tsx b/packages/website/src/components/Tankopedia/HeroSection/components/Options/index.tsx index 10841eeda..f3c2310cd 100644 --- a/packages/website/src/components/Tankopedia/HeroSection/components/Options/index.tsx +++ b/packages/website/src/components/Tankopedia/HeroSection/components/Options/index.tsx @@ -1,5 +1,4 @@ import { - asset, resolvePenetrationCoefficient, TIER_ROMAN_NUMERALS, uniqueGuns, @@ -140,7 +139,7 @@ export function Options({ thicknessRange, canvas, skeleton }: OptionsProps) { Antagonist Gun {unwrap(thisShell.name!)} Calibrated Shells Enhanced Armor = { const inspectModeInitialPosition = new Vector3(-8, 2, -13); -const modelDefinitions = await awaitableModelDefinitions; +const modelDefinitions = await api.modelDefinitions(); interface ControlsProps { autoRotate?: boolean; diff --git a/packages/website/src/components/Tankopedia/HeroSection/components/TankSandbox/components/InitialAligner.tsx b/packages/website/src/components/Tankopedia/HeroSection/components/TankSandbox/components/InitialAligner.tsx index 26eb65286..351f2d19b 100644 --- a/packages/website/src/components/Tankopedia/HeroSection/components/TankSandbox/components/InitialAligner.tsx +++ b/packages/website/src/components/Tankopedia/HeroSection/components/TankSandbox/components/InitialAligner.tsx @@ -1,11 +1,11 @@ import { useEffect } from "react"; import { degToRad } from "three/src/math/MathUtils.js"; -import { awaitableModelDefinitions } from "../../../../../../core/awaitables/modelDefinitions"; import { applyPitchYawLimits } from "../../../../../../core/blitz/applyPitchYawLimits"; +import { api } from "../../../../../../core/blitzkit/api"; import { modelTransformEvent } from "../../../../../../core/blitzkit/modelTransform"; import { Duel } from "../../../../../../stores/duel"; -const modelDefinitions = await awaitableModelDefinitions; +const modelDefinitions = await api.modelDefinitions(); export function InitialAligner() { const tank = Duel.use((state) => state.protagonist.tank); diff --git a/packages/website/src/components/Tankopedia/HeroSection/index.tsx b/packages/website/src/components/Tankopedia/HeroSection/index.tsx index af403e531..11f13d58e 100644 --- a/packages/website/src/components/Tankopedia/HeroSection/index.tsx +++ b/packages/website/src/components/Tankopedia/HeroSection/index.tsx @@ -1,7 +1,7 @@ import { Box, Flex } from "@radix-ui/themes"; import { times } from "lodash-es"; import { useEffect, useMemo, useRef } from "react"; -import { awaitableTankDefinitions } from "../../../core/awaitables/tankDefinitions"; +import { api } from "../../../core/blitzkit/api"; import { defaultEqualizer } from "../../../core/blitzkit/tankToDuelMember"; import { useFullScreen } from "../../../hooks/useFullScreen"; import { Duel } from "../../../stores/duel"; @@ -12,7 +12,7 @@ import { Options } from "./components/Options"; import { TankSandbox } from "./components/TankSandbox"; import { Title } from "./components/TankSandbox/Title"; -const tankDefinitions = await awaitableTankDefinitions; +const tankDefinitions = await api.tankDefinitions(); export function HeroSection({ skeleton }: MaybeSkeletonComponentProps) { const equalize = Duel.use((state) => state.equalize); diff --git a/packages/website/src/components/Tankopedia/MetaSection/index.tsx b/packages/website/src/components/Tankopedia/MetaSection/index.tsx index d795d1926..69f72f40d 100644 --- a/packages/website/src/components/Tankopedia/MetaSection/index.tsx +++ b/packages/website/src/components/Tankopedia/MetaSection/index.tsx @@ -1,9 +1,4 @@ -import { - asset, - TankPriceType, - TankType, - TIER_ROMAN_NUMERALS, -} from "@blitzkit/core"; +import { TankPriceType, TankType, TIER_ROMAN_NUMERALS } from "@blitzkit/core"; import { Box, Flex } from "@radix-ui/themes"; import { Var } from "../../../core/radix/var"; import { useLocale } from "../../../hooks/useLocale"; @@ -40,7 +35,7 @@ export function MetaSection() { > { strings.common.nations[ @@ -135,7 +130,7 @@ export function MetaSection() { gold @@ -152,14 +147,12 @@ export function MetaSection() { {TankPriceType[protagonist.price!.type]} @@ -169,14 +162,12 @@ export function MetaSection() { {TankPriceType[protagonist.price!.type]} @@ -192,7 +183,7 @@ export function MetaSection() { xp diff --git a/packages/website/src/components/Tankopedia/TechTreeSection/components/Node.tsx b/packages/website/src/components/Tankopedia/TechTreeSection/components/Node.tsx index 9a6ceb7f7..78c06a86a 100644 --- a/packages/website/src/components/Tankopedia/TechTreeSection/components/Node.tsx +++ b/packages/website/src/components/Tankopedia/TechTreeSection/components/Node.tsx @@ -1,8 +1,8 @@ -import { asset, formatCompact, TIER_ROMAN_NUMERALS } from "@blitzkit/core"; +import { formatCompact, TIER_ROMAN_NUMERALS } from "@blitzkit/core"; import { literals } from "@blitzkit/i18n/src/literals"; import { Box, Flex, Skeleton, Text } from "@radix-ui/themes"; import { awaitableAverageDefinitions } from "../../../../core/awaitables/averageDefinitions"; -import { awaitableTankDefinitions } from "../../../../core/awaitables/tankDefinitions"; +import { api } from "../../../../core/blitzkit/api"; import { useLocale } from "../../../../hooks/useLocale"; import { Tankopedia } from "../../../../stores/tankopedia"; import type { MaybeSkeletonComponentProps } from "../../../../types/maybeSkeletonComponentProps"; @@ -15,7 +15,7 @@ type NodeProps = MaybeSkeletonComponentProps & { }; const [tankDefinitions, averageDefinitions] = await Promise.all([ - awaitableTankDefinitions, + api.tankDefinitions(), awaitableAverageDefinitions, ]); @@ -58,7 +58,7 @@ export function Node({ id, highlight, nextIds, skeleton }: NodeProps) { mx={highlight ? "2" : "0"} style={{ background: highlight - ? `url(${asset(`flags/fade_small/${tank.nation}.webp`)})` + ? `url(${`/api/flags/fade/${tank.nation}.webp`})` : undefined, backgroundPosition: "center", backgroundSize: "cover", diff --git a/packages/website/src/components/Tankopedia/TechTreeSection/index.tsx b/packages/website/src/components/Tankopedia/TechTreeSection/index.tsx index 8c7a906f2..32bc47533 100644 --- a/packages/website/src/components/Tankopedia/TechTreeSection/index.tsx +++ b/packages/website/src/components/Tankopedia/TechTreeSection/index.tsx @@ -1,9 +1,9 @@ -import { asset, TankType } from "@blitzkit/core"; +import { TankType } from "@blitzkit/core"; import { literals } from "@blitzkit/i18n/src/literals"; import { CaretLeftIcon, CaretRightIcon, PlusIcon } from "@radix-ui/react-icons"; import { Flex, Heading, IconButton, ScrollArea, Text } from "@radix-ui/themes"; import { Fragment, useEffect, useMemo, useRef, useState } from "react"; -import { awaitableTankDefinitions } from "../../../core/awaitables/tankDefinitions"; +import { api } from "../../../core/blitzkit/api"; import { useLocale } from "../../../hooks/useLocale"; import { Duel } from "../../../stores/duel"; import { Tankopedia } from "../../../stores/tankopedia"; @@ -13,7 +13,7 @@ import { Node } from "./components/Node"; type Line = number[]; -const tankDefinitions = await awaitableTankDefinitions; +const tankDefinitions = await api.tankDefinitions(); export const XP_MULTIPLIERS = [1, 2, 3, 4, 5, 10]; @@ -105,7 +105,7 @@ export function TechTreeSection({ skeleton }: MaybeSkeletonComponentProps) { XP state[antagonist ? 'antagonist' : 'protagonist']!, + (state) => state[antagonist ? "antagonist" : "protagonist"]!, ); const preset = equipmentDefinitions.presets[member.tank.equipment_preset]; const equipmentMatrix = Duel.use( (state) => - state[antagonist ? 'antagonist' : 'protagonist']!.equipmentMatrix, + state[antagonist ? "antagonist" : "protagonist"]!.equipmentMatrix, ); const value = useMemo(() => { return preset.slots.some((slot, index) => { @@ -21,7 +21,7 @@ export function useEquipment(id: number, antagonist = false) { if (choice === 0) return false; - const equipped = slot[choice === -1 ? 'left' : 'right']; + const equipped = slot[choice === -1 ? "left" : "right"]; return equipped === id; }); diff --git a/packages/website/src/pages/[...chunk_default]/[...locale]/tanks/[slug]/_index.tsx b/packages/website/src/pages/[...chunk_default]/[...locale]/tanks/[slug]/_index.tsx index 78ed0623c..4b24fe18e 100644 --- a/packages/website/src/pages/[...chunk_default]/[...locale]/tanks/[slug]/_index.tsx +++ b/packages/website/src/pages/[...chunk_default]/[...locale]/tanks/[slug]/_index.tsx @@ -1,23 +1,22 @@ import { TankType } from "@blitzkit/core"; -import { PageWrapper } from "../../../../components/PageWrapper"; -import { CalloutsSection } from "../../../../components/Tankopedia/CalloutsSection"; -import { CharacteristicsSection } from "../../../../components/Tankopedia/CharacteristicsSection"; -import { GameModeSection } from "../../../../components/Tankopedia/GameModeSection"; -import { GuideSection } from "../../../../components/Tankopedia/GuideSection"; -import { HeroSection } from "../../../../components/Tankopedia/HeroSection"; -import { MetaSection } from "../../../../components/Tankopedia/MetaSection"; -import { TechTreeSection } from "../../../../components/Tankopedia/TechTreeSection"; -import { VideoSection } from "../../../../components/Tankopedia/VideoSection"; -import { awaitableModelDefinitions } from "../../../../core/awaitables/modelDefinitions"; -import { awaitableTankDefinitions } from "../../../../core/awaitables/tankDefinitions"; +import { PageWrapper } from "../../../../../components/PageWrapper"; +import { CalloutsSection } from "../../../../../components/Tankopedia/CalloutsSection"; +import { CharacteristicsSection } from "../../../../../components/Tankopedia/CharacteristicsSection"; +import { GameModeSection } from "../../../../../components/Tankopedia/GameModeSection"; +import { GuideSection } from "../../../../../components/Tankopedia/GuideSection"; +import { HeroSection } from "../../../../../components/Tankopedia/HeroSection"; +import { MetaSection } from "../../../../../components/Tankopedia/MetaSection"; +import { TechTreeSection } from "../../../../../components/Tankopedia/TechTreeSection"; +import { VideoSection } from "../../../../../components/Tankopedia/VideoSection"; +import { api } from "../../../../../core/blitzkit/api"; import { LocaleProvider, type LocaleAcceptorProps, -} from "../../../../hooks/useLocale"; -import { Duel } from "../../../../stores/duel"; -import { Tankopedia } from "../../../../stores/tankopedia"; -import type { MaybeSkeletonComponentProps } from "../../../../types/maybeSkeletonComponentProps"; -import type { TankGuide } from "../../../../types/tankGuide"; +} from "../../../../../hooks/useLocale"; +import { Duel } from "../../../../../stores/duel"; +import { Tankopedia } from "../../../../../stores/tankopedia"; +import type { MaybeSkeletonComponentProps } from "../../../../../types/maybeSkeletonComponentProps"; +import type { TankGuide } from "../../../../../types/tankGuide"; type PageProps = MaybeSkeletonComponentProps & LocaleAcceptorProps & { @@ -26,8 +25,8 @@ type PageProps = MaybeSkeletonComponentProps & }; const [tankDefinitions, modelDefinitions] = await Promise.all([ - awaitableTankDefinitions, - awaitableModelDefinitions, + api.tankDefinitions(), + api.modelDefinitions(), ]); export function Page({ id, skeleton, locale, guide }: PageProps) { diff --git a/packages/website/src/pages/[...chunk_default]/[...locale]/tanks/[slug]/index.astro b/packages/website/src/pages/[...chunk_default]/[...locale]/tanks/[slug]/index.astro index 4933da71d..9f6193fb3 100644 --- a/packages/website/src/pages/[...chunk_default]/[...locale]/tanks/[slug]/index.astro +++ b/packages/website/src/pages/[...chunk_default]/[...locale]/tanks/[slug]/index.astro @@ -2,30 +2,25 @@ import { AstroSeo } from "@astrolib/seo"; import { assertSecret, - asset, createDefaultProvisions, createDefaultSkills, - fetchEquipmentDefinitions, - fetchModelDefinitions, - fetchProvisionDefinitions, - fetchSkillDefinitions, - fetchTankDefinitions, TIER_ROMAN_NUMERALS, } from "@blitzkit/core"; import { unwrapper } from "@blitzkit/i18n"; import { literals } from "@blitzkit/i18n/src/literals"; import type { GetStaticPaths } from "astro"; import { load } from "cheerio"; -import { tankCharacteristics } from "../../../../core/blitzkit/tankCharacteristics"; -import { getStrings } from "../../../../core/i18n/getStrings"; -import BaseLayout from "../../../../layouts/BaseLayout.astro"; -import { genericDefaultEquipmentMatrix } from "../../../../stores/duel/constants"; -import type { TankGuide } from "../../../../types/tankGuide"; +import { api } from "../../../../../core/blitzkit/api"; +import { tankCharacteristics } from "../../../../../core/blitzkit/tankCharacteristics"; +import { getStrings } from "../../../../../core/i18n/getStrings"; +import BaseLayout from "../../../../../layouts/BaseLayout.astro"; +import { genericDefaultEquipmentMatrix } from "../../../../../stores/duel/constants"; +import type { TankGuide } from "../../../../../types/tankGuide"; import { getStaticPaths as parentGetStaticPaths } from "../index.astro"; import { Page } from "./_index"; export const getStaticPaths = (async () => { - const tankDefinitions = await fetchTankDefinitions(); + const tankDefinitions = await api.tankDefinitions(); const parentPaths = parentGetStaticPaths(); return Object.values(tankDefinitions.tanks) @@ -40,11 +35,11 @@ export const getStaticPaths = (async () => { const { id, locale } = Astro.props; const strings = getStrings(locale); -const tankDefinitions = await fetchTankDefinitions(); -const skillDefinitions = await fetchSkillDefinitions(); -const provisionDefinitions = await fetchProvisionDefinitions(); -const equipmentDefinitions = await fetchEquipmentDefinitions(); -const tankModelDefinitions = await fetchModelDefinitions(); +const tankDefinitions = await api.tankDefinitions(); +const skillDefinitions = await api.skillDefinitions(); +const provisionDefinitions = await api.provisionDefinitions(); +const equipmentDefinitions = await api.equipmentDefinitions(); +const tankModelDefinitions = await api.modelDefinitions(); const tank = tankDefinitions.tanks[id]; const tankModelDefinition = tankModelDefinitions.models[tank.id]; @@ -61,7 +56,7 @@ const title = literals(strings.website.tools.tankopedia.tank_seo_title, { }); const url = import.meta.env.SITE + Astro.url.pathname; -const icon = asset(`icons/tanks/big/${id}.webp`); +const icon = `/api/tanks/${id}/icons/big.webp`; const turret = tank.turrets.at(-1)!; const gun = turret.guns.at(-1)!; const shell = gun.shells[0]; diff --git a/packages/website/src/stores/duel/index.ts b/packages/website/src/stores/duel/index.ts index b8a904161..fef1c2463 100644 --- a/packages/website/src/stores/duel/index.ts +++ b/packages/website/src/stores/duel/index.ts @@ -8,7 +8,7 @@ import { type TurretDefinition, } from "@blitzkit/core"; import { Varuna } from "varuna"; -import { awaitableProvisionDefinitions } from "../../core/awaitables/provisionDefinitions"; +import { api } from "../../core/blitzkit/api"; import { tankToDuelMember } from "../../core/blitzkit/tankToDuelMember"; type EquipmentMatrixItem = -1 | 0 | 1; @@ -44,7 +44,7 @@ export interface DuelStore { equalize: boolean; } -const provisionDefinitions = await awaitableProvisionDefinitions; +const provisionDefinitions = await api.provisionDefinitions(); export const Duel = new Varuna< DuelStore, diff --git a/packages/website/src/stores/tankopedia.ts b/packages/website/src/stores/tankopedia.ts index d5f54b26c..d2eb8a066 100644 --- a/packages/website/src/stores/tankopedia.ts +++ b/packages/website/src/stores/tankopedia.ts @@ -8,7 +8,7 @@ import { Varuna } from "varuna"; import type { ArmorType } from "../components/Armor/components/SpacedArmorScene"; import type { ExternalModuleVariant } from "../components/Armor/components/SpacedArmorSceneComponent"; import type { XP_MULTIPLIERS } from "../components/Tankopedia/TechTreeSection"; -import { awaitableSkillDefinitions } from "../core/awaitables/skillDefinitions"; +import { api } from "../core/blitzkit/api"; import { TankopediaDisplay } from "./tankopediaPersistent/constants"; export interface ShotLayerBase { @@ -105,7 +105,7 @@ interface Tankopedia { statSearch?: string; } -const skillDefinitions = await awaitableSkillDefinitions; +const skillDefinitions = await api.skillDefinitions(); export const Tankopedia = new Varuna((model) => ({ disturbed: false,