diff --git a/bun.lockb b/bun.lockb index 388393570..5940e702f 100644 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/packages/core/src/statistics/deltaBkrlBlitzStats.ts b/packages/core/src/statistics/deltaBkrlBlitzStats.ts index c33194292..7f2db3e2a 100644 --- a/packages/core/src/statistics/deltaBkrlBlitzStats.ts +++ b/packages/core/src/statistics/deltaBkrlBlitzStats.ts @@ -1,8 +1,8 @@ import { RatingStats } from '../blitz/getAccountInfo'; -import { BkrlSuperset1Entry } from '../streams/bkrl'; +import { RatingLeaderboardEntryV2 } from '../protos'; export function deltaBkrlBlitzStats( - a: BkrlSuperset1Entry, + a: RatingLeaderboardEntryV2, b1: RatingStats, b2: RatingPlayer, ) { @@ -13,7 +13,7 @@ export function deltaBkrlBlitzStats( survived: b1.survived_battles - a.survived, wins: b1.wins - a.wins, score: b2.score - a.score, - } satisfies Omit; + } satisfies Omit; } export interface RatingPlayer { spa_id: number; diff --git a/packages/website/src/components/Compare/CompareTable.tsx b/packages/website/src/components/Compare/CompareTable.tsx index cda92bb10..453f36771 100644 --- a/packages/website/src/components/Compare/CompareTable.tsx +++ b/packages/website/src/components/Compare/CompareTable.tsx @@ -1,16 +1,12 @@ -import { - asset, - availableProvisions, - fetchConsumableDefinitions, - fetchEquipmentDefinitions, - fetchProvisionDefinitions, - fetchSkillDefinitions, - permanentSkills, -} from '@blitzkit/core'; +import { asset, availableProvisions, permanentSkills } from '@blitzkit/core'; import { checkConsumableProvisionInclusivity } from '@blitzkit/core/src/blitzkit/checkConsumableProvisionInclusivity'; import { ComponentPlaceholderIcon } from '@radix-ui/react-icons'; import { Button, Flex, IconButton, Popover, Table } from '@radix-ui/themes'; import { times } from 'lodash-es'; +import { awaitableConsumableDefinitions } from '../../core/awaitables/consumableDefinitions'; +import { awaitableEquipmentDefinitions } from '../../core/awaitables/equipmentDefinitions'; +import { awaitableProvisionDefinitions } from '../../core/awaitables/provisionDefinitions'; +import { awaitableSkillDefinitions } from '../../core/awaitables/skillDefinitions'; import type { TankCharacteristics } from '../../core/blitzkit/tankCharacteristics'; import { Var } from '../../core/radix/var'; import { CompareEphemeral } from '../../stores/compareEphemeral'; @@ -31,10 +27,17 @@ interface CompareTableProps { stats: TankCharacteristics[]; } -const skillDefinitions = await fetchSkillDefinitions(); -const equipmentDefinitions = await fetchEquipmentDefinitions(); -const consumableDefinitions = await fetchConsumableDefinitions(); -const provisionDefinitions = await fetchProvisionDefinitions(); +const [ + skillDefinitions, + equipmentDefinitions, + consumableDefinitions, + provisionDefinitions, +] = await Promise.all([ + awaitableSkillDefinitions, + awaitableEquipmentDefinitions, + awaitableConsumableDefinitions, + awaitableProvisionDefinitions, +]); export function CompareTable({ stats }: CompareTableProps) { const crewSkills = CompareEphemeral.use((state) => state.crewSkills); diff --git a/packages/website/src/components/Compare/Controls.tsx b/packages/website/src/components/Compare/Controls.tsx index 68c23e8cf..50edd5113 100644 --- a/packages/website/src/components/Compare/Controls.tsx +++ b/packages/website/src/components/Compare/Controls.tsx @@ -1,6 +1,6 @@ -import { fetchProvisionDefinitions } from '@blitzkit/core'; import { PlusIcon, TrashIcon } from '@radix-ui/react-icons'; import { Button, Dialog, Flex, SegmentedControl } from '@radix-ui/themes'; +import { awaitableProvisionDefinitions } from '../../core/awaitables/provisionDefinitions'; import { tankToCompareMember } from '../../core/blitzkit/tankToCompareMember'; import { CompareEphemeral } from '../../stores/compareEphemeral'; import { @@ -14,7 +14,7 @@ interface ControlsProps { onAddTankDialogOpenChange: (open: boolean) => void; } -const provisionDefinitions = await fetchProvisionDefinitions(); +const provisionDefinitions = await awaitableProvisionDefinitions; export function Controls({ addTankDialogOpen, diff --git a/packages/website/src/components/Compare/TankControl.tsx b/packages/website/src/components/Compare/TankControl.tsx index 8bd010aa1..83d6b920f 100644 --- a/packages/website/src/components/Compare/TankControl.tsx +++ b/packages/website/src/components/Compare/TankControl.tsx @@ -1,7 +1,7 @@ -import { fetchProvisionDefinitions } from '@blitzkit/core'; import { ExternalLinkIcon, LoopIcon, TrashIcon } from '@radix-ui/react-icons'; import { Dialog, Flex, IconButton, Link } from '@radix-ui/themes'; import { useState } from 'react'; +import { awaitableProvisionDefinitions } from '../../core/awaitables/provisionDefinitions'; import { tankToCompareMember } from '../../core/blitzkit/tankToCompareMember'; import { CompareEphemeral } from '../../stores/compareEphemeral'; import { TankSearch } from '../TankSearch'; @@ -11,7 +11,7 @@ interface TankControlProps { id: number; } -const provisionDefinitions = await fetchProvisionDefinitions(); +const provisionDefinitions = await awaitableProvisionDefinitions; export function TankControl({ index, id }: TankControlProps) { const [switchTankDialogOpen, setSwitchTankDialogOpen] = useState(false); diff --git a/packages/website/src/components/CrewSkillManager.tsx b/packages/website/src/components/CrewSkillManager.tsx index 55503d557..87e459f6b 100644 --- a/packages/website/src/components/CrewSkillManager.tsx +++ b/packages/website/src/components/CrewSkillManager.tsx @@ -1,10 +1,6 @@ -import { - asset, - fetchSkillDefinitions, - permanentSkills, - romanize, -} from '@blitzkit/core'; +import { asset, permanentSkills, romanize } from '@blitzkit/core'; import { Flex } from '@radix-ui/themes'; +import { awaitableSkillDefinitions } from '../core/awaitables/skillDefinitions'; import { GenericTankComponentButton } from './ModuleButtons/GenericTankComponentButton'; interface CrewSkillManagerProps { @@ -12,7 +8,7 @@ interface CrewSkillManagerProps { onChange?: (skillLevels: Record) => void; } -const skillDefinitions = await fetchSkillDefinitions(); +const skillDefinitions = await awaitableSkillDefinitions; export function CrewSkillManager({ skillLevels, diff --git a/packages/website/src/components/Embeds/breakdown.tsx b/packages/website/src/components/Embeds/breakdown.tsx index 2beef5e25..dd77ea942 100644 --- a/packages/website/src/components/Embeds/breakdown.tsx +++ b/packages/website/src/components/Embeds/breakdown.tsx @@ -3,8 +3,6 @@ import { compositeStats, compositeStatsKeys, deltaTankStats, - fetchAverageDefinitions, - fetchTankDefinitions, getTankStats, idToRegion, sumCompositeStats, @@ -15,6 +13,8 @@ import { ReloadIcon } from '@radix-ui/react-icons'; import { ContextMenu } from '@radix-ui/themes'; import { useEffect, useMemo, useState } from 'react'; import { breakdownConfig } from '../../constants/embeds'; +import { awaitableAverageDefinitions } from '../../core/awaitables/averageDefinitions'; +import { awaitableTankDefinitions } from '../../core/awaitables/tankDefinitions'; import { EmbedBreakdownPersistent } from '../../stores/embedBreakdownPersistent'; import { useEmbedStateCurry } from '../../stores/embedState/utilities'; import { BreakdownEmbedCard, BreakdownEmbedWrapper } from '../TanksEmbed'; @@ -24,8 +24,10 @@ export const compositeStatsKeysOptions = compositeStatsKeys.map((value) => ({ value, })); -const tankDefinitions = await fetchTankDefinitions(); -const averageDefinitions = await fetchAverageDefinitions(); +const [tankDefinitions, averageDefinitions] = await Promise.all([ + awaitableTankDefinitions, + awaitableAverageDefinitions, +]); export const fakeCompositeStats = compositeStats( { diff --git a/packages/website/src/components/HomePageHotTanks.tsx b/packages/website/src/components/HomePageHotTanks.tsx index b13219a31..c9e63e339 100644 --- a/packages/website/src/components/HomePageHotTanks.tsx +++ b/packages/website/src/components/HomePageHotTanks.tsx @@ -1,10 +1,13 @@ -import { fetchAverageDefinitions, fetchTankDefinitions } from '@blitzkit/core'; import { Box, Flex, Heading } from '@radix-ui/themes'; +import { awaitableAverageDefinitions } from '../core/awaitables/averageDefinitions'; +import { awaitableTankDefinitions } from '../core/awaitables/tankDefinitions'; import { TankopediaPersistent } from '../stores/tankopediaPersistent'; import { TankCard } from './TankCard'; -const tankDefinitions = await fetchTankDefinitions(); -const averageDefinitions = await fetchAverageDefinitions(); +const [tankDefinitions, averageDefinitions] = await Promise.all([ + awaitableTankDefinitions, + awaitableAverageDefinitions, +]); const tanks = Object.values(tankDefinitions.tanks); const tankAverages = Object.entries(averageDefinitions.averages).map( ([id, average]) => ({ diff --git a/packages/website/src/components/ModuleButtons/ConsumableButton.tsx b/packages/website/src/components/ModuleButtons/ConsumableButton.tsx index 19a04a9ca..9ed3f42ed 100644 --- a/packages/website/src/components/ModuleButtons/ConsumableButton.tsx +++ b/packages/website/src/components/ModuleButtons/ConsumableButton.tsx @@ -1,6 +1,7 @@ -import { asset, fetchConsumableDefinitions } from '@blitzkit/core'; +import { asset } from '@blitzkit/core'; import { ClockIcon, ReloadIcon } from '@radix-ui/react-icons'; import { Flex, Text } from '@radix-ui/themes'; +import { awaitableConsumableDefinitions } from '../../core/awaitables/consumableDefinitions'; import { useDelta } from '../../hooks/useDelta'; import { GenericTankComponentButton } from './GenericTankComponentButton'; import type { TankComponentButtonProps } from './TankComponentButton'; @@ -11,7 +12,7 @@ interface ConsumableButtonProps extends TankComponentButtonProps { cooldown?: number; } -const consumableDefinitions = await fetchConsumableDefinitions(); +const consumableDefinitions = await awaitableConsumableDefinitions; export function ConsumableButton({ consumable, diff --git a/packages/website/src/components/ModuleButtons/EquipmentButton.tsx b/packages/website/src/components/ModuleButtons/EquipmentButton.tsx index 7865c845a..f155f5e3c 100644 --- a/packages/website/src/components/ModuleButtons/EquipmentButton.tsx +++ b/packages/website/src/components/ModuleButtons/EquipmentButton.tsx @@ -1,4 +1,5 @@ -import { asset, fetchEquipmentDefinitions } from '@blitzkit/core'; +import { asset } from '@blitzkit/core'; +import { awaitableEquipmentDefinitions } from '../../core/awaitables/equipmentDefinitions'; import { GenericTankComponentButton } from './GenericTankComponentButton'; import type { TankComponentButtonProps } from './TankComponentButton'; @@ -6,7 +7,7 @@ interface EquipmentButtonProps extends TankComponentButtonProps { equipment: number; } -const equipmentDefinitions = await fetchEquipmentDefinitions(); +const equipmentDefinitions = await awaitableEquipmentDefinitions; export function EquipmentButton({ equipment, ...props }: EquipmentButtonProps) { return ( diff --git a/packages/website/src/components/ModuleButtons/ProvisionButton.tsx b/packages/website/src/components/ModuleButtons/ProvisionButton.tsx index 1ee05dac0..dc4de0837 100644 --- a/packages/website/src/components/ModuleButtons/ProvisionButton.tsx +++ b/packages/website/src/components/ModuleButtons/ProvisionButton.tsx @@ -1,4 +1,5 @@ -import { asset, fetchProvisionDefinitions } from '@blitzkit/core'; +import { asset } from '@blitzkit/core'; +import { awaitableProvisionDefinitions } from '../../core/awaitables/provisionDefinitions'; import { GenericTankComponentButton } from './GenericTankComponentButton'; import type { TankComponentButtonProps } from './TankComponentButton'; @@ -6,7 +7,7 @@ interface ProvisionButtonProps extends TankComponentButtonProps { provision: number; } -const provisionDefinitions = await fetchProvisionDefinitions(); +const provisionDefinitions = await awaitableProvisionDefinitions; export function ProvisionButton({ provision, ...props }: ProvisionButtonProps) { return ( diff --git a/packages/website/src/components/Performance/Charts/components/PlayersByTierAndClass.tsx b/packages/website/src/components/Performance/Charts/components/PlayersByTierAndClass.tsx index 39f7fcfda..d60694082 100644 --- a/packages/website/src/components/Performance/Charts/components/PlayersByTierAndClass.tsx +++ b/packages/website/src/components/Performance/Charts/components/PlayersByTierAndClass.tsx @@ -1,6 +1,4 @@ import { - fetchAverageDefinitions, - fetchTankDefinitions, formatCompact, TANK_CLASSES, TankClass, @@ -10,14 +8,19 @@ import { import strings from '@blitzkit/core/lang/en-US.json'; import { useStore } from '@nanostores/react'; import { Box, Flex, Heading } from '@radix-ui/themes'; +import { awaitableAverageDefinitions } from '../../../../core/awaitables/averageDefinitions'; +import { awaitableTankDefinitions } from '../../../../core/awaitables/tankDefinitions'; import { filterTank } from '../../../../core/blitzkit/filterTank'; import { useAveragesExclusionRatio } from '../../../../hooks/useAveragesExclusionRatio'; import { $tankFilters } from '../../../../stores/tankFilters'; import { TankPerformanceEphemeral } from '../../../../stores/tankPerformanceEphemeral'; import { ThemedBar } from '../../../Nivo/ThemedBar'; -const averageDefinitions = await fetchAverageDefinitions(); -const tankDefinitions = await fetchTankDefinitions(); +const [tankDefinitions, averageDefinitions] = await Promise.all([ + awaitableTankDefinitions, + awaitableAverageDefinitions, +]); + const averageDefinitionsArray = Object.entries(averageDefinitions.averages); export function PlayersByTierAndClass() { diff --git a/packages/website/src/components/Performance/PerformanceInfo.tsx b/packages/website/src/components/Performance/PerformanceInfo.tsx index fda76e305..6c5ee8f05 100644 --- a/packages/website/src/components/Performance/PerformanceInfo.tsx +++ b/packages/website/src/components/Performance/PerformanceInfo.tsx @@ -1,15 +1,15 @@ -import { - fetchAverageDefinitions, - fetchDiscoveredIdsDefinitions, - formatCompact, -} from '@blitzkit/core'; +import { formatCompact } from '@blitzkit/core'; import { InfoCircledIcon } from '@radix-ui/react-icons'; import { Callout, Flex } from '@radix-ui/themes'; +import { awaitableAverageDefinitions } from '../../core/awaitables/averageDefinitions'; +import { awaitableDiscoveredIdsDefinitions } from '../../core/awaitables/discoveredIdsDefinitions'; import type { MaybeSkeletonComponentProps } from '../../types/maybeSkeletonComponentProps'; import { InlineSkeleton } from '../InlineSkeleton'; -const discoveredIdsDefinitions = await fetchDiscoveredIdsDefinitions(); -const averageDefinitions = await fetchAverageDefinitions(); +const [discoveredIdsDefinitions, averageDefinitions] = await Promise.all([ + awaitableDiscoveredIdsDefinitions, + awaitableAverageDefinitions, +]); export function PerformanceInfo({ skeleton }: MaybeSkeletonComponentProps) { const samples = formatCompact(Math.round(discoveredIdsDefinitions.count)); diff --git a/packages/website/src/components/Performance/TankRow.tsx b/packages/website/src/components/Performance/TankRow.tsx index 634bfd6b9..e8c339751 100644 --- a/packages/website/src/components/Performance/TankRow.tsx +++ b/packages/website/src/components/Performance/TankRow.tsx @@ -1,10 +1,7 @@ -import { - TankDefinition, - fetchAverageDefinitions, - formatCompact, -} from '@blitzkit/core'; +import { TankDefinition, formatCompact } from '@blitzkit/core'; import { Table } from '@radix-ui/themes'; import { memo } from 'react'; +import { awaitableAverageDefinitions } from '../../core/awaitables/averageDefinitions'; import { useAveragesExclusionRatio } from '../../hooks/useAveragesExclusionRatio'; import { TankPerformanceEphemeral } from '../../stores/tankPerformanceEphemeral'; import { TankRowHeaderCell } from '../TankRowHeaderCell'; @@ -13,7 +10,7 @@ interface TankRowProps { tank: TankDefinition; } -const averageDefinitions = await fetchAverageDefinitions(); +const averageDefinitions = await awaitableAverageDefinitions; export const TankRow = memo( ({ tank }) => { diff --git a/packages/website/src/components/Performance/Tanks.tsx b/packages/website/src/components/Performance/Tanks.tsx index 33ef677ef..54df07dc5 100644 --- a/packages/website/src/components/Performance/Tanks.tsx +++ b/packages/website/src/components/Performance/Tanks.tsx @@ -1,8 +1,9 @@ -import { fetchAverageDefinitions, fetchTankDefinitions } from '@blitzkit/core'; import { useStore } from '@nanostores/react'; import { Table } from '@radix-ui/themes'; import { times } from 'lodash-es'; import { Fragment, Suspense, useEffect, useMemo, useState } from 'react'; +import { awaitableAverageDefinitions } from '../../core/awaitables/averageDefinitions'; +import { awaitableTankDefinitions } from '../../core/awaitables/tankDefinitions'; import { filterTank } from '../../core/blitzkit/filterTank'; import { $tankFilters } from '../../stores/tankFilters'; import { TankPerformanceEphemeral } from '../../stores/tankPerformanceEphemeral'; @@ -15,13 +16,16 @@ import { Total } from './Total'; const PREVIEW_COUNT = 10; const DEFAULT_LOADED_ROWS = 25; -const tankDefinitions = await fetchTankDefinitions(); -const averageDefinitionsArray = await fetchAverageDefinitions().then( - ({ averages }) => - Object.entries(averages).map(([id, average]) => ({ - id: Number(id), - ...average, - })), +const [tankDefinitions, averageDefinitions] = await Promise.all([ + awaitableTankDefinitions, + awaitableAverageDefinitions, +]); + +const averageDefinitionsArray = Object.entries(averageDefinitions.averages).map( + ([id, average]) => ({ + id: Number(id), + ...average, + }), ); export function Tanks({ skeleton }: MaybeSkeletonComponentProps) { diff --git a/packages/website/src/components/Performance/Total.tsx b/packages/website/src/components/Performance/Total.tsx index cad080ea8..c75ae5c5d 100644 --- a/packages/website/src/components/Performance/Total.tsx +++ b/packages/website/src/components/Performance/Total.tsx @@ -1,11 +1,11 @@ import { AverageDefinitionsEntry, - fetchAverageDefinitions, formatCompact, type BlitzkitStats, } from '@blitzkit/core'; import { Table } from '@radix-ui/themes'; import { memo, useCallback } from 'react'; +import { awaitableAverageDefinitions } from '../../core/awaitables/averageDefinitions'; import { useAveragesExclusionRatio } from '../../hooks/useAveragesExclusionRatio'; import { TankPerformanceEphemeral } from '../../stores/tankPerformanceEphemeral'; import { StickyRowHeaderCell } from '../StickyRowHeaderCell'; @@ -18,7 +18,7 @@ interface TotalProps { tanks: AverageDefinitionsEntryWithId[]; } -const averageDefinitions = await fetchAverageDefinitions(); +const averageDefinitions = await awaitableAverageDefinitions; export const Total = memo( ({ tanks }) => { diff --git a/packages/website/src/components/TankSearch/components/Card.tsx b/packages/website/src/components/TankSearch/components/Card.tsx index e0554796c..f5531692a 100644 --- a/packages/website/src/components/TankSearch/components/Card.tsx +++ b/packages/website/src/components/TankSearch/components/Card.tsx @@ -1,5 +1,4 @@ import { - fetchModelDefinitions, normalizeBoundingBox, resolveDpm, unionBoundingBox, @@ -7,6 +6,7 @@ import { } from '@blitzkit/core'; import { useStore } from '@nanostores/react'; import { useMemo } from 'react'; +import { awaitableModelDefinitions } from '../../../core/awaitables/modelDefinitions'; import { resolveReload } from '../../../core/blitzkit/resolveReload'; import { $tankopediaSort } from '../../../stores/tankopediaSort'; import { TankCard } from '../../TankCard'; @@ -16,7 +16,7 @@ interface TankSearchCardProps { onSelect?: (tank: TankDefinition) => void; } -const modelDefinitions = await fetchModelDefinitions(); +const modelDefinitions = await awaitableModelDefinitions; export function TankSearchCard({ tank, onSelect }: TankSearchCardProps) { const tankopediaSort = useStore($tankopediaSort); diff --git a/packages/website/src/components/TankSearch/components/FilterControl.tsx b/packages/website/src/components/TankSearch/components/FilterControl.tsx index 4e17e30f0..aca24fec1 100644 --- a/packages/website/src/components/TankSearch/components/FilterControl.tsx +++ b/packages/website/src/components/TankSearch/components/FilterControl.tsx @@ -1,6 +1,5 @@ import { asset, - fetchGameDefinitions, TANK_CLASSES, TankType, TIER_ROMAN_NUMERALS, @@ -9,6 +8,7 @@ import { useStore } from '@nanostores/react'; import { ReloadIcon } from '@radix-ui/react-icons'; import { Box, Flex, IconButton, Text } from '@radix-ui/themes'; import { times } from 'lodash-es'; +import { awaitableGameDefinitions } from '../../../core/awaitables/gameDefinitions'; import { $tankFilters, initialTankFilters } from '../../../stores/tankFilters'; import { $tankopediaSort, @@ -27,7 +27,7 @@ interface FilterControlProps { compact?: boolean; } -const gameDefinitions = await fetchGameDefinitions(); +const gameDefinitions = await awaitableGameDefinitions; export function FilterControl({ compact }: FilterControlProps) { const tankFilters = useStore($tankFilters); diff --git a/packages/website/src/components/TankSearch/components/RecentlyViewed.tsx b/packages/website/src/components/TankSearch/components/RecentlyViewed.tsx index 4dfbdde34..9336ba951 100644 --- a/packages/website/src/components/TankSearch/components/RecentlyViewed.tsx +++ b/packages/website/src/components/TankSearch/components/RecentlyViewed.tsx @@ -1,15 +1,15 @@ -import { fetchTankDefinitions } from '@blitzkit/core'; import { useStore } from '@nanostores/react'; import { Flex, Separator, Text } from '@radix-ui/themes'; import { isEqual } from 'lodash-es'; import { useMemo } from 'react'; +import { awaitableTankDefinitions } from '../../../core/awaitables/tankDefinitions'; import { $tankFilters, initialTankFilters } from '../../../stores/tankFilters'; import { TankopediaPersistent } from '../../../stores/tankopediaPersistent'; import { $tankopediaSort } from '../../../stores/tankopediaSort'; import { TankCard } from '../../TankCard'; import { TankCardWrapper } from './TankCardWrapper'; -const tankDefinitions = await fetchTankDefinitions(); +const tankDefinitions = await awaitableTankDefinitions; export function RecentlyViewed() { const tankopediaPersistentStore = TankopediaPersistent.useStore(); diff --git a/packages/website/src/components/TankSearch/index.tsx b/packages/website/src/components/TankSearch/index.tsx index a716df8fc..0aa5f8e01 100644 --- a/packages/website/src/components/TankSearch/index.tsx +++ b/packages/website/src/components/TankSearch/index.tsx @@ -1,8 +1,4 @@ import { - fetchGameDefinitions, - fetchModelDefinitions, - fetchTankDefinitions, - fetchTankNames, metaSortTank, normalizeBoundingBox, resolveDpm, @@ -14,6 +10,10 @@ import { Callout, Flex, Link, Text, type FlexProps } from '@radix-ui/themes'; import fuzzysort from 'fuzzysort'; import { times, uniq } from 'lodash-es'; import { memo, useEffect, useMemo, useState } from 'react'; +import { awaitableGameDefinitions } from '../../core/awaitables/gameDefinitions'; +import { awaitableModelDefinitions } from '../../core/awaitables/modelDefinitions'; +import { awaitableTankDefinitions } from '../../core/awaitables/tankDefinitions'; +import { awaitableTankNames } from '../../core/awaitables/tankNames'; import { filterTank } from '../../core/blitzkit/filterTank'; import { resolveReload } from '../../core/blitzkit/resolveReload'; import { $tankFilters } from '../../stores/tankFilters'; @@ -42,10 +42,13 @@ type TankSearchProps = Omit & { const PREVIEW_COUNT = 25; const DEFAULT_LOADED_CARDS = 75; -const gameDefinitions = await fetchGameDefinitions(); -const modelDefinitions = await fetchModelDefinitions(); -const tankDefinitions = await fetchTankDefinitions(); -const tankNames = await fetchTankNames(); +const [gameDefinitions, modelDefinitions, tankDefinitions, tankNames] = + await Promise.all([ + awaitableGameDefinitions, + awaitableModelDefinitions, + awaitableTankDefinitions, + awaitableTankNames, + ]); export const TankSearch = memo( ({ compact, onSelect, onSelectAll, ...props }) => { 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 730cfb0d3..b8e7a5eaf 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 @@ -1,13 +1,11 @@ -import { - createDefaultSkills, - fetchEquipmentDefinitions, - fetchModelDefinitions, - fetchProvisionDefinitions, - fetchSkillDefinitions, - fetchTankDefinitions, -} from '@blitzkit/core'; +import { createDefaultSkills } from '@blitzkit/core'; import { Flex, Progress, Text } from '@radix-ui/themes'; import { useMemo, type ComponentProps } from 'react'; +import { awaitableEquipmentDefinitions } from '../../../../../../core/awaitables/equipmentDefinitions'; +import { awaitableModelDefinitions } from '../../../../../../core/awaitables/modelDefinitions'; +import { awaitableProvisionDefinitions } from '../../../../../../core/awaitables/provisionDefinitions'; +import { awaitableSkillDefinitions } from '../../../../../../core/awaitables/skillDefinitions'; +import { awaitableTankDefinitions } from '../../../../../../core/awaitables/tankDefinitions'; import { tankCharacteristics, type TankCharacteristics, @@ -29,11 +27,19 @@ interface InfoWithDeltaProps extends InfoProps { noRanking?: boolean; } -const tankDefinitions = await fetchTankDefinitions(); -const provisionDefinitions = await fetchProvisionDefinitions(); -const equipmentDefinitions = await fetchEquipmentDefinitions(); -const tankModelDefinitions = await fetchModelDefinitions(); -const skillDefinitions = await fetchSkillDefinitions(); +const [ + tankDefinitions, + provisionDefinitions, + equipmentDefinitions, + modelDefinitions, + skillDefinitions, +] = await Promise.all([ + awaitableTankDefinitions, + awaitableProvisionDefinitions, + awaitableEquipmentDefinitions, + awaitableModelDefinitions, + awaitableSkillDefinitions, +]); export function InfoWithDelta({ value, @@ -90,7 +96,7 @@ export function InfoWithDelta({ { equipmentDefinitions, provisionDefinitions, - tankModelDefinition: tankModelDefinitions.models[tank.id], + tankModelDefinition: modelDefinitions.models[tank.id], }, ); }) 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 db7984d9a..7f67c23da 100644 --- a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/index.tsx +++ b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/index.tsx @@ -3,8 +3,6 @@ import { coefficient, CREW_MEMBER_NAMES, CrewType, - fetchEquipmentDefinitions, - fetchProvisionDefinitions, GUN_TYPE_NAMES, isExplosive, resolvePenetrationCoefficient, @@ -24,6 +22,8 @@ import { debounce } from 'lodash-es'; import { useEffect, useRef, useState } from 'react'; import { Fragment } from 'react/jsx-runtime'; import { lerp } from 'three/src/math/MathUtils.js'; +import { awaitableEquipmentDefinitions } from '../../../../../core/awaitables/equipmentDefinitions'; +import { awaitableProvisionDefinitions } from '../../../../../core/awaitables/provisionDefinitions'; import { applyPitchYawLimits } from '../../../../../core/blitz/applyPitchYawLimits'; import { tankCharacteristics } from '../../../../../core/blitzkit/tankCharacteristics'; import { useEquipment } from '../../../../../hooks/useEquipment'; @@ -33,8 +33,10 @@ import { TankopediaEphemeral } from '../../../../../stores/tankopediaEphemeral'; import { Info } from './components/Info'; import { InfoWithDelta } from './components/InfoWithDelta'; -const equipmentDefinitions = await fetchEquipmentDefinitions(); -const provisionDefinitions = await fetchProvisionDefinitions(); +const [equipmentDefinitions, provisionDefinitions] = await Promise.all([ + awaitableEquipmentDefinitions, + awaitableProvisionDefinitions, +]); export function Characteristics() { const mutateDuel = Duel.useMutation(); diff --git a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Consumables.tsx b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Consumables.tsx index 12ba0d3cd..88c9c9daa 100644 --- a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Consumables.tsx +++ b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Consumables.tsx @@ -1,4 +1,3 @@ -import { fetchConsumableDefinitions } from '@blitzkit/core'; import { checkConsumableProvisionInclusivity } from '@blitzkit/core/src/blitzkit/checkConsumableProvisionInclusivity'; import { InfoCircledIcon } from '@radix-ui/react-icons'; import { @@ -9,12 +8,13 @@ import { Popover, Text, } from '@radix-ui/themes'; +import { awaitableConsumableDefinitions } from '../../../../core/awaitables/consumableDefinitions'; import { useEquipment } from '../../../../hooks/useEquipment'; import { Duel } from '../../../../stores/duel'; import { ConsumablesManager } from '../../../ConsumablesManager'; import { ConfigurationChildWrapper } from './ConfigurationChildWrapper'; -const consumableDefinitions = await fetchConsumableDefinitions(); +const consumableDefinitions = await awaitableConsumableDefinitions; export function Consumables() { const mutateDuel = Duel.useMutation(); diff --git a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Equipment.tsx b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Equipment.tsx index ac2011a65..63cc3bc88 100644 --- a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Equipment.tsx +++ b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Equipment.tsx @@ -1,10 +1,10 @@ -import { fetchEquipmentDefinitions } from '@blitzkit/core'; import { Button, Flex, Heading } from '@radix-ui/themes'; +import { awaitableEquipmentDefinitions } from '../../../../core/awaitables/equipmentDefinitions'; import { Duel } from '../../../../stores/duel'; import { EquipmentManager } from '../../../EquipmentManager'; import { ConfigurationChildWrapper } from './ConfigurationChildWrapper'; -const equipmentDefinitions = await fetchEquipmentDefinitions(); +const equipmentDefinitions = await awaitableEquipmentDefinitions; export function Equipment() { const mutateDuel = Duel.useMutation(); diff --git a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Modules.tsx b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Modules.tsx index 8d1752f8b..a6c5c0061 100644 --- a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Modules.tsx +++ b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Modules.tsx @@ -1,7 +1,6 @@ import { asset, EngineDefinition, - fetchTankDefinitions, formatCompact, GunDefinition, ModuleType, @@ -21,6 +20,7 @@ import { Link, Text, } from '@radix-ui/themes'; +import { awaitableTankDefinitions } from '../../../../core/awaitables/tankDefinitions'; import { Duel } from '../../../../stores/duel'; import { ConfigurationChildWrapper } from './ConfigurationChildWrapper'; @@ -138,7 +138,7 @@ function ModuleButton({ ); } -const tankDefinitions = await fetchTankDefinitions(); +const tankDefinitions = await awaitableTankDefinitions; export function Modules() { const mutateDuel = Duel.useMutation(); diff --git a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Provisions.tsx b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Provisions.tsx index c44e903ce..62ffc1b3d 100644 --- a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Provisions.tsx +++ b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Provisions.tsx @@ -1,10 +1,11 @@ -import { availableProvisions, fetchProvisionDefinitions } from '@blitzkit/core'; +import { availableProvisions } from '@blitzkit/core'; import { Button, Flex, Heading } from '@radix-ui/themes'; +import { awaitableProvisionDefinitions } from '../../../../core/awaitables/provisionDefinitions'; import { Duel } from '../../../../stores/duel'; import { ProvisionsManager } from '../../../ProvisionsManager'; import { ConfigurationChildWrapper } from './ConfigurationChildWrapper'; -const provisionDefinitions = await fetchProvisionDefinitions(); +const provisionDefinitions = await awaitableProvisionDefinitions; export function Provisions() { const mutateDuel = Duel.useMutation(); diff --git a/packages/website/src/components/Tankopedia/GameModeSection.tsx b/packages/website/src/components/Tankopedia/GameModeSection.tsx index 67d60f3c1..1be2f20db 100644 --- a/packages/website/src/components/Tankopedia/GameModeSection.tsx +++ b/packages/website/src/components/Tankopedia/GameModeSection.tsx @@ -1,15 +1,16 @@ -import { - asset, - fetchConsumableDefinitions, - fetchGameDefinitions, - fetchProvisionDefinitions, -} from '@blitzkit/core'; +import { asset } from '@blitzkit/core'; import { Box, Flex, Heading, Text } from '@radix-ui/themes'; +import { awaitableConsumableDefinitions } from '../../core/awaitables/consumableDefinitions'; +import { awaitableGameDefinitions } from '../../core/awaitables/gameDefinitions'; +import { awaitableProvisionDefinitions } from '../../core/awaitables/provisionDefinitions'; import { Duel } from '../../stores/duel'; -const gameDefinitions = await fetchGameDefinitions(); -const consumableDefinitions = await fetchConsumableDefinitions(); -const provisionDefinitions = await fetchProvisionDefinitions(); +const [gameDefinitions, consumableDefinitions, provisionDefinitions] = + await Promise.all([ + awaitableGameDefinitions, + awaitableConsumableDefinitions, + awaitableProvisionDefinitions, + ]); export function GameModeSection() { const tank = Duel.use((state) => state.protagonist.tank); 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 8ce28aa5c..e4bb0e9b0 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 @@ -1,9 +1,9 @@ -import { fetchModelDefinitions } from '@blitzkit/core'; import { OrbitControls } from '@react-three/drei'; import { invalidate, useThree } from '@react-three/fiber'; import { useEffect, useRef, useState } from 'react'; import { Vector3 } from 'three'; import { OrbitControls as OrbitControlsClass } from 'three-stdlib'; +import { awaitableModelDefinitions } from '../../../../../../core/awaitables/modelDefinitions'; import { applyPitchYawLimits } from '../../../../../../core/blitz/applyPitchYawLimits'; import { hasEquipment } from '../../../../../../core/blitzkit/hasEquipment'; import { Pose, poseEvent } from '../../../../../../core/blitzkit/pose'; @@ -17,7 +17,7 @@ const poseDistances: Record = { [Pose.Default]: -1, }; -const modelDefinitions = await fetchModelDefinitions(); +const modelDefinitions = await awaitableModelDefinitions; export function Controls() { const duelStore = Duel.useStore(); diff --git a/packages/website/src/components/Tankopedia/HeroSection/index.tsx b/packages/website/src/components/Tankopedia/HeroSection/index.tsx index 3d7af3e72..b5dd432a3 100644 --- a/packages/website/src/components/Tankopedia/HeroSection/index.tsx +++ b/packages/website/src/components/Tankopedia/HeroSection/index.tsx @@ -1,8 +1,9 @@ -import { fetchTankDefinitions, TankType } from '@blitzkit/core'; +import { TankType } from '@blitzkit/core'; import { Box, Flex, Heading, Text } from '@radix-ui/themes'; import { times } from 'lodash-es'; import { Suspense, useEffect, useMemo, useRef } from 'react'; import { NAVBAR_HEIGHT } from '../../../constants/navbar'; +import { awaitableTankDefinitions } from '../../../core/awaitables/tankDefinitions'; import { Var } from '../../../core/radix/var'; import { useFullScreen } from '../../../hooks/useFullScreen'; import { Duel } from '../../../stores/duel'; @@ -14,7 +15,7 @@ import { Options } from './components/Options'; import { TankSandbox } from './components/TankSandbox'; import { TankSandboxLoader } from './components/TankSandboxLoader'; -const tankDefinitions = await fetchTankDefinitions(); +const tankDefinitions = await awaitableTankDefinitions; export function HeroSection({ skeleton }: MaybeSkeletonComponentProps) { const canvas = useRef(null); diff --git a/packages/website/src/components/Tankopedia/MetaSection/index.tsx b/packages/website/src/components/Tankopedia/MetaSection/index.tsx index ba47ffba9..47c8f984a 100644 --- a/packages/website/src/components/Tankopedia/MetaSection/index.tsx +++ b/packages/website/src/components/Tankopedia/MetaSection/index.tsx @@ -1,8 +1,6 @@ import { assertSecret, asset, - fetchModelDefinitions, - fetchProvisionDefinitions, TankPriceType, TankType, TIER_ROMAN_NUMERALS, @@ -11,6 +9,8 @@ import strings from '@blitzkit/core/lang/en-US.json'; import { ChevronLeftIcon, MixIcon, UpdateIcon } from '@radix-ui/react-icons'; import { Button, Code, Dialog, Flex, Link } from '@radix-ui/themes'; import { useState } from 'react'; +import { awaitableModelDefinitions } from '../../../core/awaitables/modelDefinitions'; +import { awaitableProvisionDefinitions } from '../../../core/awaitables/provisionDefinitions'; import { tankToDuelMember } from '../../../core/blitzkit/tankToDuelMember'; import { App } from '../../../stores/app'; import { Duel } from '../../../stores/duel'; @@ -20,8 +20,10 @@ import { ScienceIcon } from '../../ScienceIcon'; import { TankSearch } from '../../TankSearch'; import { Listing } from './components/Listing'; -const provisionDefinitions = await fetchProvisionDefinitions(); -const modelDefinitions = await fetchModelDefinitions(); +const [provisionDefinitions, modelDefinitions] = await Promise.all([ + awaitableProvisionDefinitions, + awaitableModelDefinitions, +]); export function MetaSection() { const developerMode = App.useDeferred((state) => state.developerMode, false); diff --git a/packages/website/src/components/Tankopedia/TechTreeSection/components/Node.tsx b/packages/website/src/components/Tankopedia/TechTreeSection/components/Node.tsx index 07b65fd15..ef49d005c 100644 --- a/packages/website/src/components/Tankopedia/TechTreeSection/components/Node.tsx +++ b/packages/website/src/components/Tankopedia/TechTreeSection/components/Node.tsx @@ -1,11 +1,7 @@ -import { - asset, - fetchAverageDefinitions, - fetchTankDefinitions, - formatCompact, - TIER_ROMAN_NUMERALS, -} from '@blitzkit/core'; +import { asset, formatCompact, TIER_ROMAN_NUMERALS } from '@blitzkit/core'; import { Box, Flex, Link, Skeleton, Text } from '@radix-ui/themes'; +import { awaitableAverageDefinitions } from '../../../../core/awaitables/averageDefinitions'; +import { awaitableTankDefinitions } from '../../../../core/awaitables/tankDefinitions'; import { TankopediaEphemeral } from '../../../../stores/tankopediaEphemeral'; import type { MaybeSkeletonComponentProps } from '../../../../types/maybeSkeletonComponentProps'; @@ -15,8 +11,10 @@ type NodeProps = MaybeSkeletonComponentProps & { highlight?: boolean; }; -const tankDefinitions = await fetchTankDefinitions(); -const averageDefinitions = await fetchAverageDefinitions(); +const [tankDefinitions, averageDefinitions] = await Promise.all([ + awaitableTankDefinitions, + awaitableAverageDefinitions, +]); export function Node({ id, highlight, nextIds, skeleton }: NodeProps) { const xpMultiplier = TankopediaEphemeral.use((state) => state.xpMultiplier); diff --git a/packages/website/src/components/Tankopedia/TechTreeSection/index.tsx b/packages/website/src/components/Tankopedia/TechTreeSection/index.tsx index a8f4cadc3..b0a19c556 100644 --- a/packages/website/src/components/Tankopedia/TechTreeSection/index.tsx +++ b/packages/website/src/components/Tankopedia/TechTreeSection/index.tsx @@ -1,7 +1,8 @@ -import { asset, fetchTankDefinitions, imgur, TankType } from '@blitzkit/core'; +import { asset, imgur, TankType } from '@blitzkit/core'; import { CaretLeftIcon, CaretRightIcon, PlusIcon } from '@radix-ui/react-icons'; import { Flex, Heading, IconButton, ScrollArea, Text } from '@radix-ui/themes'; import { Fragment, useEffect, useMemo, useRef, useState } from 'react'; +import { awaitableTankDefinitions } from '../../../core/awaitables/tankDefinitions'; import { Duel } from '../../../stores/duel'; import { TankopediaEphemeral } from '../../../stores/tankopediaEphemeral'; import type { MaybeSkeletonComponentProps } from '../../../types/maybeSkeletonComponentProps'; @@ -10,7 +11,7 @@ import { Node } from './components/Node'; type Line = number[]; -const tankDefinitions = await fetchTankDefinitions(); +const tankDefinitions = await awaitableTankDefinitions; export const XP_MULTIPLIERS = [1, 2, 3, 4, 5, 10]; diff --git a/packages/website/src/components/Tankopedia/VideoSection.tsx b/packages/website/src/components/Tankopedia/VideoSection.tsx index 588c7811e..9c6c92068 100644 --- a/packages/website/src/components/Tankopedia/VideoSection.tsx +++ b/packages/website/src/components/Tankopedia/VideoSection.tsx @@ -1,12 +1,13 @@ -import { fetchReviews, youtubers } from '@blitzkit/core'; +import { youtubers } from '@blitzkit/core'; import { Box, Flex, Heading, Link, Skeleton, Text } from '@radix-ui/themes'; +import { awaitableReviews } from '../../core/awaitables/reviews'; import { Var } from '../../core/radix/var'; import { Duel } from '../../stores/duel'; import type { MaybeSkeletonComponentProps } from '../../types/maybeSkeletonComponentProps'; import { PageWrapper } from '../PageWrapper'; import { VerifiedIcon } from '../VerifiedIcon'; -const reviews = await fetchReviews(); +const reviews = await awaitableReviews; export function VideoSection({ skeleton }: MaybeSkeletonComponentProps) { const tank = Duel.use((state) => state.protagonist.tank); diff --git a/packages/website/src/components/TierList/Row/index.tsx b/packages/website/src/components/TierList/Row/index.tsx index 3eca6a095..17244ee36 100644 --- a/packages/website/src/components/TierList/Row/index.tsx +++ b/packages/website/src/components/TierList/Row/index.tsx @@ -1,6 +1,6 @@ -import { fetchTankDefinitions } from '@blitzkit/core'; import { Flex, Table } from '@radix-ui/themes'; import { useEffect, useRef } from 'react'; +import { awaitableTankDefinitions } from '../../../core/awaitables/tankDefinitions'; import { TierList } from '../../../stores/tierList'; import { tierListRowElements } from '../Table/constants'; import { TierListTile } from '../Tile'; @@ -10,7 +10,7 @@ interface TierListRowProps { index: number; } -const tankDefinitions = await fetchTankDefinitions(); +const tankDefinitions = await awaitableTankDefinitions; 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 5b23d60ba..6686f3081 100644 --- a/packages/website/src/components/TierList/Tiles.tsx +++ b/packages/website/src/components/TierList/Tiles.tsx @@ -1,11 +1,9 @@ -import { - fetchGameDefinitions, - fetchTankDefinitions, - metaSortTank, -} from '@blitzkit/core'; +import { metaSortTank } from '@blitzkit/core'; import { useStore } from '@nanostores/react'; import { times } from 'lodash-es'; import { useMemo, useState } from 'react'; +import { awaitableGameDefinitions } from '../../core/awaitables/gameDefinitions'; +import { awaitableTankDefinitions } from '../../core/awaitables/tankDefinitions'; import { filterTank } from '../../core/blitzkit/filterTank'; import { $tankFilters } from '../../stores/tankFilters'; import { TierList } from '../../stores/tierList'; @@ -13,8 +11,11 @@ import { SkeletonTankCard } from '../TankSearch/components/SkeletonTankCard'; import { TankCardWrapper } from '../TankSearch/components/TankCardWrapper'; import { TierListTile } from './Tile'; -const tankDefinitions = await fetchTankDefinitions(); -const gameDefinitions = await fetchGameDefinitions(); +const [tankDefinitions, gameDefinitions] = await Promise.all([ + awaitableTankDefinitions, + awaitableGameDefinitions, +]); + const tanks = Object.values(tankDefinitions.tanks); const PREVIEW_COUNT = 32; diff --git a/packages/website/src/components/TierList/URLManager.tsx b/packages/website/src/components/TierList/URLManager.tsx index b5f9f8aab..cf8d2bbd3 100644 --- a/packages/website/src/components/TierList/URLManager.tsx +++ b/packages/website/src/components/TierList/URLManager.tsx @@ -1,9 +1,9 @@ -import { fetchTankDefinitions } from '@blitzkit/core'; import { useEffect } from 'react'; +import { awaitableTankDefinitions } from '../../core/awaitables/tankDefinitions'; import { generateTierListParams } from '../../core/blitzkit/generateTierListParams'; import { TierList } from '../../stores/tierList'; -const tankDefinitions = await fetchTankDefinitions(); +const tankDefinitions = await awaitableTankDefinitions; export function URLManager() { const rows = TierList.use((state) => state.rows); diff --git a/packages/website/src/core/awaitables/averageDefinitions.ts b/packages/website/src/core/awaitables/averageDefinitions.ts new file mode 100644 index 000000000..9d21ebe9a --- /dev/null +++ b/packages/website/src/core/awaitables/averageDefinitions.ts @@ -0,0 +1,3 @@ +import { fetchAverageDefinitions } from '@blitzkit/core'; + +export const awaitableAverageDefinitions = fetchAverageDefinitions(); diff --git a/packages/website/src/core/awaitables/consumableDefinitions.ts b/packages/website/src/core/awaitables/consumableDefinitions.ts new file mode 100644 index 000000000..be0b8efb0 --- /dev/null +++ b/packages/website/src/core/awaitables/consumableDefinitions.ts @@ -0,0 +1,3 @@ +import { fetchConsumableDefinitions } from '@blitzkit/core'; + +export const awaitableConsumableDefinitions = fetchConsumableDefinitions(); diff --git a/packages/website/src/core/awaitables/discoveredIdsDefinitions.ts b/packages/website/src/core/awaitables/discoveredIdsDefinitions.ts new file mode 100644 index 000000000..56f046d74 --- /dev/null +++ b/packages/website/src/core/awaitables/discoveredIdsDefinitions.ts @@ -0,0 +1,4 @@ +import { fetchDiscoveredIdsDefinitions } from '@blitzkit/core'; + +export const awaitableDiscoveredIdsDefinitions = + fetchDiscoveredIdsDefinitions(); diff --git a/packages/website/src/core/awaitables/equipmentDefinitions.ts b/packages/website/src/core/awaitables/equipmentDefinitions.ts new file mode 100644 index 000000000..82f2ae8aa --- /dev/null +++ b/packages/website/src/core/awaitables/equipmentDefinitions.ts @@ -0,0 +1,3 @@ +import { fetchEquipmentDefinitions } from '@blitzkit/core'; + +export const awaitableEquipmentDefinitions = fetchEquipmentDefinitions(); diff --git a/packages/website/src/core/awaitables/gameDefinitions.ts b/packages/website/src/core/awaitables/gameDefinitions.ts new file mode 100644 index 000000000..84db30fce --- /dev/null +++ b/packages/website/src/core/awaitables/gameDefinitions.ts @@ -0,0 +1,3 @@ +import { fetchGameDefinitions } from '@blitzkit/core'; + +export const awaitableGameDefinitions = fetchGameDefinitions(); diff --git a/packages/website/src/core/awaitables/modelDefinitions.ts b/packages/website/src/core/awaitables/modelDefinitions.ts new file mode 100644 index 000000000..6f1cc2fd0 --- /dev/null +++ b/packages/website/src/core/awaitables/modelDefinitions.ts @@ -0,0 +1,3 @@ +import { fetchModelDefinitions } from '@blitzkit/core'; + +export const awaitableModelDefinitions = fetchModelDefinitions(); diff --git a/packages/website/src/core/awaitables/provisionDefinitions.ts b/packages/website/src/core/awaitables/provisionDefinitions.ts new file mode 100644 index 000000000..1f21a1459 --- /dev/null +++ b/packages/website/src/core/awaitables/provisionDefinitions.ts @@ -0,0 +1,3 @@ +import { fetchProvisionDefinitions } from '@blitzkit/core'; + +export const awaitableProvisionDefinitions = fetchProvisionDefinitions(); diff --git a/packages/website/src/core/awaitables/reviews.ts b/packages/website/src/core/awaitables/reviews.ts new file mode 100644 index 000000000..21ff0c095 --- /dev/null +++ b/packages/website/src/core/awaitables/reviews.ts @@ -0,0 +1,3 @@ +import { fetchReviews } from '@blitzkit/core'; + +export const awaitableReviews = fetchReviews(); diff --git a/packages/website/src/core/awaitables/skillDefinitions.ts b/packages/website/src/core/awaitables/skillDefinitions.ts new file mode 100644 index 000000000..0b7dde41d --- /dev/null +++ b/packages/website/src/core/awaitables/skillDefinitions.ts @@ -0,0 +1,3 @@ +import { fetchSkillDefinitions } from '@blitzkit/core'; + +export const awaitableSkillDefinitions = fetchSkillDefinitions(); diff --git a/packages/website/src/core/awaitables/tankDefinitions.ts b/packages/website/src/core/awaitables/tankDefinitions.ts new file mode 100644 index 000000000..fe76877f3 --- /dev/null +++ b/packages/website/src/core/awaitables/tankDefinitions.ts @@ -0,0 +1,3 @@ +import { fetchTankDefinitions } from '@blitzkit/core'; + +export const awaitableTankDefinitions = fetchTankDefinitions(); diff --git a/packages/website/src/core/awaitables/tankNames.ts b/packages/website/src/core/awaitables/tankNames.ts new file mode 100644 index 000000000..d043c9705 --- /dev/null +++ b/packages/website/src/core/awaitables/tankNames.ts @@ -0,0 +1,3 @@ +import { fetchTankNames } from '@blitzkit/core'; + +export const awaitableTankNames = fetchTankNames(); diff --git a/packages/website/src/hooks/useAveragesExclusionRatio.ts b/packages/website/src/hooks/useAveragesExclusionRatio.ts index 94ed62970..265925d4a 100644 --- a/packages/website/src/hooks/useAveragesExclusionRatio.ts +++ b/packages/website/src/hooks/useAveragesExclusionRatio.ts @@ -1,14 +1,11 @@ -import { - fetchAverageDefinitions, - fetchDiscoveredIdsDefinitions, -} from '@blitzkit/core'; +import { awaitableAverageDefinitions } from '../core/awaitables/averageDefinitions'; +import { awaitableDiscoveredIdsDefinitions } from '../core/awaitables/discoveredIdsDefinitions'; -const awaitedDiscoveredIdsDefinitions = await fetchDiscoveredIdsDefinitions(); -const awaitedAverageDefinitions = await fetchAverageDefinitions(); +const [discoveredIdsDefinitions, averageDefinitions] = await Promise.all([ + awaitableDiscoveredIdsDefinitions, + awaitableAverageDefinitions, +]); export function useAveragesExclusionRatio() { - return ( - awaitedDiscoveredIdsDefinitions.count / - awaitedAverageDefinitions.samples.total - ); + return discoveredIdsDefinitions.count / averageDefinitions.samples.total; } diff --git a/packages/website/src/hooks/useEccentricity.ts b/packages/website/src/hooks/useEccentricity.ts index 3f5fa0a46..4565e6099 100644 --- a/packages/website/src/hooks/useEccentricity.ts +++ b/packages/website/src/hooks/useEccentricity.ts @@ -1,6 +1,7 @@ -import { fetchTankDefinitions, TankDefinition } from '@blitzkit/core'; +import { TankDefinition } from '@blitzkit/core'; import { sumBy } from 'lodash-es'; import { useMemo } from 'react'; +import { awaitableTankDefinitions } from '../core/awaitables/tankDefinitions'; import { Duel } from '../stores/duel'; export enum UseEccentricityMode { @@ -8,7 +9,7 @@ export enum UseEccentricityMode { Class, } -const tankDefinitions = await fetchTankDefinitions(); +const tankDefinitions = await awaitableTankDefinitions; 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 1403917dc..4c24f9828 100644 --- a/packages/website/src/hooks/useEquipment.ts +++ b/packages/website/src/hooks/useEquipment.ts @@ -1,8 +1,8 @@ -import { fetchEquipmentDefinitions } from '@blitzkit/core'; import { useMemo } from 'react'; +import { awaitableEquipmentDefinitions } from '../core/awaitables/equipmentDefinitions'; import { Duel } from '../stores/duel'; -const equipmentDefinitions = await fetchEquipmentDefinitions(); +const equipmentDefinitions = await awaitableEquipmentDefinitions; export function useEquipment(id: number, antagonist = false) { const member = Duel.use( diff --git a/packages/website/src/pages/tools/compare/_index.tsx b/packages/website/src/pages/tools/compare/_index.tsx index cf9034d8d..b89cf12fd 100644 --- a/packages/website/src/pages/tools/compare/_index.tsx +++ b/packages/website/src/pages/tools/compare/_index.tsx @@ -1,11 +1,4 @@ -import { - createDefaultSkills, - fetchEquipmentDefinitions, - fetchModelDefinitions, - fetchProvisionDefinitions, - fetchSkillDefinitions, - fetchTankDefinitions, -} from '@blitzkit/core'; +import { createDefaultSkills } from '@blitzkit/core'; import { PlusIcon } from '@radix-ui/react-icons'; import { Flex, Heading, Text } from '@radix-ui/themes'; import { useEffect, useMemo, useState } from 'react'; @@ -13,6 +6,11 @@ import { CompareTable } from '../../../components/Compare/CompareTable'; import { Controls } from '../../../components/Compare/Controls'; import { DamageWarning } from '../../../components/DamageWarning'; import { PageWrapper } from '../../../components/PageWrapper'; +import { awaitableEquipmentDefinitions } from '../../../core/awaitables/equipmentDefinitions'; +import { awaitableModelDefinitions } from '../../../core/awaitables/modelDefinitions'; +import { awaitableProvisionDefinitions } from '../../../core/awaitables/provisionDefinitions'; +import { awaitableSkillDefinitions } from '../../../core/awaitables/skillDefinitions'; +import { awaitableTankDefinitions } from '../../../core/awaitables/tankDefinitions'; import { tankCharacteristics } from '../../../core/blitzkit/tankCharacteristics'; import { tankToCompareMember } from '../../../core/blitzkit/tankToCompareMember'; import { App } from '../../../stores/app'; @@ -20,11 +18,19 @@ import { CompareEphemeral } from '../../../stores/compareEphemeral'; import { ComparePersistent } from '../../../stores/comparePersistent'; import { TankopediaPersistent } from '../../../stores/tankopediaPersistent'; -const modelDefinitions = await fetchModelDefinitions(); -const equipmentDefinitions = await fetchEquipmentDefinitions(); -const provisionDefinitions = await fetchProvisionDefinitions(); -const skillDefinitions = await fetchSkillDefinitions(); -const tankDefinitions = await fetchTankDefinitions(); +const [ + modelDefinitions, + equipmentDefinitions, + provisionDefinitions, + skillDefinitions, + tankDefinitions, +] = await Promise.all([ + awaitableModelDefinitions, + awaitableEquipmentDefinitions, + awaitableProvisionDefinitions, + awaitableSkillDefinitions, + awaitableTankDefinitions, +]); export function Page() { return ( diff --git a/packages/website/src/pages/tools/session/_index.tsx b/packages/website/src/pages/tools/session/_index.tsx index df908df16..0068dff49 100644 --- a/packages/website/src/pages/tools/session/_index.tsx +++ b/packages/website/src/pages/tools/session/_index.tsx @@ -2,8 +2,6 @@ import { compositeStats, compositeStatsKeys, deltaTankStats, - fetchAverageDefinitions, - fetchTankDefinitions, formatCompositeStat, getAccountInfo, getTankStats, @@ -39,10 +37,14 @@ import { PageWrapper } from '../../../components/PageWrapper'; import { StickyRowHeaderCell } from '../../../components/StickyRowHeaderCell'; import { StickyTableRoot } from '../../../components/StickyTableRoot'; import { TankRowHeaderCell } from '../../../components/TankRowHeaderCell'; +import { awaitableAverageDefinitions } from '../../../core/awaitables/averageDefinitions'; +import { awaitableTankDefinitions } from '../../../core/awaitables/tankDefinitions'; import { Session, type SessionTracking } from '../../../stores/session'; -const tankDefinitions = await fetchTankDefinitions(); -const tankAverages = await fetchAverageDefinitions(); +const [tankDefinitions, averageDefinitions] = await Promise.all([ + awaitableTankDefinitions, + awaitableAverageDefinitions, +]); export function Page() { return ( @@ -85,7 +87,7 @@ function Content() { .sort((a, b) => b.last_battle_time - a.last_battle_time) .map((entry) => { const tank = tankDefinitions.tanks[entry.tank_id]; - const average = tankAverages.averages[tank.id]; + const average = averageDefinitions.averages[tank.id]; const composite = compositeStats( { ...entry.all, battle_life_time: entry.battle_life_time }, average?.mu, diff --git a/packages/website/src/pages/tools/tankopedia/[id]/_index.tsx b/packages/website/src/pages/tools/tankopedia/[id]/_index.tsx index d24e96e39..ea1be49f3 100644 --- a/packages/website/src/pages/tools/tankopedia/[id]/_index.tsx +++ b/packages/website/src/pages/tools/tankopedia/[id]/_index.tsx @@ -1,8 +1,3 @@ -import { - fetchModelDefinitions, - fetchProvisionDefinitions, - fetchTankDefinitions, -} from '@blitzkit/core'; import { PageWrapper } from '../../../../components/PageWrapper'; import { CalloutsSection } from '../../../../components/Tankopedia/CalloutsSection'; import { CharacteristicsSection } from '../../../../components/Tankopedia/CharacteristicsSection'; @@ -12,6 +7,9 @@ import { HistorySection } from '../../../../components/Tankopedia/HistorySection import { MetaSection } from '../../../../components/Tankopedia/MetaSection'; import { TechTreeSection } from '../../../../components/Tankopedia/TechTreeSection'; import { VideoSection } from '../../../../components/Tankopedia/VideoSection'; +import { awaitableModelDefinitions } from '../../../../core/awaitables/modelDefinitions'; +import { awaitableProvisionDefinitions } from '../../../../core/awaitables/provisionDefinitions'; +import { awaitableTankDefinitions } from '../../../../core/awaitables/tankDefinitions'; import { App } from '../../../../stores/app'; import { Duel } from '../../../../stores/duel'; import { TankopediaEphemeral } from '../../../../stores/tankopediaEphemeral'; @@ -22,9 +20,12 @@ type PageProps = MaybeSkeletonComponentProps & { id: number; }; -const tankDefinitions = await fetchTankDefinitions(); -const provisionDefinitions = await fetchProvisionDefinitions(); -const modelDefinitions = await fetchModelDefinitions(); +const [tankDefinitions, provisionDefinitions, modelDefinitions] = + await Promise.all([ + awaitableTankDefinitions, + awaitableProvisionDefinitions, + awaitableModelDefinitions, + ]); export function Page({ id, skeleton }: PageProps) { const tank = tankDefinitions.tanks[id]; diff --git a/packages/website/src/stores/tankopediaEphemeral.ts b/packages/website/src/stores/tankopediaEphemeral.ts index 4698a2f30..661f3d6b8 100644 --- a/packages/website/src/stores/tankopediaEphemeral.ts +++ b/packages/website/src/stores/tankopediaEphemeral.ts @@ -1,6 +1,5 @@ import { createDefaultSkills, - fetchSkillDefinitions, ShellDefinition, type ModelDefinition, } from '@blitzkit/core'; @@ -10,6 +9,7 @@ import { subscribeWithSelector } from 'zustand/middleware'; import type { ArmorType } from '../components/Armor/components/SpacedArmorScene'; import type { ExternalModuleVariant } from '../components/Armor/components/SpacedArmorSceneComponent'; import type { XP_MULTIPLIERS } from '../components/Tankopedia/TechTreeSection'; +import { awaitableSkillDefinitions } from '../core/awaitables/skillDefinitions'; import { createContextualStore } from '../core/zustand/createContextualStore'; export interface ShotLayerBase { @@ -102,7 +102,7 @@ interface TankopediaEphemeral { customShell?: ShellDefinition; } -const skillDefinitions = await fetchSkillDefinitions(); +const skillDefinitions = await awaitableSkillDefinitions; export const TankopediaEphemeral = createContextualStore( (model: ModelDefinition) => {