From 5f737d940d579fd6d876aaa17dec4a81fc407cc8 Mon Sep 17 00:00:00 2001 From: tresabhi <43380238+tresabhi@users.noreply.github.com> Date: Sun, 30 Aug 2026 14:26:08 -0500 Subject: [PATCH] rename methods --- bun.lock | 3 + packages/core/src/blitzkit/api/base.ts | 25 ++-- packages/core/src/blitzkit/api/client.ts | 20 +-- packages/core/src/blitzkit/api/dynamic.ts | 21 +++ packages/core/src/blitzkit/api/index.ts | 4 + .../core/src/blitzkit/api/server/0_base.ts | 10 ++ ...10_galleryDefinitions.ts => 10_avatars.ts} | 7 +- .../{1_tankDefinitions.ts => 1_tanks.ts} | 2 +- ...ouflageDefinitions.ts => 2_camouflages.ts} | 4 +- .../{3_modelDefinitions.ts => 3_models.ts} | 24 ++-- .../server/{4_mapDefinitions.ts => 4_maps.ts} | 4 +- ...quipmentDefinitions.ts => 5_equipments.ts} | 4 +- ...sumableDefinitions.ts => 6_consumables.ts} | 4 +- ...rovisionDefinitions.ts => 7_provisions.ts} | 4 +- .../{8_skillDefinitions.ts => 8_skills.ts} | 4 +- .../{9_gameDefinitions.ts => 9_game.ts} | 4 +- .../core/src/blitzkit/api/server/index.ts | 2 +- .../src/blitzkit/averageDefinitions/index.ts | 2 +- .../src/blitzkit/discoveredIdDefinitions.ts | 2 +- packages/core/src/blitzkit/index.ts | 2 + packages/core/src/blitzkit/tankNames.ts | 4 +- packages/core/src/blitzkit/vfs/index.ts | 5 + packages/scripts/src/reviews.ts | 10 +- packages/website/package.json | 1 + .../{Gallery/Card.tsx => AvatarCard.tsx} | 28 ++-- .../{Gallery => Avatars}/Search.tsx | 15 +-- .../components/AvatarsList/index.module.css | 0 .../List.tsx => AvatarsList/index.tsx} | 17 +-- .../src/components/Code/index.module.css | 16 +++ .../website/src/components/Code/index.tsx | 18 +++ .../src/components/Compare/CompareTable.tsx | 8 +- .../src/components/Compare/Controls.tsx | 2 +- .../src/components/Compare/TankControl.tsx | 2 +- .../src/components/CrewSkillManager.tsx | 2 +- .../src/components/Embeds/breakdown.tsx | 2 +- .../components/ErrorWrapper/index.module.css | 55 ++++++++ .../src/components/ErrorWrapper/index.tsx | 84 ++++++++++++ packages/website/src/components/Footer.astro | 2 +- .../src/components/GuessBackground/index.tsx | 4 +- packages/website/src/components/Guesser.tsx | 2 +- .../src/components/HomePageHotTanks.tsx | 2 +- .../MixerScene/components/Model.tsx | 2 +- .../ModuleButtons/ConsumableButton.tsx | 2 +- .../ModuleButtons/EquipmentButton.tsx | 2 +- .../ModuleButtons/ProvisionButton.tsx | 2 +- .../src/components/Performance/Tanks.tsx | 2 +- .../src/components/PlaylistGenerator.tsx | 2 +- .../src/components/PlaylistTankEntry.tsx | 2 +- .../src/components/ProvisionsManager.tsx | 2 +- .../components/RecentlyViewedTanks/index.tsx | 2 +- .../website/src/components/TankCard/index.tsx | 2 +- .../components/TankSearch/components/Card.tsx | 2 +- .../src/components/TankSearch/index.tsx | 6 +- .../components/TankSearchFilters/index.tsx | 30 ++--- .../components/Tankopedia/CalloutsSection.tsx | 2 +- .../Characteristics/components/Crew.tsx | 2 +- .../components/CanvasContent.tsx | 2 +- .../components/ModelChunk.tsx | 2 +- .../GunFlexibilityVisualizer/index.tsx | 2 +- .../components/InfoWithDelta.tsx | 10 +- .../components/Characteristics/index.tsx | 4 +- .../components/Consumables.tsx | 2 +- .../components/Equipment.tsx | 2 +- .../components/Modules.tsx | 2 +- .../components/Provisions.tsx | 2 +- .../components/Tankopedia/GameModeSection.tsx | 6 +- .../TankSandbox/components/Control.tsx | 2 +- .../TankSandbox/components/InitialAligner.tsx | 2 +- .../Tankopedia/HeroSection/index.tsx | 2 +- .../TechTreeSection/components/Node.tsx | 2 +- .../Tankopedia/TechTreeSection/index.tsx | 2 +- .../src/components/TierList/Row/index.tsx | 2 +- .../website/src/components/TierList/Tiles.tsx | 6 +- .../src/components/TierList/URLManager.tsx | 2 +- packages/website/src/config/socials.ts | 1 + .../src/core/awaitables/averageDefinitions.ts | 4 +- .../awaitables/discoveredIdsDefinitions.ts | 5 +- packages/website/src/core/blitzkit/api.ts | 22 +-- .../website/src/core/blitzkit/curateMixer.ts | 4 +- .../website/src/core/blitzkit/filterTank.ts | 6 +- .../src/core/blitzkit/generatePlaylist.ts | 2 +- .../website/src/core/blitzkit/hasEquipment.ts | 2 +- .../website/src/hocs/withErrorWrapper.tsx | 14 ++ packages/website/src/hocs/withLocale.tsx | 18 +++ packages/website/src/hooks/useAwait.ts | 19 +++ packages/website/src/hooks/useEccentricity.ts | 2 +- packages/website/src/hooks/useEquipment.ts | 2 +- .../website/src/hooks/useEquipmentPreset.ts | 2 +- .../definitions/camouflage.pb.ts | 2 +- .../definitions/consumables.pb.ts | 2 +- .../definitions/equipment.pb.ts | 2 +- .../[...chunk_api]/definitions/gallery.pb.ts | 2 +- .../[...chunk_api]/definitions/game.pb.ts | 2 +- .../[...chunk_api]/definitions/maps.pb.ts | 2 +- .../[...chunk_api]/definitions/models.pb.ts | 2 +- .../definitions/provisions.pb.ts | 2 +- .../[...chunk_api]/definitions/skills.pb.ts | 2 +- .../[...chunk_api]/definitions/tanks.pb.ts | 2 +- .../pages/[...chunk_api]/tanks/[id]/_index.ts | 2 +- .../[...locale]/avatars/_index.tsx | 13 +- .../[...locale]/avatars/index.astro | 19 ++- .../[...locale]/compare/_index.tsx | 10 +- .../[...locale]/guess/_index.tsx | 4 +- .../[...locale]/mixer/_index.tsx | 6 +- .../[...locale]/session/_index.tsx | 2 +- .../tanks/[slug]/_index.module.css | 23 ++++ .../[...locale]/tanks/[slug]/_index.tsx | 92 ++++++------- .../[...locale]/tanks/[slug]/index.astro | 127 ++---------------- .../tools/tankopedia/[id]/index.astro | 4 +- packages/website/src/stores/duel/index.ts | 2 +- packages/website/src/stores/tankopedia.ts | 2 +- 111 files changed, 563 insertions(+), 413 deletions(-) create mode 100644 packages/core/src/blitzkit/api/dynamic.ts create mode 100644 packages/core/src/blitzkit/api/index.ts rename packages/core/src/blitzkit/api/server/{10_galleryDefinitions.ts => 10_avatars.ts} (90%) rename packages/core/src/blitzkit/api/server/{1_tankDefinitions.ts => 1_tanks.ts} (99%) rename packages/core/src/blitzkit/api/server/{2_camouflageDefinitions.ts => 2_camouflages.ts} (92%) rename packages/core/src/blitzkit/api/server/{3_modelDefinitions.ts => 3_models.ts} (94%) rename packages/core/src/blitzkit/api/server/{4_mapDefinitions.ts => 4_maps.ts} (84%) rename packages/core/src/blitzkit/api/server/{5_equipmentDefinitions.ts => 5_equipments.ts} (93%) rename packages/core/src/blitzkit/api/server/{6_consumableDefinitions.ts => 6_consumables.ts} (97%) rename packages/core/src/blitzkit/api/server/{7_provisionDefinitions.ts => 7_provisions.ts} (97%) rename packages/core/src/blitzkit/api/server/{8_skillDefinitions.ts => 8_skills.ts} (86%) rename packages/core/src/blitzkit/api/server/{9_gameDefinitions.ts => 9_game.ts} (95%) create mode 100644 packages/core/src/blitzkit/vfs/index.ts rename packages/website/src/components/{Gallery/Card.tsx => AvatarCard.tsx} (78%) rename packages/website/src/components/{Gallery => Avatars}/Search.tsx (67%) create mode 100644 packages/website/src/components/AvatarsList/index.module.css rename packages/website/src/components/{Gallery/List.tsx => AvatarsList/index.tsx} (82%) create mode 100644 packages/website/src/components/Code/index.module.css create mode 100644 packages/website/src/components/Code/index.tsx create mode 100644 packages/website/src/components/ErrorWrapper/index.module.css create mode 100644 packages/website/src/components/ErrorWrapper/index.tsx create mode 100644 packages/website/src/config/socials.ts create mode 100644 packages/website/src/hocs/withErrorWrapper.tsx create mode 100644 packages/website/src/hocs/withLocale.tsx create mode 100644 packages/website/src/hooks/useAwait.ts create mode 100644 packages/website/src/pages/[...chunk_default]/[...locale]/tanks/[slug]/_index.module.css diff --git a/bun.lock b/bun.lock index 97f3ae85b..fc48650a2 100644 --- a/bun.lock +++ b/bun.lock @@ -135,6 +135,7 @@ "radix-ui": "^1.6.7", "react": "^19.2.4", "react-dom": "^19.2.4", + "react-error-boundary": "^6.1.3", "react-promise-suspense": "^0.3.4", "three": "^0.180.0", "three-stdlib": "^2.36.0", @@ -2009,6 +2010,8 @@ "react-dom": ["react-dom@19.2.4", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.4" } }, "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ=="], + "react-error-boundary": ["react-error-boundary@6.1.3", "", { "peerDependencies": { "@types/react": "^18.0.0 || ^19.0.0", "react": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-GnSKpCohFi2nQmJCWwP8O8wub7zexlePvpsejvQr35vS5RTouS1+utTNOmyc540yw5vyOXnSL1rBWsCQDmkyUA=="], + "react-promise-suspense": ["react-promise-suspense@0.3.4", "", { "dependencies": { "fast-deep-equal": "^2.0.1" } }, "sha512-I42jl7L3Ze6kZaq+7zXWSunBa3b1on5yfvUW6Eo/3fFOj6dZ5Bqmcd264nJbTK/gn1HjjILAjSwnZbV4RpSaNQ=="], "react-reconciler": ["react-reconciler@0.31.0", "", { "dependencies": { "scheduler": "^0.25.0" }, "peerDependencies": { "react": "^19.0.0" } }, "sha512-7Ob7Z+URmesIsIVRjnLoDGwBEG/tVitidU0nMsqX/eeJaLY89RISO/10ERe0MqmzuKUUB1rmY+h1itMbUHg9BQ=="], diff --git a/packages/core/src/blitzkit/api/base.ts b/packages/core/src/blitzkit/api/base.ts index 92038adc6..a51ba18e7 100644 --- a/packages/core/src/blitzkit/api/base.ts +++ b/packages/core/src/blitzkit/api/base.ts @@ -12,14 +12,19 @@ import { } from "@blitzkit/core"; export abstract class BlitzKitAPI { - abstract skillDefinitions(): Promise; - abstract provisionDefinitions(): Promise; - abstract consumableDefinitions(): Promise; - abstract equipmentDefinitions(): Promise; - abstract mapDefinitions(): Promise; - abstract modelDefinitions(): Promise; - abstract camouflageDefinitions(): Promise; - abstract tankDefinitions(): Promise; - abstract gameDefinitions(): Promise; - abstract galleryDefinitions(): Promise; + abstract skills(): Promise; + abstract provisions(): Promise; + abstract consumables(): Promise; + abstract equipments(): Promise; + abstract maps(): Promise; + abstract models(): Promise; + abstract camouflages(): Promise; + abstract tanks(): Promise; + abstract game(): Promise; + abstract gallery(): Promise; + + async tank(id: number) { + const tanks = await this.tanks(); + return tanks.tanks[id]; + } } diff --git a/packages/core/src/blitzkit/api/client.ts b/packages/core/src/blitzkit/api/client.ts index 02f645fb9..1b3b1f487 100644 --- a/packages/core/src/blitzkit/api/client.ts +++ b/packages/core/src/blitzkit/api/client.ts @@ -15,55 +15,55 @@ import { import { BlitzKitAPI } from "./base"; export class ClientBlitzKitAPI extends BlitzKitAPI { - gameDefinitions() { + game() { return fetchPB(alias("api", "/definitions/game.pb"), GameDefinitions); } - consumableDefinitions() { + consumables() { return fetchPB( alias("api", "/definitions/consumables.pb"), ConsumableDefinitions, ); } - tankDefinitions() { + tanks() { return fetchPB(alias("api", "/definitions/tanks.pb"), TankDefinitions); } - camouflageDefinitions() { + camouflages() { return fetchPB( alias("api", "/definitions/camouflage.pb"), CamouflageDefinitions, ); } - provisionDefinitions() { + provisions() { return fetchPB( alias("api", "/definitions/provisions.pb"), ProvisionDefinitions, ); } - modelDefinitions() { + models() { return fetchPB(alias("api", "/definitions/models.pb"), ModelDefinitions); } - skillDefinitions() { + skills() { return fetchPB(alias("api", "/definitions/skills.pb"), SkillDefinitions); } - equipmentDefinitions() { + equipments() { return fetchPB( alias("api", "/definitions/equipment.pb"), EquipmentDefinitions, ); } - galleryDefinitions() { + gallery() { return fetchPB(alias("api", "/definitions/gallery.pb"), Gallery); } - mapDefinitions() { + maps() { return fetchPB(alias("api", "/definitions/maps.pb"), MapDefinitions); } } diff --git a/packages/core/src/blitzkit/api/dynamic.ts b/packages/core/src/blitzkit/api/dynamic.ts new file mode 100644 index 000000000..e7d1614ef --- /dev/null +++ b/packages/core/src/blitzkit/api/dynamic.ts @@ -0,0 +1,21 @@ +import { AbstractVFS, BlitzKitAPI } from "@blitzkit/core"; + +export async function createDynamicAPI(vfs: AbstractVFS) { + let _api: BlitzKitAPI; + + if (import.meta.env.SSR) { + const { ServerBlitzKitAPI } = await import( + "@blitzkit/core/src/blitzkit/api/server/index" + ); + + _api = await new ServerBlitzKitAPI(vfs).init(); + } else { + const { ClientBlitzKitAPI } = await import( + "@blitzkit/core/src/blitzkit/api/client" + ); + + _api = new ClientBlitzKitAPI(); + } + + return _api; +} diff --git a/packages/core/src/blitzkit/api/index.ts b/packages/core/src/blitzkit/api/index.ts new file mode 100644 index 000000000..b39160477 --- /dev/null +++ b/packages/core/src/blitzkit/api/index.ts @@ -0,0 +1,4 @@ +export * from "./base"; +export * from "./client"; +export * from "./dynamic"; +export * from "./server"; diff --git a/packages/core/src/blitzkit/api/server/0_base.ts b/packages/core/src/blitzkit/api/server/0_base.ts index a41ec123d..77b00ab6f 100644 --- a/packages/core/src/blitzkit/api/server/0_base.ts +++ b/packages/core/src/blitzkit/api/server/0_base.ts @@ -27,11 +27,14 @@ import { import { AbstractVFS } from "@blitzkit/core/src/blitzkit/vfs/abstract"; import { SUPPORTED_LOCALE_BLITZ_MAP } from "@blitzkit/i18n"; import locales from "@blitzkit/i18n/locales.json"; +import type { extname, parse } from "node:path"; import { parse as parseYaml } from "yaml"; import { BlitzKitAPI } from "../base"; export abstract class ServerBlitzKitAPI0 extends BlitzKitAPI { protected vfs: AbstractVFS; + protected parsePath?: typeof parse; + protected extname?: typeof extname; protected nationSlugDiscriminators = { china: "cn", @@ -109,11 +112,18 @@ export abstract class ServerBlitzKitAPI0 extends BlitzKitAPI { constructor(vfs: AbstractVFS) { super(); + this.vfs = vfs; } async init() { console.log("Initializing virtual file system..."); + + const path = await import("node:path"); + + this.extname = path.extname; + this.parsePath = path.parse; + await this.vfs.init(); console.log("Fetching game data..."); diff --git a/packages/core/src/blitzkit/api/server/10_galleryDefinitions.ts b/packages/core/src/blitzkit/api/server/10_avatars.ts similarity index 90% rename from packages/core/src/blitzkit/api/server/10_galleryDefinitions.ts rename to packages/core/src/blitzkit/api/server/10_avatars.ts index 40cf9295e..76cfb2787 100644 --- a/packages/core/src/blitzkit/api/server/10_galleryDefinitions.ts +++ b/packages/core/src/blitzkit/api/server/10_avatars.ts @@ -1,12 +1,11 @@ import { Avatar, fetchGlossary, Gallery } from "@blitzkit/core"; import locales from "@blitzkit/i18n/locales.json"; -import { extname } from "path"; import { Cache } from "./0_base"; -import { ServerBlitzKitAPI9 } from "./9_gameDefinitions"; +import { ServerBlitzKitAPI9 } from "./9_game"; export abstract class ServerBlitzKitAPI10 extends ServerBlitzKitAPI9 { @Cache() - async galleryDefinitions() { + async gallery() { const avatars: Record = {}; await Promise.all( @@ -34,7 +33,7 @@ export abstract class ServerBlitzKitAPI10 extends ServerBlitzKitAPI9 { avatars[key].avatar.name!.locales[supported.locale] = glossaryEntry.title; } else { - const extension = extname(glossaryEntry.image_url); + const extension = this.extname!(glossaryEntry.image_url); avatars[key] = { url: glossaryEntry.image_url, diff --git a/packages/core/src/blitzkit/api/server/1_tankDefinitions.ts b/packages/core/src/blitzkit/api/server/1_tanks.ts similarity index 99% rename from packages/core/src/blitzkit/api/server/1_tankDefinitions.ts rename to packages/core/src/blitzkit/api/server/1_tanks.ts index 9269a4900..30b84e3e4 100644 --- a/packages/core/src/blitzkit/api/server/1_tankDefinitions.ts +++ b/packages/core/src/blitzkit/api/server/1_tanks.ts @@ -47,7 +47,7 @@ export abstract class ServerBlitzKitAPI1 extends ServerBlitzKitAPI0 { } @Cache() - async tankDefinitions() { + async tanks() { const tankDefinitions = TankDefinitions.create(); const gameModeNativeNames: Record = {}; diff --git a/packages/core/src/blitzkit/api/server/2_camouflageDefinitions.ts b/packages/core/src/blitzkit/api/server/2_camouflages.ts similarity index 92% rename from packages/core/src/blitzkit/api/server/2_camouflageDefinitions.ts rename to packages/core/src/blitzkit/api/server/2_camouflages.ts index 30ce31d6a..d0939df34 100644 --- a/packages/core/src/blitzkit/api/server/2_camouflageDefinitions.ts +++ b/packages/core/src/blitzkit/api/server/2_camouflages.ts @@ -1,10 +1,10 @@ import { CamouflageDefinitions } from "@blitzkit/core"; import { Cache } from "./0_base"; -import { ServerBlitzKitAPI1 } from "./1_tankDefinitions"; +import { ServerBlitzKitAPI1 } from "./1_tanks"; export abstract class ServerBlitzKitAPI2 extends ServerBlitzKitAPI1 { @Cache() - async camouflageDefinitions() { + async camouflages() { const camouflageDefinitions = CamouflageDefinitions.create(); for (const camoKey in this.camouflagesXml!.root.camouflages) { diff --git a/packages/core/src/blitzkit/api/server/3_modelDefinitions.ts b/packages/core/src/blitzkit/api/server/3_models.ts similarity index 94% rename from packages/core/src/blitzkit/api/server/3_modelDefinitions.ts rename to packages/core/src/blitzkit/api/server/3_models.ts index dfc96c1ab..427ee452a 100644 --- a/packages/core/src/blitzkit/api/server/3_modelDefinitions.ts +++ b/packages/core/src/blitzkit/api/server/3_models.ts @@ -6,7 +6,6 @@ import { EngineDefinitionsList, GunDefinitionsList, ModelDefinitions, - ResearchCost, TankParameters, toUniqueId, TurretDefinitionsList, @@ -15,10 +14,9 @@ import { VehicleDefinitionList, VehicleDefinitions, } from "@blitzkit/core"; -import { Cache } from "./0_base"; -import { ServerBlitzKitAPI2 } from "./2_camouflageDefinitions"; -import { parse as parsePath } from "path"; import { Vector3Tuple } from "three"; +import { Cache } from "./0_base"; +import { ServerBlitzKitAPI2 } from "./2_camouflages"; export abstract class ServerBlitzKitAPI3 extends ServerBlitzKitAPI2 { private vector3TupleToBlitzkit(tuple: Vector3Tuple) { @@ -42,7 +40,7 @@ export abstract class ServerBlitzKitAPI3 extends ServerBlitzKitAPI2 { } @Cache() - async modelDefinitions() { + async models() { const modelDefinitions = ModelDefinitions.create(); for (const nation of this.nationsDir!) { @@ -65,10 +63,6 @@ export abstract class ServerBlitzKitAPI3 extends ServerBlitzKitAPI2 { for (const tankKey in tankList.root) { if (this.botPattern.test(tankKey)) continue; - const gunXps = new Map(); - const turretXps = new Map(); - const engineXps = new Map(); - const trackXps = new Map(); const tank = tankList.root[tankKey]; const tankDefinition = await this.vfs.xml<{ root: VehicleDefinitions }>( `Data/XML/item_defs/vehicles/${nation}/${tankKey}.xml`, @@ -181,7 +175,7 @@ export abstract class ServerBlitzKitAPI3 extends ServerBlitzKitAPI2 { Object.keys(tankDefinition.root.turrets0).forEach((turretKey) => { const turret = tankDefinition.root.turrets0[turretKey]; const turretModel = Number( - parsePath(turret.models.undamaged).name.split("_")[1], + this.parsePath!(turret.models.undamaged).name.split("_")[1], ); const turretId = toUniqueId(nation, turretList.root.ids[turretKey]); const turretYaw = ( @@ -229,12 +223,16 @@ export abstract class ServerBlitzKitAPI3 extends ServerBlitzKitAPI2 { bounding_box: { min: this.vector3TupleToBlitzkit( tankParameters.collision[ - parsePath(turret.hitTester.collisionModel).name.toLowerCase() + this.parsePath!( + turret.hitTester.collisionModel, + ).name.toLowerCase() ].bbox.min, ), max: this.vector3TupleToBlitzkit( tankParameters.collision[ - parsePath(turret.hitTester.collisionModel).name.toLowerCase() + this.parsePath!( + turret.hitTester.collisionModel, + ).name.toLowerCase() ].bbox.max, ), }, @@ -253,7 +251,7 @@ export abstract class ServerBlitzKitAPI3 extends ServerBlitzKitAPI2 { .split(" ") .map(Number) as [number, number]; const gunModel = Number( - parsePath(gun.models.undamaged).name.split("_")[1], + this.parsePath!(gun.models.undamaged).name.split("_")[1], ); const front = gun.extraPitchLimits?.front ? gun.extraPitchLimits.front.split(" ").map(Number) diff --git a/packages/core/src/blitzkit/api/server/4_mapDefinitions.ts b/packages/core/src/blitzkit/api/server/4_maps.ts similarity index 84% rename from packages/core/src/blitzkit/api/server/4_mapDefinitions.ts rename to packages/core/src/blitzkit/api/server/4_maps.ts index 944b3738d..b8c9d655d 100644 --- a/packages/core/src/blitzkit/api/server/4_mapDefinitions.ts +++ b/packages/core/src/blitzkit/api/server/4_maps.ts @@ -1,10 +1,10 @@ import { MapDefinitions } from "@blitzkit/core"; import { Cache } from "./0_base"; -import { ServerBlitzKitAPI3 } from "./3_modelDefinitions"; +import { ServerBlitzKitAPI3 } from "./3_models"; export abstract class ServerBlitzKitAPI4 extends ServerBlitzKitAPI3 { @Cache() - async mapDefinitions() { + async maps() { const mapDefinitions = MapDefinitions.create(); for (const key in this.mapsYaml!.maps) { diff --git a/packages/core/src/blitzkit/api/server/5_equipmentDefinitions.ts b/packages/core/src/blitzkit/api/server/5_equipments.ts similarity index 93% rename from packages/core/src/blitzkit/api/server/5_equipmentDefinitions.ts rename to packages/core/src/blitzkit/api/server/5_equipments.ts index 95632096b..4caad7cad 100644 --- a/packages/core/src/blitzkit/api/server/5_equipmentDefinitions.ts +++ b/packages/core/src/blitzkit/api/server/5_equipments.ts @@ -1,10 +1,10 @@ import { EquipmentDefinitions, EquipmentSlot } from "@blitzkit/core"; import { Cache } from "./0_base"; -import { ServerBlitzKitAPI4 } from "./4_mapDefinitions"; +import { ServerBlitzKitAPI4 } from "./4_maps"; export abstract class ServerBlitzKitAPI5 extends ServerBlitzKitAPI4 { @Cache() - async equipmentDefinitions() { + async equipments() { const equipmentDefinitions = EquipmentDefinitions.create(); Object.entries(this.optionalDevices!.root).forEach( diff --git a/packages/core/src/blitzkit/api/server/6_consumableDefinitions.ts b/packages/core/src/blitzkit/api/server/6_consumables.ts similarity index 97% rename from packages/core/src/blitzkit/api/server/6_consumableDefinitions.ts rename to packages/core/src/blitzkit/api/server/6_consumables.ts index f4b333f61..5e6cf477d 100644 --- a/packages/core/src/blitzkit/api/server/6_consumableDefinitions.ts +++ b/packages/core/src/blitzkit/api/server/6_consumables.ts @@ -4,11 +4,11 @@ import { ConsumableDefinitions, } from "@blitzkit/core"; import { Cache } from "./0_base"; -import { ServerBlitzKitAPI5 } from "./5_equipmentDefinitions"; +import { ServerBlitzKitAPI5 } from "./5_equipments"; export abstract class ServerBlitzKitAPI6 extends ServerBlitzKitAPI5 { @Cache() - async consumableDefinitions() { + async consumables() { const consumableDefinitions = ConsumableDefinitions.create(); Object.entries(this.consumablesCommon).forEach(([key, consumable]) => { diff --git a/packages/core/src/blitzkit/api/server/7_provisionDefinitions.ts b/packages/core/src/blitzkit/api/server/7_provisions.ts similarity index 97% rename from packages/core/src/blitzkit/api/server/7_provisionDefinitions.ts rename to packages/core/src/blitzkit/api/server/7_provisions.ts index 32db2bcc1..d42d9aef1 100644 --- a/packages/core/src/blitzkit/api/server/7_provisionDefinitions.ts +++ b/packages/core/src/blitzkit/api/server/7_provisions.ts @@ -4,11 +4,11 @@ import { ProvisionDefinitions, } from "@blitzkit/core"; import { Cache } from "./0_base"; -import { ServerBlitzKitAPI6 } from "./6_consumableDefinitions"; +import { ServerBlitzKitAPI6 } from "./6_consumables"; export abstract class ServerBlitzKitAPI7 extends ServerBlitzKitAPI6 { @Cache() - async provisionDefinitions() { + async provisions() { const provisionDefinitions = ProvisionDefinitions.create(); Object.entries(this.provisionsCommon).forEach(([, provision]) => { diff --git a/packages/core/src/blitzkit/api/server/8_skillDefinitions.ts b/packages/core/src/blitzkit/api/server/8_skills.ts similarity index 86% rename from packages/core/src/blitzkit/api/server/8_skillDefinitions.ts rename to packages/core/src/blitzkit/api/server/8_skills.ts index 9198618fa..3111c0e60 100644 --- a/packages/core/src/blitzkit/api/server/8_skillDefinitions.ts +++ b/packages/core/src/blitzkit/api/server/8_skills.ts @@ -1,11 +1,11 @@ import { BlitzTankClass, SkillDefinitions } from "@blitzkit/core"; import { Cache } from "./0_base"; -import { ServerBlitzKitAPI7 } from "./7_provisionDefinitions"; +import { ServerBlitzKitAPI7 } from "./7_provisions"; export abstract class ServerBlitzKitAPI8 extends ServerBlitzKitAPI7 { @Cache() - async skillDefinitions() { + async skills() { const skillDefinitions = SkillDefinitions.create(); for (const tankClass in this.tankmenAvatar!.root.skillsByClasses) { diff --git a/packages/core/src/blitzkit/api/server/9_gameDefinitions.ts b/packages/core/src/blitzkit/api/server/9_game.ts similarity index 95% rename from packages/core/src/blitzkit/api/server/9_gameDefinitions.ts rename to packages/core/src/blitzkit/api/server/9_game.ts index 683c126a5..1fba2d073 100644 --- a/packages/core/src/blitzkit/api/server/9_gameDefinitions.ts +++ b/packages/core/src/blitzkit/api/server/9_game.ts @@ -1,11 +1,11 @@ import { AvailableNationsYaml, GameDefinitions } from "@blitzkit/core"; import { Cache } from "./0_base"; -import { ServerBlitzKitAPI8 } from "./8_skillDefinitions"; +import { ServerBlitzKitAPI8 } from "./8_skills"; export abstract class ServerBlitzKitAPI9 extends ServerBlitzKitAPI8 { @Cache() - async gameDefinitions() { + async game() { const gameDefinitions = GameDefinitions.create(); const consumableNativeNames: Record = {}; diff --git a/packages/core/src/blitzkit/api/server/index.ts b/packages/core/src/blitzkit/api/server/index.ts index 3b9c459a9..3ab3aee51 100644 --- a/packages/core/src/blitzkit/api/server/index.ts +++ b/packages/core/src/blitzkit/api/server/index.ts @@ -1,3 +1,3 @@ -import { ServerBlitzKitAPI10 } from "@blitzkit/core/src/blitzkit/api/server/10_galleryDefinitions"; +import { ServerBlitzKitAPI10 } from "./10_avatars"; export class ServerBlitzKitAPI extends ServerBlitzKitAPI10 {} diff --git a/packages/core/src/blitzkit/averageDefinitions/index.ts b/packages/core/src/blitzkit/averageDefinitions/index.ts index 188e289d8..16bc9afb4 100644 --- a/packages/core/src/blitzkit/averageDefinitions/index.ts +++ b/packages/core/src/blitzkit/averageDefinitions/index.ts @@ -10,7 +10,7 @@ export interface AverageDefinitionsManifest { latest: number; } -export async function fetchAverageDefinitions() { +export async function fetchAverage() { return await fetchPB(staticAsset("averages.pb"), AverageDefinitions); } diff --git a/packages/core/src/blitzkit/discoveredIdDefinitions.ts b/packages/core/src/blitzkit/discoveredIdDefinitions.ts index 2354afc9f..0ccf9546f 100644 --- a/packages/core/src/blitzkit/discoveredIdDefinitions.ts +++ b/packages/core/src/blitzkit/discoveredIdDefinitions.ts @@ -6,7 +6,7 @@ export interface DiscoveredIdsDefinitions { count: number; } -export async function fetchDiscoveredIdsDefinitions() { +export async function fetchDiscoveredIds() { const response = await fetch(staticAsset("ids/manifest.json")); return response.json() as Promise; } diff --git a/packages/core/src/blitzkit/index.ts b/packages/core/src/blitzkit/index.ts index 700e57018..14072a4bb 100644 --- a/packages/core/src/blitzkit/index.ts +++ b/packages/core/src/blitzkit/index.ts @@ -1,4 +1,5 @@ export * from "./alias"; +export * from "./api"; export * from "./assertSecret"; export * from "./availableProvisions"; export * from "./averageDefinitions"; @@ -30,5 +31,6 @@ export * from "./tankNames"; export * from "./unionBoundingBox"; export * from "./uniqueGuns"; export * from "./unwrapBlitzkitResponse"; +export * from "./vfs"; export * from "./votes"; export * from "./youtubers"; diff --git a/packages/core/src/blitzkit/tankNames.ts b/packages/core/src/blitzkit/tankNames.ts index 9d058899a..04d02de14 100644 --- a/packages/core/src/blitzkit/tankNames.ts +++ b/packages/core/src/blitzkit/tankNames.ts @@ -5,8 +5,8 @@ import { I18nString } from "../protos"; export async function fetchTankNames(api: BlitzKitAPI) { const [tankDefinitions, camouflageDefinitions] = await Promise.all([ - api.tankDefinitions(), - api.camouflageDefinitions(), + api.tanks(), + api.camouflages(), ]); const tankDefinitionsArray = Object.values(tankDefinitions.tanks); diff --git a/packages/core/src/blitzkit/vfs/index.ts b/packages/core/src/blitzkit/vfs/index.ts new file mode 100644 index 000000000..939b46d1c --- /dev/null +++ b/packages/core/src/blitzkit/vfs/index.ts @@ -0,0 +1,5 @@ +export * from "./abstract"; +export * from "./local"; +export * from "./mixed"; +export * from "./steam"; +export * from "./zip"; diff --git a/packages/scripts/src/reviews.ts b/packages/scripts/src/reviews.ts index 0c2a07e55..93d7521fe 100644 --- a/packages/scripts/src/reviews.ts +++ b/packages/scripts/src/reviews.ts @@ -1,10 +1,4 @@ -import { - asset, - fetchTankDefinitions, - Reviews, - Video, - youtubers, -} from "@blitzkit/core"; +import { asset, Reviews, Video, youtubers } from "@blitzkit/core"; import locales from "@blitzkit/i18n/locales.json"; import { google } from "googleapis"; import { cloneDeep, uniqBy } from "lodash-es"; @@ -22,7 +16,7 @@ const auth = await google.auth.getClient({ }); const youtube = google.youtube({ version: "v3", auth }); -const tankDefinitions = await fetchTankDefinitions(); +const tankDefinitions = await fetchTank(); const tanks = Object.values(tankDefinitions.tanks); const tanksSanitized = tanks diff --git a/packages/website/package.json b/packages/website/package.json index e321ad232..35bb2418e 100644 --- a/packages/website/package.json +++ b/packages/website/package.json @@ -43,6 +43,7 @@ "radix-ui": "^1.6.7", "react": "^19.2.4", "react-dom": "^19.2.4", + "react-error-boundary": "^6.1.3", "react-promise-suspense": "^0.3.4", "three": "^0.180.0", "three-stdlib": "^2.36.0", diff --git a/packages/website/src/components/Gallery/Card.tsx b/packages/website/src/components/AvatarCard.tsx similarity index 78% rename from packages/website/src/components/Gallery/Card.tsx rename to packages/website/src/components/AvatarCard.tsx index dfc762b44..a3e746577 100644 --- a/packages/website/src/components/Gallery/Card.tsx +++ b/packages/website/src/components/AvatarCard.tsx @@ -1,23 +1,18 @@ import { alias, Avatar } from "@blitzkit/core"; import { Cross1Icon, DownloadIcon } from "@radix-ui/react-icons"; -import { - Dialog, - Flex, - IconButton, - Link, - Skeleton, - Text, -} from "@radix-ui/themes"; import { useRef } from "react"; -import { useIntersection } from "../../hooks/useIntersection"; -import { useLocale } from "../../hooks/useLocale"; -import type { MaybeSkeletonComponentProps } from "../../types/maybeSkeletonComponentProps"; +import { useIntersection } from "../hooks/useIntersection"; +import { useLocale } from "../hooks/useLocale"; +import type { MaybeSkeletonComponentProps } from "../types/maybeSkeletonComponentProps"; +import { Flex } from "./Flex"; +import { Skeleton } from "./Skeleton"; +import { Text } from "./Text"; type GalleryCardProps = MaybeSkeletonComponentProps<{ avatar: Avatar; }>; -export function GalleryCard(props: GalleryCardProps) { +export function AvatarCard(props: GalleryCardProps) { const src = alias( "api", `/gallery/avatars/${!props.skeleton && `${props.avatar.id}${props.avatar.extension}`}`, @@ -31,17 +26,16 @@ export function GalleryCard(props: GalleryCardProps) { const content = ( {props.skeleton && ( <> - - + + )} @@ -58,7 +52,7 @@ export function GalleryCard(props: GalleryCardProps) { alt={unwrap(props.avatar.name!)} /> - + {unwrap(props.avatar.name!)} diff --git a/packages/website/src/components/Gallery/Search.tsx b/packages/website/src/components/Avatars/Search.tsx similarity index 67% rename from packages/website/src/components/Gallery/Search.tsx rename to packages/website/src/components/Avatars/Search.tsx index 16307b2db..1e3eea5ba 100644 --- a/packages/website/src/components/Gallery/Search.tsx +++ b/packages/website/src/components/Avatars/Search.tsx @@ -1,19 +1,18 @@ import { MagnifyingGlassIcon } from "@radix-ui/react-icons"; -import { TextField } from "@radix-ui/themes"; import { useRef } from "react"; import { useLocale } from "../../hooks/useLocale"; import { Gallery } from "../../stores/gallery"; import type { MaybeSkeletonComponentProps } from "../../types/maybeSkeletonComponentProps"; +import { TextField } from "../TextField"; -export function GallerySearch({ skeleton }: MaybeSkeletonComponentProps) { +export function AvatarsSearch({ skeleton }: MaybeSkeletonComponentProps) { const input = useRef(null); const { strings } = useLocale(); return ( - { Gallery.mutate((draft) => { @@ -22,9 +21,7 @@ export function GallerySearch({ skeleton }: MaybeSkeletonComponentProps) { }); }} > - - - - + + ); } diff --git a/packages/website/src/components/AvatarsList/index.module.css b/packages/website/src/components/AvatarsList/index.module.css new file mode 100644 index 000000000..e69de29bb diff --git a/packages/website/src/components/Gallery/List.tsx b/packages/website/src/components/AvatarsList/index.tsx similarity index 82% rename from packages/website/src/components/Gallery/List.tsx rename to packages/website/src/components/AvatarsList/index.tsx index 7d92a9752..3ba737505 100644 --- a/packages/website/src/components/Gallery/List.tsx +++ b/packages/website/src/components/AvatarsList/index.tsx @@ -1,6 +1,5 @@ import locales from "@blitzkit/i18n/locales.json"; import { literals } from "@blitzkit/i18n/src/literals"; -import { Flex, Text } from "@radix-ui/themes"; import fuzzysort from "fuzzysort"; import { times } from "lodash-es"; import { useMemo, useState } from "react"; @@ -8,20 +7,22 @@ import { api } from "../../core/blitzkit/api"; import { useLocale } from "../../hooks/useLocale"; import { Gallery } from "../../stores/gallery"; import type { MaybeSkeletonComponentProps } from "../../types/maybeSkeletonComponentProps"; +import { AvatarCard } from "../AvatarCard"; +import { Flex } from "../Flex"; import { InlineSkeleton } from "../InlineSkeleton"; -import { GalleryCard } from "./Card"; +import { Text } from "../Text"; export interface Avatar { name: string; id: string; } -const gallery = await api.galleryDefinitions(); +const gallery = await api.gallery(); const DEFAULT_LOADED = 42; const PREVIEW_COUNT = 28; -export function GalleryList({ skeleton }: MaybeSkeletonComponentProps) { +export function AvatarsList({ skeleton }: MaybeSkeletonComponentProps) { const search = Gallery.use((state) => state.search); const [loadedCards, setLoadedCards] = useState(DEFAULT_LOADED); const { locale, strings } = useLocale(); @@ -48,9 +49,9 @@ export function GalleryList({ skeleton }: MaybeSkeletonComponentProps) { <> {skeleton ? ( - + ) : ( - literals(strings.website.tools.gallery.search.results, { + literals(strings.website.tools.avatars.search.results, { count: filtered.length.toLocaleString(locale), }) )} @@ -60,14 +61,14 @@ export function GalleryList({ skeleton }: MaybeSkeletonComponentProps) { {!skeleton && filtered .slice(0, loadedCards) - .map((avatar) => )} + .map((avatar) => )} {times( skeleton ? DEFAULT_LOADED + PREVIEW_COUNT : Math.min(PREVIEW_COUNT, filtered.length - loadedCards), (index) => ( - setLoadedCards((state) => state + 2)} diff --git a/packages/website/src/components/Code/index.module.css b/packages/website/src/components/Code/index.module.css new file mode 100644 index 000000000..3d3e58d4b --- /dev/null +++ b/packages/website/src/components/Code/index.module.css @@ -0,0 +1,16 @@ +.code { + font: inherit; + font-family: var(--font-family-mono); + + white-space: pre; + + display: inline-block; + + &[data-variant="solid"] { + background-color: var(--gray-3); + + border-radius: var(--space-3); + + padding: var(--space-4); + } +} diff --git a/packages/website/src/components/Code/index.tsx b/packages/website/src/components/Code/index.tsx new file mode 100644 index 000000000..ef200ef39 --- /dev/null +++ b/packages/website/src/components/Code/index.tsx @@ -0,0 +1,18 @@ +import { classNames } from "../../ui/classNames"; +import { Text, type TextProps } from "../Text"; +import styles from "./index.module.css"; + +export interface CodeProps extends TextProps { + lowContrast?: boolean; + variant?: "ghost" | "solid"; +} + +export function Code({ className, variant = "ghost", ...props }: CodeProps) { + return ( + + ); +} diff --git a/packages/website/src/components/Compare/CompareTable.tsx b/packages/website/src/components/Compare/CompareTable.tsx index 6854b6ce3..45efd0c58 100644 --- a/packages/website/src/components/Compare/CompareTable.tsx +++ b/packages/website/src/components/Compare/CompareTable.tsx @@ -39,10 +39,10 @@ const [ consumableDefinitions, provisionDefinitions, ] = await Promise.all([ - api.skillDefinitions(), - api.equipmentDefinitions(), - api.consumableDefinitions(), - api.provisionDefinitions(), + api.skill(), + api.equipment(), + api.consumables(), + api.provisions(), ]); export function CompareTable({ stats }: CompareTableProps) { diff --git a/packages/website/src/components/Compare/Controls.tsx b/packages/website/src/components/Compare/Controls.tsx index 1bb45c6cb..af8375490 100644 --- a/packages/website/src/components/Compare/Controls.tsx +++ b/packages/website/src/components/Compare/Controls.tsx @@ -15,7 +15,7 @@ interface ControlsProps { onAddTankDialogOpenChange: (open: boolean) => void; } -const provisionDefinitions = await api.provisionDefinitions(); +const provisionDefinitions = await api.provisions(); export function Controls({ addTankDialogOpen, diff --git a/packages/website/src/components/Compare/TankControl.tsx b/packages/website/src/components/Compare/TankControl.tsx index 28ab0e129..5e5848219 100644 --- a/packages/website/src/components/Compare/TankControl.tsx +++ b/packages/website/src/components/Compare/TankControl.tsx @@ -13,7 +13,7 @@ interface TankControlProps { slug: string; } -const provisionDefinitions = await api.provisionDefinitions(); +const provisionDefinitions = await api.provisions(); export function TankControl({ index, slug }: TankControlProps) { const { locale, strings } = useLocale(); diff --git a/packages/website/src/components/CrewSkillManager.tsx b/packages/website/src/components/CrewSkillManager.tsx index 4e4d9b7ad..984b8ca04 100644 --- a/packages/website/src/components/CrewSkillManager.tsx +++ b/packages/website/src/components/CrewSkillManager.tsx @@ -8,7 +8,7 @@ interface CrewSkillManagerProps { onChange?: (skillLevels: Record) => void; } -const skillDefinitions = await api.skillDefinitions(); +const skillDefinitions = await api.skill(); export function CrewSkillManager({ skillLevels, diff --git a/packages/website/src/components/Embeds/breakdown.tsx b/packages/website/src/components/Embeds/breakdown.tsx index 2b7340eb4..9a96cd919 100644 --- a/packages/website/src/components/Embeds/breakdown.tsx +++ b/packages/website/src/components/Embeds/breakdown.tsx @@ -30,7 +30,7 @@ export const compositeStatsKeysOptions = compositeStatsKeys.map((value) => ({ })); const [tankDefinitions, averageDefinitions] = await Promise.all([ - api.tankDefinitions(), + api.tanks(), awaitableAverageDefinitions, ]); diff --git a/packages/website/src/components/ErrorWrapper/index.module.css b/packages/website/src/components/ErrorWrapper/index.module.css new file mode 100644 index 000000000..59887ee46 --- /dev/null +++ b/packages/website/src/components/ErrorWrapper/index.module.css @@ -0,0 +1,55 @@ +.error-display { + z-index: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + + gap: var(--space-4); + padding: var(--space-4); + box-sizing: border-box; + + position: fixed; + top: 0; + left: 0; + width: 100dvw; + height: 100dvh; + + text-align: center; + background-color: var(--gray-1); + + .info { + display: flex; + align-items: center; + flex-direction: column; + + gap: var(--space-3); + } + + .error { + text-align: left; + overflow: hidden; + position: relative; + box-sizing: border-box; + + max-width: min(100%, var(--page-width)); + + .cover { + position: absolute; + right: 0; + top: 0; + + width: 25%; + height: 100%; + + background: linear-gradient(90deg, transparent, var(--gray-1)); + } + } + + .options { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: var(--space-3); + } +} diff --git a/packages/website/src/components/ErrorWrapper/index.tsx b/packages/website/src/components/ErrorWrapper/index.tsx new file mode 100644 index 000000000..9e57abee7 --- /dev/null +++ b/packages/website/src/components/ErrorWrapper/index.tsx @@ -0,0 +1,84 @@ +import { useState, type ReactNode } from "react"; +import { + ErrorBoundary, + getErrorMessage, + type FallbackProps, +} from "react-error-boundary"; +import { discordLink } from "../../config/socials"; +import { Button } from "../Button"; +import { Code } from "../Code"; +import { Heading } from "../Heading"; +import { Link } from "../Link"; +import { Text } from "../Text"; +import styles from "./index.module.css"; + +interface Props { + children: ReactNode; +} + +export function ErrorWrapper({ children }: Props) { + return ( + }> + {children} + + ); +} + +function Fallback({ error, resetErrorBoundary }: FallbackProps) { + const [showError, setShowError] = useState(false); + + let body: string | undefined; + + if (error instanceof Error) { + body = error.stack || getErrorMessage(error); + } else { + body = getErrorMessage(error); + } + + body ??= "No error message"; + + return ( +
+
+ BlitzKit crashed + Sorry about that! You have a couple of options. +
+ + {showError && ( + + {body} +
+ + )} + +
+ {!showError && ( + + )} + + {showError && ( + + )} + + + + + + + + + + +
+
+ ); +} diff --git a/packages/website/src/components/Footer.astro b/packages/website/src/components/Footer.astro index 3bcd19c6c..a50c7023d 100644 --- a/packages/website/src/components/Footer.astro +++ b/packages/website/src/components/Footer.astro @@ -11,7 +11,7 @@ export interface Props { locale: string; } -const gameDefinitions = await api.gameDefinitions(); +const gameDefinitions = await api.game(); const environment = assertSecret(import.meta.env.PUBLIC_ENVIRONMENT); const { locale } = Astro.props; const strings = getStrings(locale); diff --git a/packages/website/src/components/GuessBackground/index.tsx b/packages/website/src/components/GuessBackground/index.tsx index fce8951ab..66ddbf073 100644 --- a/packages/website/src/components/GuessBackground/index.tsx +++ b/packages/website/src/components/GuessBackground/index.tsx @@ -9,8 +9,8 @@ import { Tankopedia } from "../../stores/tankopedia"; import "./index.css"; const [modelDefinitions, provisionDefinitions] = await Promise.all([ - api.modelDefinitions(), - api.provisionDefinitions(), + api.models(), + api.provisions(), ]); export function GuessBackground() { diff --git a/packages/website/src/components/Guesser.tsx b/packages/website/src/components/Guesser.tsx index 09c1a3cd0..ee11ef7cf 100644 --- a/packages/website/src/components/Guesser.tsx +++ b/packages/website/src/components/Guesser.tsx @@ -40,7 +40,7 @@ const { go } = fuzzysort; const [tankNames, tankDefinitions] = await Promise.all([ awaitableTankNames, - api.tankDefinitions(), + api.tanks(), ]); const ids = Object.keys(tankDefinitions.tanks); diff --git a/packages/website/src/components/HomePageHotTanks.tsx b/packages/website/src/components/HomePageHotTanks.tsx index 255f93a70..40603b760 100644 --- a/packages/website/src/components/HomePageHotTanks.tsx +++ b/packages/website/src/components/HomePageHotTanks.tsx @@ -11,7 +11,7 @@ import { import { TankCard } from "./TankCard"; const [tankDefinitions, popularTanks] = await Promise.all([ - api.tankDefinitions(), + api.tanks(), awaitablePopularTanks, ]); diff --git a/packages/website/src/components/MixerScene/components/Model.tsx b/packages/website/src/components/MixerScene/components/Model.tsx index 85d9c04af..8a506a02f 100644 --- a/packages/website/src/components/MixerScene/components/Model.tsx +++ b/packages/website/src/components/MixerScene/components/Model.tsx @@ -12,7 +12,7 @@ import { controlsEnabledEvent } from "../../../core/controlsEnabled"; import { useModel } from "../../../hooks/useModel"; import { Mixer } from "../../../stores/mixer"; -const modelDefinitions = await api.modelDefinitions(); +const modelDefinitions = await api.models(); export function Model() { const canvas = useThree((state) => state.gl.domElement); diff --git a/packages/website/src/components/ModuleButtons/ConsumableButton.tsx b/packages/website/src/components/ModuleButtons/ConsumableButton.tsx index 96ab54bae..0530c5cf8 100644 --- a/packages/website/src/components/ModuleButtons/ConsumableButton.tsx +++ b/packages/website/src/components/ModuleButtons/ConsumableButton.tsx @@ -13,7 +13,7 @@ interface ConsumableButtonProps extends TankComponentButtonProps { cooldown?: number; } -const consumableDefinitions = await api.consumableDefinitions(); +const consumableDefinitions = await api.consumables(); export function ConsumableButton({ consumable, diff --git a/packages/website/src/components/ModuleButtons/EquipmentButton.tsx b/packages/website/src/components/ModuleButtons/EquipmentButton.tsx index b796d66d7..bda5b26ef 100644 --- a/packages/website/src/components/ModuleButtons/EquipmentButton.tsx +++ b/packages/website/src/components/ModuleButtons/EquipmentButton.tsx @@ -8,7 +8,7 @@ interface EquipmentButtonProps extends TankComponentButtonProps { equipment: number; } -const equipmentDefinitions = await api.equipmentDefinitions(); +const equipmentDefinitions = await api.equipment(); export function EquipmentButton({ equipment, ...props }: EquipmentButtonProps) { const { unwrap } = useLocale(); diff --git a/packages/website/src/components/ModuleButtons/ProvisionButton.tsx b/packages/website/src/components/ModuleButtons/ProvisionButton.tsx index bdf567005..ce5083f72 100644 --- a/packages/website/src/components/ModuleButtons/ProvisionButton.tsx +++ b/packages/website/src/components/ModuleButtons/ProvisionButton.tsx @@ -8,7 +8,7 @@ interface ProvisionButtonProps extends TankComponentButtonProps { provision: number; } -const provisionDefinitions = await api.provisionDefinitions(); +const provisionDefinitions = await api.provisions(); export function ProvisionButton({ provision, ...props }: ProvisionButtonProps) { const { unwrap } = useLocale(); diff --git a/packages/website/src/components/Performance/Tanks.tsx b/packages/website/src/components/Performance/Tanks.tsx index 0659def29..f2c2e5d43 100644 --- a/packages/website/src/components/Performance/Tanks.tsx +++ b/packages/website/src/components/Performance/Tanks.tsx @@ -27,7 +27,7 @@ const PREVIEW_COUNT = 10; const DEFAULT_LOADED_ROWS = 25; const [tankDefinitions, averageDefinitions] = await Promise.all([ - api.tankDefinitions(), + api.tanks(), awaitableAverageDefinitions, ]); diff --git a/packages/website/src/components/PlaylistGenerator.tsx b/packages/website/src/components/PlaylistGenerator.tsx index 513c3547a..454dbc0d6 100644 --- a/packages/website/src/components/PlaylistGenerator.tsx +++ b/packages/website/src/components/PlaylistGenerator.tsx @@ -22,7 +22,7 @@ import type { MaybeSkeletonComponentProps } from "../types/maybeSkeletonComponen import { LinkI18n } from "./LinkI18n"; import { TankSearchFilters } from "./TankSearchFilters"; -const tankDefinitions = await api.tankDefinitions(); +const tankDefinitions = await api.tanks(); const POOL_HEIGHT = "16rem"; diff --git a/packages/website/src/components/PlaylistTankEntry.tsx b/packages/website/src/components/PlaylistTankEntry.tsx index 21e62167a..2513283e7 100644 --- a/packages/website/src/components/PlaylistTankEntry.tsx +++ b/packages/website/src/components/PlaylistTankEntry.tsx @@ -14,7 +14,7 @@ interface Props extends PlaylistEntry { index: number; } -const tankDefinitions = await api.tankDefinitions(); +const tankDefinitions = await api.tanks(); export const PlaylistTankEntry = memo( ({ id, checked, then, now, index }) => { diff --git a/packages/website/src/components/ProvisionsManager.tsx b/packages/website/src/components/ProvisionsManager.tsx index 9d61baf15..195d55be6 100644 --- a/packages/website/src/components/ProvisionsManager.tsx +++ b/packages/website/src/components/ProvisionsManager.tsx @@ -9,7 +9,7 @@ interface ProvisionsManagerProps { onChange?: (provisions: number[]) => void; } -const provisionDefinitions = await api.provisionDefinitions(); +const provisionDefinitions = await api.provisions(); export function ProvisionsManager({ provisions, diff --git a/packages/website/src/components/RecentlyViewedTanks/index.tsx b/packages/website/src/components/RecentlyViewedTanks/index.tsx index 05b4e21e5..2b19921bc 100644 --- a/packages/website/src/components/RecentlyViewedTanks/index.tsx +++ b/packages/website/src/components/RecentlyViewedTanks/index.tsx @@ -11,7 +11,7 @@ import { TankCardWrapper } from "../TankCardWrapper"; import { Text } from "../Text"; import styles from "./index.module.css"; -const tankDefinitions = await api.tankDefinitions(); +const tankDefinitions = await api.tanks(); export function RecentlyViewedTanks() { const filters = TankFilters.use(); diff --git a/packages/website/src/components/TankCard/index.tsx b/packages/website/src/components/TankCard/index.tsx index f47d0e420..deecfc0fc 100644 --- a/packages/website/src/components/TankCard/index.tsx +++ b/packages/website/src/components/TankCard/index.tsx @@ -21,7 +21,7 @@ type TankCardProps = { compact?: boolean; }; -const tankDefinitions = await api.tankDefinitions(); +const tankDefinitions = await api.tanks(); export const TankCard = (props: MaybeSkeletonComponentProps) => { if (props.skeleton) { diff --git a/packages/website/src/components/TankSearch/components/Card.tsx b/packages/website/src/components/TankSearch/components/Card.tsx index 97182487a..ca75714a5 100644 --- a/packages/website/src/components/TankSearch/components/Card.tsx +++ b/packages/website/src/components/TankSearch/components/Card.tsx @@ -15,7 +15,7 @@ interface TankSearchCardProps { onSelect?: (tank: TankDefinition) => void; } -const modelDefinitions = await api.modelDefinitions(); +const modelDefinitions = await api.models(); export function TankSearchCard({ tank, onSelect }: TankSearchCardProps) { const by = TankSort.use((state) => state.by); diff --git a/packages/website/src/components/TankSearch/index.tsx b/packages/website/src/components/TankSearch/index.tsx index ab8360eeb..1ac52e8a7 100644 --- a/packages/website/src/components/TankSearch/index.tsx +++ b/packages/website/src/components/TankSearch/index.tsx @@ -45,9 +45,9 @@ export type TankSearchProps = MaybeSkeletonComponentProps & { const [gameDefinitions, modelDefinitions, tankDefinitions, tankNames] = await Promise.all([ - api.gameDefinitions(), - api.modelDefinitions(), - api.tankDefinitions(), + api.game(), + api.models(), + api.tanks(), awaitableTankNames, ]); diff --git a/packages/website/src/components/TankSearchFilters/index.tsx b/packages/website/src/components/TankSearchFilters/index.tsx index 978ca803f..baa0fd4a5 100644 --- a/packages/website/src/components/TankSearchFilters/index.tsx +++ b/packages/website/src/components/TankSearchFilters/index.tsx @@ -1,19 +1,19 @@ import { - alias, - GunDefinition, - ShellType, - TANK_CLASSES, - TANK_TYPES, - TankType, - TIER_ROMAN_NUMERALS, + alias, + GunDefinition, + ShellType, + TANK_CLASSES, + TANK_TYPES, + TankType, + TIER_ROMAN_NUMERALS, } from "@blitzkit/core"; import { literals } from "@blitzkit/i18n"; import locales from "@blitzkit/i18n/locales.json"; import { - LockClosedIcon, - LockOpen2Icon, - ResetIcon, - TrashIcon, + LockClosedIcon, + LockOpen2Icon, + ResetIcon, + TrashIcon, } from "@radix-ui/react-icons"; import { times } from "lodash-es"; import { Fragment, type ComponentProps, type ReactNode } from "react"; @@ -37,10 +37,10 @@ import { Text } from "../Text"; import { Tooltip } from "../Tooltip"; import styles from "./index.module.css"; -const gameDefinitions = await api.gameDefinitions(); -const consumableDefinitions = await api.consumableDefinitions(); -const provisionDefinitions = await api.provisionDefinitions(); -const tankDefinitions = await api.tankDefinitions(); +const gameDefinitions = await api.game(); +const consumableDefinitions = await api.consumables(); +const provisionDefinitions = await api.provisions(); +const tankDefinitions = await api.tanks(); const gameModeRoleSets: Record> = {}; diff --git a/packages/website/src/components/Tankopedia/CalloutsSection.tsx b/packages/website/src/components/Tankopedia/CalloutsSection.tsx index b3e2d5b39..567240013 100644 --- a/packages/website/src/components/Tankopedia/CalloutsSection.tsx +++ b/packages/website/src/components/Tankopedia/CalloutsSection.tsx @@ -10,7 +10,7 @@ import { AesonPlug } from "../AesonPlug"; import { ExperimentIcon } from "../ExperimentIcon"; import { MAX_RECENTLY_VIEWED } from "../TankSearch/constants"; -const tankDefinitions = await api.tankDefinitions(); +const tankDefinitions = await api.tanks(); 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 ff4118528..e9785a401 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 @@ -11,7 +11,7 @@ import { InfoWithDelta } from "./InfoWithDelta"; import { StatsTableWrapper } from "./StatsTableWrapper"; import type { StatsAcceptorProps } from "./TraverseVisualizer"; -const provisionDefinitions = await api.provisionDefinitions(); +const provisionDefinitions = await api.provisions(); 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/GunFlexibilityVisualizer/components/CanvasContent.tsx b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/GunFlexibilityVisualizer/components/CanvasContent.tsx index 2f1d7342c..7d4f65ee8 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 @@ -9,7 +9,7 @@ import { import { Duel } from "../../../../../../../../stores/duel"; import { ModelChunk } from "./ModelChunk"; -const modelDefinitions = await api.modelDefinitions(); +const modelDefinitions = await api.models(); 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 a32c75cb9..2182e8c2b 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 @@ -5,7 +5,7 @@ import { jsxTree } from "../../../../../../../../core/blitzkit/jsxTree"; import { useModel } from "../../../../../../../../hooks/useModel"; import { Duel } from "../../../../../../../../stores/duel"; -const modelDefinitions = await api.modelDefinitions(); +const modelDefinitions = await api.models(); 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 171c1a73d..6d8199444 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 @@ -20,7 +20,7 @@ import { FlexibilityCanvas } from "./components/FlexibilityCanvas"; const ANGLE_COEFFICIENT = 1 / 10; -const modelDefinition = await api.modelDefinitions(); +const modelDefinition = await api.models(); 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 7d910738d..446f68091 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 @@ -37,11 +37,11 @@ const [ modelDefinitions, skillDefinitions, ] = await Promise.all([ - api.tankDefinitions(), - api.provisionDefinitions(), - api.equipmentDefinitions(), - api.modelDefinitions(), - api.skillDefinitions(), + api.tanks(), + api.provisions(), + api.equipment(), + api.models(), + api.skill(), ]); export const InfoWithDelta = memo( diff --git a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/index.tsx b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/index.tsx index 5343362c1..e387ba9e3 100644 --- a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/index.tsx +++ b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/index.tsx @@ -15,8 +15,8 @@ import { Maneuverability } from "./components/Maneuverability"; import { Survivability } from "./components/Survivability"; const [equipmentDefinitions, provisionDefinitions] = await Promise.all([ - api.equipmentDefinitions(), - api.provisionDefinitions(), + api.equipment(), + api.provisions(), ]); export function Characteristics({ skeleton }: MaybeSkeletonComponentProps) { diff --git a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Consumables.tsx b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Consumables.tsx index 7be344f1c..43fc2322f 100644 --- a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Consumables.tsx +++ b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Consumables.tsx @@ -15,7 +15,7 @@ import { Duel } from "../../../../stores/duel"; import { ConsumablesManager } from "../../../ConsumablesManager"; import { ConfigurationChildWrapper } from "./ConfigurationChildWrapper"; -const consumableDefinitions = await api.consumableDefinitions(); +const consumableDefinitions = await api.consumables(); export function Consumables() { const protagonist = Duel.use((state) => state.protagonist); diff --git a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Equipment.tsx b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Equipment.tsx index 17871441e..f90be0e4a 100644 --- a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Equipment.tsx +++ b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Equipment.tsx @@ -5,7 +5,7 @@ import { Duel } from "../../../../stores/duel"; import { EquipmentManager } from "../../../EquipmentManager"; import { ConfigurationChildWrapper } from "./ConfigurationChildWrapper"; -const equipmentDefinitions = await api.equipmentDefinitions(); +const equipmentDefinitions = await api.equipment(); export function Equipment() { const protagonist = Duel.use((state) => state.protagonist); diff --git a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Modules.tsx b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Modules.tsx index cd44eeb82..c0ca124d8 100644 --- a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Modules.tsx +++ b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Modules.tsx @@ -156,7 +156,7 @@ function ModuleButton({ return {node}; } -const tankDefinitions = await api.tankDefinitions(); +const tankDefinitions = await api.tanks(); 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 0be27f492..4bbc77e25 100644 --- a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Provisions.tsx +++ b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Provisions.tsx @@ -6,7 +6,7 @@ import { Duel } from "../../../../stores/duel"; import { ProvisionsManager } from "../../../ProvisionsManager"; import { ConfigurationChildWrapper } from "./ConfigurationChildWrapper"; -const provisionDefinitions = await api.provisionDefinitions(); +const provisionDefinitions = await api.provisions(); 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 41ea483b4..58b5d9452 100644 --- a/packages/website/src/components/Tankopedia/GameModeSection.tsx +++ b/packages/website/src/components/Tankopedia/GameModeSection.tsx @@ -5,11 +5,7 @@ import { useLocale } from "../../hooks/useLocale"; import { Duel } from "../../stores/duel"; const [gameDefinitions, consumableDefinitions, provisionDefinitions] = - await Promise.all([ - api.gameDefinitions(), - api.consumableDefinitions(), - api.provisionDefinitions(), - ]); + await Promise.all([api.game(), api.consumables(), api.provisions()]); export function GameModeSection() { const { unwrap, strings } = useLocale(); diff --git a/packages/website/src/components/Tankopedia/HeroSection/components/TankSandbox/components/Control.tsx b/packages/website/src/components/Tankopedia/HeroSection/components/TankSandbox/components/Control.tsx index a18f10173..754d40ba4 100644 --- a/packages/website/src/components/Tankopedia/HeroSection/components/TankSandbox/components/Control.tsx +++ b/packages/website/src/components/Tankopedia/HeroSection/components/TankSandbox/components/Control.tsx @@ -21,7 +21,7 @@ const poseDistances: Record = { const inspectModeInitialPosition = new Vector3(-8, 2, -13); -const modelDefinitions = await api.modelDefinitions(); +const modelDefinitions = await api.models(); 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 351f2d19b..1929a6050 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 @@ -5,7 +5,7 @@ import { api } from "../../../../../../core/blitzkit/api"; import { modelTransformEvent } from "../../../../../../core/blitzkit/modelTransform"; import { Duel } from "../../../../../../stores/duel"; -const modelDefinitions = await api.modelDefinitions(); +const modelDefinitions = await api.models(); 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 11f13d58e..f9d58e6e0 100644 --- a/packages/website/src/components/Tankopedia/HeroSection/index.tsx +++ b/packages/website/src/components/Tankopedia/HeroSection/index.tsx @@ -12,7 +12,7 @@ import { Options } from "./components/Options"; import { TankSandbox } from "./components/TankSandbox"; import { Title } from "./components/TankSandbox/Title"; -const tankDefinitions = await api.tankDefinitions(); +const tankDefinitions = await api.tanks(); export function HeroSection({ skeleton }: MaybeSkeletonComponentProps) { const equalize = Duel.use((state) => state.equalize); diff --git a/packages/website/src/components/Tankopedia/TechTreeSection/components/Node.tsx b/packages/website/src/components/Tankopedia/TechTreeSection/components/Node.tsx index 5a710564e..f700cd7bf 100644 --- a/packages/website/src/components/Tankopedia/TechTreeSection/components/Node.tsx +++ b/packages/website/src/components/Tankopedia/TechTreeSection/components/Node.tsx @@ -15,7 +15,7 @@ type NodeProps = MaybeSkeletonComponentProps & { }; const [tankDefinitions, averageDefinitions] = await Promise.all([ - api.tankDefinitions(), + api.tanks(), awaitableAverageDefinitions, ]); diff --git a/packages/website/src/components/Tankopedia/TechTreeSection/index.tsx b/packages/website/src/components/Tankopedia/TechTreeSection/index.tsx index ab6119b1c..113ffd52d 100644 --- a/packages/website/src/components/Tankopedia/TechTreeSection/index.tsx +++ b/packages/website/src/components/Tankopedia/TechTreeSection/index.tsx @@ -13,7 +13,7 @@ import { Node } from "./components/Node"; type Line = number[]; -const tankDefinitions = await api.tankDefinitions(); +const tankDefinitions = await api.tanks(); export const XP_MULTIPLIERS = [1, 2, 3, 4, 5, 10]; diff --git a/packages/website/src/components/TierList/Row/index.tsx b/packages/website/src/components/TierList/Row/index.tsx index 107251a93..2e5ba6024 100644 --- a/packages/website/src/components/TierList/Row/index.tsx +++ b/packages/website/src/components/TierList/Row/index.tsx @@ -10,7 +10,7 @@ interface TierListRowProps { index: number; } -const tankDefinitions = await api.tankDefinitions(); +const tankDefinitions = await api.tanks(); export function TierListRow({ index }: TierListRowProps) { const tanks = TierList.use((state) => state.rows[index].tanks); diff --git a/packages/website/src/components/TierList/Tiles.tsx b/packages/website/src/components/TierList/Tiles.tsx index fa75715cb..b73a349e6 100644 --- a/packages/website/src/components/TierList/Tiles.tsx +++ b/packages/website/src/components/TierList/Tiles.tsx @@ -6,13 +6,13 @@ import { api } from "../../core/blitzkit/api"; import { filterTanks } from "../../core/blitzkit/filterTanks"; import { TankFilters } from "../../stores/tankFilters"; import { TierList } from "../../stores/tierList"; -import { TankCardWrapper } from "../TankCardWrapper"; import { TankCardSkeleton } from "../TankCardSkeleton"; +import { TankCardWrapper } from "../TankCardWrapper"; import { TierListTile } from "./Tile"; const [tankDefinitions, gameDefinitions] = await Promise.all([ - api.tankDefinitions(), - api.gameDefinitions(), + api.tanks(), + api.game(), ]); const tanks = Object.values(tankDefinitions.tanks); diff --git a/packages/website/src/components/TierList/URLManager.tsx b/packages/website/src/components/TierList/URLManager.tsx index 33693b317..e89c36036 100644 --- a/packages/website/src/components/TierList/URLManager.tsx +++ b/packages/website/src/components/TierList/URLManager.tsx @@ -3,7 +3,7 @@ import { api } from "../../core/blitzkit/api"; import { generateTierListParams } from "../../core/blitzkit/generateTierListParams"; import { TierList } from "../../stores/tierList"; -const tankDefinitions = await api.tankDefinitions(); +const tankDefinitions = await api.tanks(); export function URLManager() { const rows = TierList.use((state) => state.rows); diff --git a/packages/website/src/config/socials.ts b/packages/website/src/config/socials.ts new file mode 100644 index 000000000..36f8189b5 --- /dev/null +++ b/packages/website/src/config/socials.ts @@ -0,0 +1 @@ +export const discordLink = "https://discord.gg/nDt7AjGJQH"; diff --git a/packages/website/src/core/awaitables/averageDefinitions.ts b/packages/website/src/core/awaitables/averageDefinitions.ts index 9d21ebe9a..99c944156 100644 --- a/packages/website/src/core/awaitables/averageDefinitions.ts +++ b/packages/website/src/core/awaitables/averageDefinitions.ts @@ -1,3 +1 @@ -import { fetchAverageDefinitions } from '@blitzkit/core'; - -export const awaitableAverageDefinitions = fetchAverageDefinitions(); +export const awaitableAverageDefinitions = fetchAverage(); diff --git a/packages/website/src/core/awaitables/discoveredIdsDefinitions.ts b/packages/website/src/core/awaitables/discoveredIdsDefinitions.ts index 56f046d74..1a10022d0 100644 --- a/packages/website/src/core/awaitables/discoveredIdsDefinitions.ts +++ b/packages/website/src/core/awaitables/discoveredIdsDefinitions.ts @@ -1,4 +1 @@ -import { fetchDiscoveredIdsDefinitions } from '@blitzkit/core'; - -export const awaitableDiscoveredIdsDefinitions = - fetchDiscoveredIdsDefinitions(); +export const awaitableDiscoveredIdsDefinitions = fetchDiscoveredIds(); diff --git a/packages/website/src/core/blitzkit/api.ts b/packages/website/src/core/blitzkit/api.ts index 3342bd765..a90c17ad2 100644 --- a/packages/website/src/core/blitzkit/api.ts +++ b/packages/website/src/core/blitzkit/api.ts @@ -1,20 +1,4 @@ -import type { BlitzKitAPI } from "@blitzkit/core/src/blitzkit/api/base"; +import { createDynamicAPI } from "@blitzkit/core"; +import { vfs } from "./vfs"; -let _api: BlitzKitAPI; - -if (import.meta.env.SSR) { - const { ServerBlitzKitAPI } = await import( - "@blitzkit/core/src/blitzkit/api/server/index" - ); - const { vfs } = await import("./vfs"); - - _api = await new ServerBlitzKitAPI(vfs).init(); -} else { - const { ClientBlitzKitAPI } = await import( - "@blitzkit/core/src/blitzkit/api/client" - ); - - _api = new ClientBlitzKitAPI(); -} - -export const api = _api; +export const api = await createDynamicAPI(vfs); diff --git a/packages/website/src/core/blitzkit/curateMixer.ts b/packages/website/src/core/blitzkit/curateMixer.ts index 0782efd49..eb0761785 100644 --- a/packages/website/src/core/blitzkit/curateMixer.ts +++ b/packages/website/src/core/blitzkit/curateMixer.ts @@ -1,7 +1,7 @@ import { api } from "./api"; -const tankDefinitions = await api.tankDefinitions(); -const modelDefinitions = await api.modelDefinitions(); +const tankDefinitions = await api.tanks(); +const modelDefinitions = await api.models(); const tanks = Object.values(tankDefinitions.tanks).filter((tank) => { const tankModel = modelDefinitions.models[tank.id]; diff --git a/packages/website/src/core/blitzkit/filterTank.ts b/packages/website/src/core/blitzkit/filterTank.ts index 91c808b56..16eb2c2c4 100644 --- a/packages/website/src/core/blitzkit/filterTank.ts +++ b/packages/website/src/core/blitzkit/filterTank.ts @@ -6,9 +6,9 @@ import { api } from "./api"; const SHELLS = times(3, (index) => index); -const consumableDefinitions = await api.consumableDefinitions(); -const provisionDefinitions = await api.provisionDefinitions(); -const gameDefinitions = await api.gameDefinitions(); +const consumableDefinitions = await api.consumables(); +const provisionDefinitions = await api.provisions(); +const gameDefinitions = await api.game(); export async function filterTank( filters: TankFilters, diff --git a/packages/website/src/core/blitzkit/generatePlaylist.ts b/packages/website/src/core/blitzkit/generatePlaylist.ts index f0fd87bdb..98e4ae7e2 100644 --- a/packages/website/src/core/blitzkit/generatePlaylist.ts +++ b/packages/website/src/core/blitzkit/generatePlaylist.ts @@ -10,7 +10,7 @@ import { TankFilters } from "../../stores/tankFilters"; import { api } from "./api"; import { filterTanks } from "./filterTanks"; -const tankDefinitions = await api.tankDefinitions(); +const tankDefinitions = await api.tanks(); const tanks = Object.values(tankDefinitions.tanks); export async function generatePlaylist() { diff --git a/packages/website/src/core/blitzkit/hasEquipment.ts b/packages/website/src/core/blitzkit/hasEquipment.ts index 61e2aed5b..3c9836d0a 100644 --- a/packages/website/src/core/blitzkit/hasEquipment.ts +++ b/packages/website/src/core/blitzkit/hasEquipment.ts @@ -1,7 +1,7 @@ import type { EquipmentMatrix } from "../../stores/duel"; import { api } from "./api"; -const equipmentDefinitions = await api.equipmentDefinitions(); +const equipmentDefinitions = await api.equipment(); export function hasEquipment( id: number, diff --git a/packages/website/src/hocs/withErrorWrapper.tsx b/packages/website/src/hocs/withErrorWrapper.tsx new file mode 100644 index 000000000..6a78a9656 --- /dev/null +++ b/packages/website/src/hocs/withErrorWrapper.tsx @@ -0,0 +1,14 @@ +import type { ReactNode } from "react"; +import { ErrorWrapper } from "../components/ErrorWrapper"; + +export function withErrorWrapper( + Component: (props: Props) => ReactNode, +) { + return function (props: Props) { + return ( + + + + ); + }; +} diff --git a/packages/website/src/hocs/withLocale.tsx b/packages/website/src/hocs/withLocale.tsx new file mode 100644 index 000000000..fc7993ce2 --- /dev/null +++ b/packages/website/src/hocs/withLocale.tsx @@ -0,0 +1,18 @@ +import type { ReactNode } from "react"; +import { LocaleProvider } from "../hooks/useLocale"; + +interface WithLocaleProps { + locale: string; +} + +export function withLocale( + Component: (props: Props) => ReactNode, +) { + return function ({ locale, ...props }: Props & WithLocaleProps) { + return ( + + + + ); + }; +} diff --git a/packages/website/src/hooks/useAwait.ts b/packages/website/src/hooks/useAwait.ts new file mode 100644 index 000000000..2ac3b2438 --- /dev/null +++ b/packages/website/src/hooks/useAwait.ts @@ -0,0 +1,19 @@ +import { use } from "react"; + +const cache = new Map>(); + +export function useAwait( + creator: () => Promise, + discriminator: string, +) { + let promise; + + if (cache.has(discriminator)) { + promise = cache.get(discriminator) as Promise; + } else { + promise = creator(); + cache.set(discriminator, promise); + } + + return use(promise); +} diff --git a/packages/website/src/hooks/useEccentricity.ts b/packages/website/src/hooks/useEccentricity.ts index 173c60fe3..1e48ef59f 100644 --- a/packages/website/src/hooks/useEccentricity.ts +++ b/packages/website/src/hooks/useEccentricity.ts @@ -9,7 +9,7 @@ export enum UseEccentricityMode { Class, } -const tankDefinitions = await api.tankDefinitions(); +const tankDefinitions = await api.tanks(); export function useEccentricity(mode: UseEccentricityMode) { const tank = Duel.use((state) => state.protagonist.tank); diff --git a/packages/website/src/hooks/useEquipment.ts b/packages/website/src/hooks/useEquipment.ts index 9f5ffd57a..3cbeb325e 100644 --- a/packages/website/src/hooks/useEquipment.ts +++ b/packages/website/src/hooks/useEquipment.ts @@ -2,7 +2,7 @@ import { useMemo } from "react"; import { api } from "../core/blitzkit/api"; import { Duel } from "../stores/duel"; -const equipmentDefinitions = await api.equipmentDefinitions(); +const equipmentDefinitions = await api.equipment(); export function useEquipment(id: number, antagonist = false) { const member = Duel.use( diff --git a/packages/website/src/hooks/useEquipmentPreset.ts b/packages/website/src/hooks/useEquipmentPreset.ts index 294f7f988..157f8d4af 100644 --- a/packages/website/src/hooks/useEquipmentPreset.ts +++ b/packages/website/src/hooks/useEquipmentPreset.ts @@ -1,6 +1,6 @@ import { api } from "../core/blitzkit/api"; -const equipmentDefinitions = await api.equipmentDefinitions(); +const equipmentDefinitions = await api.equipment(); export function useEquipmentPreset(preset: string) { return equipmentDefinitions.presets[preset]; diff --git a/packages/website/src/pages/[...chunk_api]/definitions/camouflage.pb.ts b/packages/website/src/pages/[...chunk_api]/definitions/camouflage.pb.ts index 15dea60ce..0739f9403 100644 --- a/packages/website/src/pages/[...chunk_api]/definitions/camouflage.pb.ts +++ b/packages/website/src/pages/[...chunk_api]/definitions/camouflage.pb.ts @@ -4,7 +4,7 @@ import { api } from "../../../core/blitzkit/api"; export { getStaticPaths } from "../_index"; export async function GET() { - const definitions = await api.camouflageDefinitions(); + const definitions = await api.camouflage(); const bytes = CamouflageDefinitions.encode(definitions).finish(); return new Response(bytes); diff --git a/packages/website/src/pages/[...chunk_api]/definitions/consumables.pb.ts b/packages/website/src/pages/[...chunk_api]/definitions/consumables.pb.ts index 80b6adcf8..183e13b4e 100644 --- a/packages/website/src/pages/[...chunk_api]/definitions/consumables.pb.ts +++ b/packages/website/src/pages/[...chunk_api]/definitions/consumables.pb.ts @@ -4,7 +4,7 @@ import { api } from "../../../core/blitzkit/api"; export { getStaticPaths } from "../_index"; export async function GET() { - const definitions = await api.consumableDefinitions(); + const definitions = await api.consumables(); const bytes = ConsumableDefinitions.encode(definitions).finish(); return new Response(bytes); diff --git a/packages/website/src/pages/[...chunk_api]/definitions/equipment.pb.ts b/packages/website/src/pages/[...chunk_api]/definitions/equipment.pb.ts index 3691eb377..02ea8e219 100644 --- a/packages/website/src/pages/[...chunk_api]/definitions/equipment.pb.ts +++ b/packages/website/src/pages/[...chunk_api]/definitions/equipment.pb.ts @@ -4,7 +4,7 @@ import { api } from "../../../core/blitzkit/api"; export { getStaticPaths } from "../_index"; export async function GET() { - const definitions = await api.equipmentDefinitions(); + const definitions = await api.equipment(); const bytes = EquipmentDefinitions.encode(definitions).finish(); return new Response(bytes); diff --git a/packages/website/src/pages/[...chunk_api]/definitions/gallery.pb.ts b/packages/website/src/pages/[...chunk_api]/definitions/gallery.pb.ts index 49453741e..5c6d0ae74 100644 --- a/packages/website/src/pages/[...chunk_api]/definitions/gallery.pb.ts +++ b/packages/website/src/pages/[...chunk_api]/definitions/gallery.pb.ts @@ -4,7 +4,7 @@ import { api } from "../../../core/blitzkit/api"; export { getStaticPaths } from "../_index"; export async function GET() { - const definitions = await api.galleryDefinitions(); + const definitions = await api.gallery(); const bytes = Gallery.encode(definitions).finish(); return new Response(bytes); diff --git a/packages/website/src/pages/[...chunk_api]/definitions/game.pb.ts b/packages/website/src/pages/[...chunk_api]/definitions/game.pb.ts index 86200f605..942c2f5b0 100644 --- a/packages/website/src/pages/[...chunk_api]/definitions/game.pb.ts +++ b/packages/website/src/pages/[...chunk_api]/definitions/game.pb.ts @@ -4,7 +4,7 @@ import { api } from "../../../core/blitzkit/api"; export { getStaticPaths } from "../_index"; export async function GET() { - const definitions = await api.gameDefinitions(); + const definitions = await api.game(); const bytes = GameDefinitions.encode(definitions).finish(); return new Response(bytes); diff --git a/packages/website/src/pages/[...chunk_api]/definitions/maps.pb.ts b/packages/website/src/pages/[...chunk_api]/definitions/maps.pb.ts index ab00586af..2fc081fb8 100644 --- a/packages/website/src/pages/[...chunk_api]/definitions/maps.pb.ts +++ b/packages/website/src/pages/[...chunk_api]/definitions/maps.pb.ts @@ -4,7 +4,7 @@ import { api } from "../../../core/blitzkit/api"; export { getStaticPaths } from "../_index"; export async function GET() { - const definitions = await api.mapDefinitions(); + const definitions = await api.map(); const bytes = MapDefinitions.encode(definitions).finish(); return new Response(bytes); diff --git a/packages/website/src/pages/[...chunk_api]/definitions/models.pb.ts b/packages/website/src/pages/[...chunk_api]/definitions/models.pb.ts index 2399851bd..9a5917ba9 100644 --- a/packages/website/src/pages/[...chunk_api]/definitions/models.pb.ts +++ b/packages/website/src/pages/[...chunk_api]/definitions/models.pb.ts @@ -4,7 +4,7 @@ import { api } from "../../../core/blitzkit/api"; export { getStaticPaths } from "../_index"; export async function GET() { - const definitions = await api.modelDefinitions(); + const definitions = await api.models(); const bytes = ModelDefinitions.encode(definitions).finish(); return new Response(bytes); diff --git a/packages/website/src/pages/[...chunk_api]/definitions/provisions.pb.ts b/packages/website/src/pages/[...chunk_api]/definitions/provisions.pb.ts index c352900e1..f6a649645 100644 --- a/packages/website/src/pages/[...chunk_api]/definitions/provisions.pb.ts +++ b/packages/website/src/pages/[...chunk_api]/definitions/provisions.pb.ts @@ -4,7 +4,7 @@ import { api } from "../../../core/blitzkit/api"; export { getStaticPaths } from "../_index"; export async function GET() { - const definitions = await api.provisionDefinitions(); + const definitions = await api.provisions(); const bytes = ProvisionDefinitions.encode(definitions).finish(); return new Response(bytes); diff --git a/packages/website/src/pages/[...chunk_api]/definitions/skills.pb.ts b/packages/website/src/pages/[...chunk_api]/definitions/skills.pb.ts index dd0baddec..eeae20428 100644 --- a/packages/website/src/pages/[...chunk_api]/definitions/skills.pb.ts +++ b/packages/website/src/pages/[...chunk_api]/definitions/skills.pb.ts @@ -4,7 +4,7 @@ import { api } from "../../../core/blitzkit/api"; export { getStaticPaths } from "../_index"; export async function GET() { - const definitions = await api.skillDefinitions(); + const definitions = await api.skill(); const bytes = SkillDefinitions.encode(definitions).finish(); return new Response(bytes); diff --git a/packages/website/src/pages/[...chunk_api]/definitions/tanks.pb.ts b/packages/website/src/pages/[...chunk_api]/definitions/tanks.pb.ts index 5976401f9..556ec3bdb 100644 --- a/packages/website/src/pages/[...chunk_api]/definitions/tanks.pb.ts +++ b/packages/website/src/pages/[...chunk_api]/definitions/tanks.pb.ts @@ -4,7 +4,7 @@ import { api } from "../../../core/blitzkit/api"; export { getStaticPaths } from "../_index"; export async function GET() { - const definitions = await api.tankDefinitions(); + const definitions = await api.tanks(); const bytes = TankDefinitions.encode(definitions).finish(); return new Response(bytes); diff --git a/packages/website/src/pages/[...chunk_api]/tanks/[id]/_index.ts b/packages/website/src/pages/[...chunk_api]/tanks/[id]/_index.ts index 8ea202dcb..388ea05f2 100644 --- a/packages/website/src/pages/[...chunk_api]/tanks/[id]/_index.ts +++ b/packages/website/src/pages/[...chunk_api]/tanks/[id]/_index.ts @@ -3,7 +3,7 @@ import { mixStaticPaths } from "../../../../core/blitzkit/mixStaticPaths"; import { getStaticPaths as _getStaticPaths } from "../../_index"; export const getStaticPaths = mixStaticPaths(_getStaticPaths, async () => { - const tanks = await api.tankDefinitions(); + const tanks = await api.tanks(); return Object.values(tanks.tanks).map((tank) => ({ params: { id: tank.id }, diff --git a/packages/website/src/pages/[...chunk_default]/[...locale]/avatars/_index.tsx b/packages/website/src/pages/[...chunk_default]/[...locale]/avatars/_index.tsx index f8ac2e49a..0ebe62d24 100644 --- a/packages/website/src/pages/[...chunk_default]/[...locale]/avatars/_index.tsx +++ b/packages/website/src/pages/[...chunk_default]/[...locale]/avatars/_index.tsx @@ -1,6 +1,5 @@ -import { GalleryList } from "../../../../components/Gallery/List"; -import { GallerySearch } from "../../../../components/Gallery/Search"; -import { PageWrapper } from "../../../../components/PageWrapper"; +import { AvatarsSearch } from "../../../../components/Avatars/Search"; +import { AvatarsList } from "../../../../components/AvatarsList"; import { LocaleProvider, type LocaleAcceptorProps, @@ -20,9 +19,9 @@ export function Page({ function Content({ skeleton }: MaybeSkeletonComponentProps) { return ( - - - - + <> + + + ); } diff --git a/packages/website/src/pages/[...chunk_default]/[...locale]/avatars/index.astro b/packages/website/src/pages/[...chunk_default]/[...locale]/avatars/index.astro index c5e321f5f..c6d2e320f 100644 --- a/packages/website/src/pages/[...chunk_default]/[...locale]/avatars/index.astro +++ b/packages/website/src/pages/[...chunk_default]/[...locale]/avatars/index.astro @@ -1,7 +1,8 @@ --- +import { Section } from "../../../../components/Section"; +import ToolBanner from "../../../../components/ToolBanner.astro"; import { tools } from "../../../../constants/tools"; -import ToolLayout from "../../../../layouts/ToolLayout.astro"; -import type { getStaticPaths } from "../index.astro"; +import BaseLayout from "../../../../layouts/BaseLayout.astro"; import { Page } from "./_index"; export { getStaticPaths } from "../index.astro"; @@ -9,8 +10,12 @@ export { getStaticPaths } from "../index.astro"; const { locale } = Astro.props; --- - - - - - + + + +
+ + + +
+
diff --git a/packages/website/src/pages/[...chunk_default]/[...locale]/compare/_index.tsx b/packages/website/src/pages/[...chunk_default]/[...locale]/compare/_index.tsx index 11fbb13af..f1c25952e 100644 --- a/packages/website/src/pages/[...chunk_default]/[...locale]/compare/_index.tsx +++ b/packages/website/src/pages/[...chunk_default]/[...locale]/compare/_index.tsx @@ -20,11 +20,11 @@ const [ skillDefinitions, tankDefinitions, ] = await Promise.all([ - api.modelDefinitions(), - api.equipmentDefinitions(), - api.provisionDefinitions(), - api.skillDefinitions(), - api.tankDefinitions(), + api.models(), + api.equipment(), + api.provisions(), + api.skill(), + api.tanks(), ]); export function Page({ locale }: LocaleAcceptorProps) { diff --git a/packages/website/src/pages/[...chunk_default]/[...locale]/guess/_index.tsx b/packages/website/src/pages/[...chunk_default]/[...locale]/guess/_index.tsx index 4cdcb0744..44e2985b7 100644 --- a/packages/website/src/pages/[...chunk_default]/[...locale]/guess/_index.tsx +++ b/packages/website/src/pages/[...chunk_default]/[...locale]/guess/_index.tsx @@ -17,8 +17,8 @@ import { Tankopedia } from "../../../../stores/tankopedia"; import type { MaybeSkeletonComponentProps } from "../../../../types/maybeSkeletonComponentProps"; const [tankDefinitions, modelDefinitions] = await Promise.all([ - api.tankDefinitions(), - api.modelDefinitions(), + api.tanks(), + api.models(), ]); const ids = Object.keys(tankDefinitions.tanks); diff --git a/packages/website/src/pages/[...chunk_default]/[...locale]/mixer/_index.tsx b/packages/website/src/pages/[...chunk_default]/[...locale]/mixer/_index.tsx index 2346fc2d9..6ff332013 100644 --- a/packages/website/src/pages/[...chunk_default]/[...locale]/mixer/_index.tsx +++ b/packages/website/src/pages/[...chunk_default]/[...locale]/mixer/_index.tsx @@ -35,10 +35,8 @@ import { Mixer } from "../../../../stores/mixer"; import { Tankopedia } from "../../../../stores/tankopedia"; import type { MaybeSkeletonComponentProps } from "../../../../types/maybeSkeletonComponentProps"; -const modelDefinition = await api - .modelDefinitions() - .then(({ models }) => models[1]); -const tankDefinitions = await api.tankDefinitions(); +const modelDefinition = await api.models().then(({ models }) => models[1]); +const tankDefinitions = await api.tanks(); export function Page({ locale, diff --git a/packages/website/src/pages/[...chunk_default]/[...locale]/session/_index.tsx b/packages/website/src/pages/[...chunk_default]/[...locale]/session/_index.tsx index 5706a3ace..63472d04b 100644 --- a/packages/website/src/pages/[...chunk_default]/[...locale]/session/_index.tsx +++ b/packages/website/src/pages/[...chunk_default]/[...locale]/session/_index.tsx @@ -47,7 +47,7 @@ import { import { Session, type SessionTracking } from "../../../../stores/session"; const [tankDefinitions, averageDefinitions] = await Promise.all([ - api.tankDefinitions(), + api.tanks(), awaitableAverageDefinitions, ]); diff --git a/packages/website/src/pages/[...chunk_default]/[...locale]/tanks/[slug]/_index.module.css b/packages/website/src/pages/[...chunk_default]/[...locale]/tanks/[slug]/_index.module.css new file mode 100644 index 000000000..5dd7a7e03 --- /dev/null +++ b/packages/website/src/pages/[...chunk_default]/[...locale]/tanks/[slug]/_index.module.css @@ -0,0 +1,23 @@ +.page { + max-height: 100dvh; + flex-grow: 1; + display: flex; + + .sandbox { + flex-grow: 1; + + overflow-y: auto; + } + + .loadout { + display: flex; + flex-direction: column; + + gap: var(--space-5); + padding: var(--space-5); + + overflow-y: auto; + + background-color: var(--gray-2); + } +} 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 4b24fe18e..b97c2eade 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,55 +1,45 @@ -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 { useMemo } from "react"; import { api } from "../../../../../core/blitzkit/api"; -import { - LocaleProvider, - type LocaleAcceptorProps, -} from "../../../../../hooks/useLocale"; -import { Duel } from "../../../../../stores/duel"; +import { withErrorWrapper } from "../../../../../hocs/withErrorWrapper"; +import { withLocale } from "../../../../../hocs/withLocale"; +import { useAwait } from "../../../../../hooks/useAwait"; import { Tankopedia } from "../../../../../stores/tankopedia"; -import type { MaybeSkeletonComponentProps } from "../../../../../types/maybeSkeletonComponentProps"; -import type { TankGuide } from "../../../../../types/tankGuide"; +import styles from "./_index.module.css"; -type PageProps = MaybeSkeletonComponentProps & - LocaleAcceptorProps & { - id: number; - guide?: TankGuide; - }; - -const [tankDefinitions, modelDefinitions] = await Promise.all([ - api.tankDefinitions(), - api.modelDefinitions(), -]); - -export function Page({ id, skeleton, locale, guide }: PageProps) { - const tank = tankDefinitions.tanks[id]; - const model = modelDefinitions.models[id]; - - Tankopedia.useInitialization(model); - Duel.useInitialization({ tank, model }); - - return ( - - - - - - {tank.type === TankType.TANK_TYPE_RESEARCHABLE && !tank.deprecated && ( - - )} - - - {guide && } - - - - ); +interface PageProps { + id: number; } + +export const Page = withErrorWrapper( + withLocale(({ id }) => { + const protagonistTank = useAwait(() => api.tank(id), `tank-${id}`); + + Tankopedia.useInitialization(protagonistTank); + + const protagonist = Tankopedia.use((state) => state.protagonist); + const protagonistEquipment = useEquipment(protagonistTank.tank!); + + const { characteristics, parameters } = useMemo( + () => + computeCharacteristics( + protagonistTank, + protagonistEquipment, + protagonist, + ), + [protagonist], + ); + + return ( +
+
+ +
+ +
+ + +
+
+ ); + }), +); 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 67727b72b..ac7f0a0f7 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 @@ -1,130 +1,31 @@ --- -import { AstroSeo } from "@astrolib/seo"; -import { - alias, - assertSecret, - createDefaultProvisions, - createDefaultSkills, - TIER_ROMAN_NUMERALS, -} from "@blitzkit/core"; -import { unwrapper } from "@blitzkit/i18n"; -import { literals } from "@blitzkit/i18n/src/literals"; -import { load } from "cheerio"; -import { api } from "../../../../../core/blitzkit/api"; -import { mixStaticPaths } from "../../../../../core/blitzkit/mixStaticPaths"; -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 "@radix-ui/colors/violet-dark.css"; +import { api } from "../../../../api/dynamic"; +import { mixStaticPaths } from "../../../../astro/mixStaticPaths"; +import ColorScale from "../../../../components/ColorScale.astro"; +import BaseLayout from "../../../../layouts/BaseLayout.astro"; import { getStaticPaths as _getStaticPaths } from "../index.astro"; import { Page } from "./_index"; export const getStaticPaths = mixStaticPaths(_getStaticPaths, async () => { - const tankDefinitions = await api.tankDefinitions(); + const { list } = await api.tankList(); - return Object.values(tankDefinitions.tanks).map((tank) => ({ + return list.map((tank) => ({ params: { slug: tank.slug }, props: { id: tank.id }, })); }); const { id, locale } = Astro.props; -const strings = getStrings(locale); -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]; -const unwrap = unwrapper(locale); -const title = literals(strings.website.tools.tankopedia.tank_seo_title, { - name: unwrap(tank.name!), - tier: TIER_ROMAN_NUMERALS[tank.tier], - nationality: - strings.common.nations_adjectives[ - tank.nation as keyof typeof strings.common.nations_adjectives - ], - class: strings.common.tank_class_short[tank.class], - website: "BlitzKit", -}); -const url = import.meta.env.SITE + Astro.url.pathname; - -const icon = alias("api", `/tanks/${id}/icons/big.webp`); -const turret = tank.turrets.at(-1)!; -const gun = turret.guns.at(-1)!; -const shell = gun.shells[0]; -const characteristics = tankCharacteristics( - { - tank, - applyDynamicArmor: false, - applyReactiveArmor: false, - applySpallLiner: false, - camouflage: true, - consumables: [], - crewSkills: createDefaultSkills(skillDefinitions), - engine: tank.engines.at(-1)!, - equipmentMatrix: genericDefaultEquipmentMatrix, - turret, - gun, - provisions: createDefaultProvisions(tank, gun, provisionDefinitions), - shell, - stockEngine: tank.engines[0], - stockGun: tank.turrets[0].guns[0], - stockTurret: tank.turrets[0], - stockTrack: tank.tracks[0], - track: tank.tracks.at(-1)!, - assaultDistance: 0, - equalize: false, - }, - { equipmentDefinitions, provisionDefinitions, tankModelDefinition }, -); -const description = literals( - strings.website.tools.tankopedia.tank_seo_description, - { - name: unwrap(tank.name!), - dpm: Math.round(characteristics.dpm).toLocaleString(locale), - alpha: Math.round(characteristics.damage).toLocaleString(locale), - penetration: Math.round(characteristics.penetration).toLocaleString(locale), - speed: Math.round(characteristics.speedForwards).toLocaleString(locale), - health: Math.round(characteristics.health).toLocaleString(locale), - }, -); - -const guideUrl = `${assertSecret(import.meta.env.PUBLIC_GUIDE_WEBSITE)}/${tank.slug}`; -let guide: TankGuide | undefined = undefined; -const guideResponse = await fetch(guideUrl); - -if (guideResponse.ok) { - const $ = await guideResponse.text().then(load); - const description = $(".entry-content p").first().text(); - const image = $(".entry-content img").first().attr("src")?.toString(); - - if (description !== undefined || image !== undefined) { - guide = { - url: guideUrl, - description, - image, - }; - } -} --- - + + - - - - + + + + - - - - + diff --git a/packages/website/src/pages/[...chunk_default]/[...locale]/tools/tankopedia/[id]/index.astro b/packages/website/src/pages/[...chunk_default]/[...locale]/tools/tankopedia/[id]/index.astro index 68ab37b9a..78b0efb08 100644 --- a/packages/website/src/pages/[...chunk_default]/[...locale]/tools/tankopedia/[id]/index.astro +++ b/packages/website/src/pages/[...chunk_default]/[...locale]/tools/tankopedia/[id]/index.astro @@ -5,7 +5,7 @@ import LegacyRedirect from "../../../../../../layouts/LegacyRedirect.astro"; import { getStaticPaths as _getStaticPaths } from "../index.astro"; export const getStaticPaths = mixStaticPaths(_getStaticPaths, async () => { - const tankDefinitions = await api.tankDefinitions(); + const tankDefinitions = await api.tanks(); return Object.values(tankDefinitions.tanks).map(({ id }) => ({ params: { id }, @@ -14,7 +14,7 @@ export const getStaticPaths = mixStaticPaths(_getStaticPaths, async () => { const { id } = Astro.params; const { locale } = Astro.props; -const tankDefinitions = await api.tankDefinitions(); +const tankDefinitions = await api.tanks(); const tank = tankDefinitions.tanks[id]; --- diff --git a/packages/website/src/stores/duel/index.ts b/packages/website/src/stores/duel/index.ts index fef1c2463..ccd2d2294 100644 --- a/packages/website/src/stores/duel/index.ts +++ b/packages/website/src/stores/duel/index.ts @@ -44,7 +44,7 @@ export interface DuelStore { equalize: boolean; } -const provisionDefinitions = await api.provisionDefinitions(); +const provisionDefinitions = await api.provisions(); export const Duel = new Varuna< DuelStore, diff --git a/packages/website/src/stores/tankopedia.ts b/packages/website/src/stores/tankopedia.ts index d2eb8a066..5bda8954f 100644 --- a/packages/website/src/stores/tankopedia.ts +++ b/packages/website/src/stores/tankopedia.ts @@ -105,7 +105,7 @@ interface Tankopedia { statSearch?: string; } -const skillDefinitions = await api.skillDefinitions(); +const skillDefinitions = await api.skill(); export const Tankopedia = new Varuna((model) => ({ disturbed: false,