import React, { useEffect, useRef, useState } from 'react' import uniqueId from 'lodash.uniqueid' import { ItemChoiceProps } from '../../../itemChoice' import { Col, Grid, HighlightSectionElements } from './HighlightSection.style' export type HighlightItemsType = ItemChoiceProps & Readonly<{ hidden?: boolean }> type GridListItemsProps = { items: Array } const GridListItems = ({ items }: GridListItemsProps) => { const listItems = items.map(({ id, label, data, hidden, href }) => ( )) return {listItems} } type HighlightContentItemsProps = { heading: string items: Array } const HighlightContentItems = ({ heading, items }: HighlightContentItemsProps) => ( {heading} ) const DEFAULT_ITEMS_SIZE = 3 export type HighlightsType = { heading: string; items: Array } export type HighlightSectionProps = Readonly<{ className?: string highlights: { featured: HighlightsType; optional?: HighlightsType } toggle: { on: string; off: string } }> const setFocus = (collapsed: boolean) => { // eslint-disable-next-line react-hooks/rules-of-hooks const collapsibleRegionWrapper = useRef() const focusCollapsibleRegion = (): void => { const collapsibleRegion = collapsibleRegionWrapper.current as HTMLDivElement collapsibleRegion.focus() } // eslint-disable-next-line react-hooks/rules-of-hooks useEffect(() => { if (!collapsed) { focusCollapsibleRegion() } }, [collapsed]) return collapsibleRegionWrapper } export const HighlightSection = ({ highlights, toggle, className }: HighlightSectionProps) => { const [collapsed, setCollapsed] = useState(true) const { featured, optional } = highlights const displayedItems = featured.items.map((item, index) => ({ ...item, hidden: collapsed && index >= DEFAULT_ITEMS_SIZE, })) const collapsibleRegionId = uniqueId('region-') // Set Focus const collapsibleRegionWrapper = optional ? setFocus(collapsed) : null return ( {optional && ( )} setCollapsed(!collapsed)} aria-expanded={!collapsed} aria-controls={collapsibleRegionId} > {toggle[collapsed ? 'on' : 'off']} ) }