UNPKG

design-comuni-plone-theme

Version:
108 lines (97 loc) 3.58 kB
/** * FaqFolderTree view component. * @module components/theme/View/FaqFolderTree */ import React, { useState } from 'react'; import { Icon } from 'design-comuni-plone-theme/components/ItaliaTheme'; import { TextOrBlocks } from 'design-comuni-plone-theme/components/ItaliaTheme/View'; import { UniversalLink } from '@plone/volto/components'; import { Accordion, AccordionHeader, AccordionBody } from 'design-react-kit'; /** * FaqFolderTree view component class. * @function FaqFolderTree * @params {object} content Content object. * @returns {string} Markup of the component. */ const FaqFolderTree = ({ tree }) => { const FaqFolder = ({ item, level = 0 }) => { const [itemOpened, setItemOpened] = useState(null); let title = ( <UniversalLink item={item}> {item.icon && <Icon icon={item.icon} />} {item.title} </UniversalLink> ); const children_folders = item.items?.filter((i) => i['@type'] === 'FaqFolder') || []; const children_faq = item.items?.filter((i) => i['@type'] === 'Faq') || []; return ( <div className={`faq-folder level-${level}`}> {level > 0 && ( <> {level === 1 && <h2 className="folder-title">{title}</h2>} {level === 2 && <h3 className="folder-title">{title}</h3>} {level === 3 && <h4 className="folder-title">{title}</h4>} {level === 4 && <h5 className="folder-title">{title}</h5>} {level === 5 && <h6 className="folder-title">{title}</h6>} {item.description && ( <div className="folder-description">{item.description}</div> )} </> )} {item.items?.length > 0 && ( <> {children_faq?.length > 0 && ( <Accordion> {children_faq.map((r) => { const isOpen = itemOpened === r['@id']; return ( <div className="faq" key={r['@id']}> <AccordionHeader active={isOpen} onToggle={(a, b) => { isOpen ? setItemOpened(null) : setItemOpened(r['@id']); }} tag="button" aria-controls={`faq-${r.UID}`} aria-expanded={isOpen} id={`header-${r.UID}`} > {r.title} </AccordionHeader> <AccordionBody active={isOpen} id={`faq-${r.UID}`} aria-labelledby={`header-${r.UID}`} aria-hidden={!isOpen} role="region" > {r.description?.length > 0 && ( <div className="faq-description">{r.description}</div> )} <div className="faq-text"> <TextOrBlocks content={r} /> </div> </AccordionBody> </div> ); })} </Accordion> )} </> )} {children_folders.map((r) => ( <FaqFolder key={r['@id']} item={r} level={level + 1} /> ))} </div> ); }; return ( <div className="faq-tree"> <FaqFolder item={tree} /> </div> ); }; export default FaqFolderTree;