import { fisherYates, tankIcon } from "@blitzkit/core"; import { literals } from "@blitzkit/i18n"; import { ChevronRightIcon } from "@radix-ui/react-icons"; import { AlertDialog, Box, Button, Flex, Grid, Skeleton, Text, } from "@radix-ui/themes"; import { useMemo, useState } from "react"; import usePromise from "react-promise-suspense"; import { api } from "../api/dynamic"; import { filterTanks } from "../core/blitzkit/filterTanks"; import { generatePlaylist } from "../core/blitzkit/generatePlaylist"; import { useLocale } from "../hooks/useLocale"; import { App } from "../stores/app"; import { TankFilters } from "../stores/tankFilters"; import type { MaybeSkeletonComponentProps } from "../types/maybeSkeletonComponentProps"; import { LinkI18n } from "./LinkI18n"; import { TankSearchFilters } from "./TankSearchFilters"; const tankDefinitions = await api.tanks(); const POOL_HEIGHT = "16rem"; const FILTERS_WIDTH = "32rem"; export function PlaylistGenerator({ skeleton }: MaybeSkeletonComponentProps) { const [largeWarningOpen, setLargeWarningOpen] = useState(false); const { strings, locale } = useLocale(); const wargaming = App.use((state) => state.logins.wargaming); const filters = TankFilters.use(); const randomTankList = useMemo( () => fisherYates(Object.values(tankDefinitions.tanks)), [filters], ); const tanks = usePromise( () => filterTanks(filters, randomTankList, wargaming?.id), // react-promise-suspense has awful type annotations [filters] as any, ); const tanksTrimmed = useMemo(() => tanks.slice(0, 65), [filters]); return ( <> {strings.website.tools.playlist.large_warning.title} {literals( strings.website.tools.playlist.large_warning.description, { count: tanks.length, time: Math.round(tanks.length * ((2 * 4) / 60)), }, )} {tanksTrimmed.map((tank) => skeleton ? ( ) : ( ), )} {literals(strings.website.tools.playlist.pool_size, { count: tanks.length, })} ); }