feat: optimize awaitables

This commit is contained in:
tresabhi committed 2024-11-29 13:20:27 -06:00
1 parent 80fca2e53a
commit 74e85f82f1
54 files changed
+259 -190

No files matched your search

BIN
View File
Binary file not shown.
@@ -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<BkrlSuperset1Entry, 'id'>;
} satisfies Omit<RatingLeaderboardEntryV2, 'id'>;
}
export interface RatingPlayer {
spa_id: number;
@@ -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);
@@ -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,
@@ -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);
@@ -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<string, number>) => void;
}
const skillDefinitions = await fetchSkillDefinitions();
const skillDefinitions = await awaitableSkillDefinitions;
export function CrewSkillManager({
skillLevels,
@@ -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(
{
@@ -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]) => ({
@@ -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,
@@ -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 (
@@ -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 (
@@ -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() {
@@ -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));
@@ -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<TankRowProps>(
({ tank }) => {
@@ -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) {
@@ -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<TotalProps>(
({ tanks }) => {
@@ -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);
@@ -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);
@@ -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();
@@ -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<FlexProps, 'onSelect'> & {
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<TankSearchProps>(
({ compact, onSelect, onSelectAll, ...props }) => {
@@ -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],
},
);
})
@@ -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();
@@ -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();
@@ -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();
@@ -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();
@@ -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();
@@ -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);
@@ -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, number> = {
[Pose.Default]: -1,
};
const modelDefinitions = await fetchModelDefinitions();
const modelDefinitions = await awaitableModelDefinitions;
export function Controls() {
const duelStore = Duel.useStore();
@@ -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<HTMLCanvasElement>(null);
@@ -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);
@@ -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);
@@ -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];
@@ -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);
@@ -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);
@@ -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;
@@ -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);
@@ -0,0 +1,3 @@
import { fetchAverageDefinitions } from '@blitzkit/core';
export const awaitableAverageDefinitions = fetchAverageDefinitions();
@@ -0,0 +1,3 @@
import { fetchConsumableDefinitions } from '@blitzkit/core';
export const awaitableConsumableDefinitions = fetchConsumableDefinitions();
@@ -0,0 +1,4 @@
import { fetchDiscoveredIdsDefinitions } from '@blitzkit/core';
export const awaitableDiscoveredIdsDefinitions =
fetchDiscoveredIdsDefinitions();
@@ -0,0 +1,3 @@
import { fetchEquipmentDefinitions } from '@blitzkit/core';
export const awaitableEquipmentDefinitions = fetchEquipmentDefinitions();
@@ -0,0 +1,3 @@
import { fetchGameDefinitions } from '@blitzkit/core';
export const awaitableGameDefinitions = fetchGameDefinitions();
@@ -0,0 +1,3 @@
import { fetchModelDefinitions } from '@blitzkit/core';
export const awaitableModelDefinitions = fetchModelDefinitions();
@@ -0,0 +1,3 @@
import { fetchProvisionDefinitions } from '@blitzkit/core';
export const awaitableProvisionDefinitions = fetchProvisionDefinitions();
@@ -0,0 +1,3 @@
import { fetchReviews } from '@blitzkit/core';
export const awaitableReviews = fetchReviews();
@@ -0,0 +1,3 @@
import { fetchSkillDefinitions } from '@blitzkit/core';
export const awaitableSkillDefinitions = fetchSkillDefinitions();
@@ -0,0 +1,3 @@
import { fetchTankDefinitions } from '@blitzkit/core';
export const awaitableTankDefinitions = fetchTankDefinitions();
@@ -0,0 +1,3 @@
import { fetchTankNames } from '@blitzkit/core';
export const awaitableTankNames = fetchTankNames();
@@ -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;
}
@@ -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);
+2 -2
View File
@@ -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(
@@ -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 (
@@ -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,
@@ -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];
@@ -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) => {