@eeacms/volto-accordion-block
Version:
volto-accordion-block: Volto accordion block
113 lines (104 loc) • 3.11 kB
JSX
import cx from 'classnames';
import React from 'react';
import AnimateHeight from 'react-animate-height';
import { Accordion, Input } from 'semantic-ui-react';
import { Icon } from './util';
import config from '@plone/volto/registry';
import { defineMessages, injectIntl } from 'react-intl';
const messages = defineMessages({
EnterTitle: {
id: 'Enter Title',
defaultMessage: 'Enter Title',
},
});
const AccordionEdit = (props) => {
const {
children,
handleTitleChange,
handleTitleClick,
uid,
panel,
data,
index,
intl,
} = props;
const [activeIndex, setActiveIndex] = React.useState([0]);
const accordionConfig = config.blocks.blocksConfig.accordion;
const { titleIcons } = accordionConfig;
const isActive = activeIndex.includes(index);
const iconOnRight = data.right_arrows;
const iconPosition = iconOnRight ? 'rightPosition' : 'leftPosition';
const handleClick = (e, itemProps) => {
const { index } = itemProps;
if (data.non_exclusive) {
const newIndex =
activeIndex.indexOf(index) === -1
? [...activeIndex, index]
: activeIndex.filter((item) => item !== index);
setActiveIndex(newIndex);
} else {
const newIndex =
activeIndex.indexOf(index) === -1
? [index]
: activeIndex.filter((item) => item !== index);
setActiveIndex(newIndex);
}
};
React.useEffect(() => {
return data.collapsed ? setActiveIndex([]) : setActiveIndex([0]);
}, [data.collapsed]);
return (
<Accordion
className={
data.styles ? data.styles.theme : accordionConfig?.defaults?.theme
}
{...accordionConfig.options}
>
<React.Fragment>
<Accordion.Title
as={data.title_size}
active={isActive}
index={index}
onClick={handleClick}
className={cx('accordion-title', {
'align-arrow-left': !iconOnRight,
'align-arrow-right': iconOnRight,
})}
>
<Icon
options={titleIcons}
name={
isActive
? titleIcons.opened[iconPosition]
: titleIcons.closed[iconPosition]
}
/>
{!data.readOnlyTitles ? (
<Input
fluid
className="input-accordion-title"
transparent
placeholder={intl.formatMessage(messages.EnterTitle)}
value={panel?.title || ''}
onClick={(e) => {
handleTitleClick();
e.stopPropagation();
}}
onChange={(e) => handleTitleChange(e, [uid, panel])}
/>
) : (
<span>{panel?.title}</span>
)}
</Accordion.Title>
<AnimateHeight
animateOpacity
duration={500}
height={isActive ? 'auto' : 0}
>
<Accordion.Content active={isActive}>{children}</Accordion.Content>
</AnimateHeight>
</React.Fragment>
</Accordion>
);
};
export default injectIntl(AccordionEdit);