import clsx from "clsx"; import { FC, HTMLAttributes, useEffect, useState } from "react"; import CircleInfo from "@dndbeyond/fontawesome-cache/svgs/regular/circle-info.svg"; import { Accordion } from "~/components/Accordion"; import { HtmlContent } from "~/components/HtmlContent"; import { Link } from "~/components/Link"; import { Toggle } from "~/components/Toggle"; import { Tooltip } from "~/components/Tooltip"; import { orderBy } from "~/helpers/sortUtils"; import { useCharacterEngine } from "~/hooks/useCharacterEngine"; import { useSource } from "~/hooks/useSource"; import { Select } from "~/tools/js/smartComponents/legacy"; import { RaceDefinitionContract } from "~/types"; import { Button } from "../../../../components/Button"; import { ConfirmSpeciesModal } from "../../components/ConfirmSpeciesModal"; import { Listing } from "../../components/Listing"; import { PortraitName } from "../../components/PortraitName"; import { Search } from "../../components/Search"; import { SpeciesDisplay } from "../../components/SpeciesDisplay"; import { Spinner } from "../../components/Spinner"; import { useSpeciesContext } from "../../contexts/Species"; import styles from "./styles.module.css"; //showHeader and OnQuickSelect are only be used from QuickBuild.tsx and RandomBuild.tsx export interface SpeciesChooseProps extends HTMLAttributes { showHeader?: boolean; onQuickSelect?: (species: RaceDefinitionContract) => void; } export interface SourceGroupMapping { name: string; id: number; items: RaceDefinitionContract[]; sortOrder: number | undefined; isOpen: boolean; } export const SpeciesChoose: FC = ({ showHeader = true, onQuickSelect, className, ...props }) => { const { race: currentSpecies } = useCharacterEngine(); const { allSpecies, closeModal, filteredSpecies, isLegacyShowing, isModalShowing, setSource, source, sourceOptions, toggleLegacyContent, transformSpecies, query, setQuery, isLoading, getSpeciesInGroups, } = useSpeciesContext(); const { getSourceCategoryGroups, getSourceCategoryDescription } = useSource(); const [mappedSourceCategoryGroups, setMappedSourceCategoryGroups] = useState< SourceGroupMapping[] >([]); useEffect(() => { const sourceCategoryGroups = getSourceCategoryGroups(filteredSpecies); setMappedSourceCategoryGroups( sourceCategoryGroups.map((group) => ({ ...group, isOpen: true, })) ); }, [filteredSpecies]); const handleOverrideClick = (override): void => { const updatedGroups = mappedSourceCategoryGroups.map((group) => ({ ...group, isOpen: override, })); setMappedSourceCategoryGroups(updatedGroups); }; const handleSourceCategoryClick = (id: string, state: boolean): void => { const parsedId = parseInt(id); const updatedGroups = mappedSourceCategoryGroups.map((group) => ({ ...group, isOpen: group.id === parsedId ? state : group.isOpen, })); setMappedSourceCategoryGroups(updatedGroups); }; return ( {showHeader && ( <> {currentSpecies ? "Change Origin: " : "Choose Origin: "} {"Species"} {currentSpecies && ( <> Select New Species > )} > )} Filter Species Source(s) setSource(value)} /> Show Legacy Content{" "} <> Legacy content doesn't reflect the latest rules and lore.{" "} Learn More > Looking for something not in the list below? Unlock all official options in the Marketplace. {isLoading ? ( ) : ( <> setQuery(e.target.value)} /> handleOverrideClick(false)} forceThemeMode="light" > Collapse All handleOverrideClick(true)} forceThemeMode="light" > Expand All {mappedSourceCategoryGroups.length > 0 ? ( mappedSourceCategoryGroups.map((category) => { const name = category.name; const id = category.id; const description = getSourceCategoryDescription(category.id); const currentSpeciesId = currentSpecies ? [ `${currentSpecies.entityRaceId}-${currentSpecies.entityRaceTypeId}`, ] : []; const groupedSpecies = getSpeciesInGroups( transformSpecies(category.items) ); const metaItems = description ? [] : []; return ( {name}} summaryMetaItems={metaItems} variant="text" resetOpen={allSpecies.length !== filteredSpecies.length} key={id} forceShow override={category.isOpen} handleIsOpen={handleSourceCategoryClick} > ); }) ) : ( No Results Found )} > )} ); };
No Results Found