import React from 'react' /** * CategorySelector * * Reusable pill-based category + subcategory selector. * Renders root categories as pills; when a root with children is selected, * subcategory pills appear in an animated block below. * * @param {object} props * @param {Array} props.categories Flat list of root-category objects { id, name, children[] } * @param {string} props.rootCategoryId Currently selected root id * @param {string} props.subCategoryId Currently selected sub id * @param {boolean} props.hasContentType Whether a content type is selected (gate) * @param {string} [props.error] Validation error message * @param {function} props.onRootChange Called with (rootId: string) * @param {function} props.onSubChange Called with (subId: string) * @param {Array} [props.allRoots] All root options (for the hidden accessible select) * @param {function} [props.onRootChangeAll] Fallback handler with full cross-type info */ export default function CategorySelector({ categories = [], rootCategoryId = '', subCategoryId = '', hasContentType = false, error = '', onRootChange, onSubChange, allRoots = [], onRootChangeAll, }) { const selectedRoot = categories.find((c) => String(c.id) === String(rootCategoryId || '')) ?? null const hasSubcategories = Boolean( selectedRoot && Array.isArray(selectedRoot.children) && selectedRoot.children.length > 0 ) if (!hasContentType) { return (
Select a content type to load categories.
) } if (categories.length === 0) { return (
No categories available for this content type.
) } return (
{/* Root categories */}
{categories.map((root) => { const active = String(root.id) === String(rootCategoryId || '') return ( ) })}
{/* Subcategories (shown when root has children) */} {hasSubcategories && (

Subcategory for {selectedRoot.name}

{selectedRoot.children.map((sub) => { const active = String(sub.id) === String(subCategoryId || '') return ( ) })}
)} {/* Accessible hidden select (screen readers / fallback) */}
{hasSubcategories && ( <> )}
{error && (

{error}

)}
) }