UNPKG

design-comuni-plone-theme

Version:
164 lines (155 loc) 4.46 kB
import React from 'react'; import PropTypes from 'prop-types'; import { defineMessages, useIntl } from 'react-intl'; import { UncontrolledDropdown, DropdownToggle, DropdownMenu, LinkList, LinkListItem, Button, } from 'design-react-kit'; import { toPublicURL } from '@plone/volto/helpers'; import Icon from 'design-comuni-plone-theme/components/ItaliaTheme/Icons/Icon'; /** * Actions view component class. * @function Actions * @params {object} content: Content object. * @returns {string} Markup of the component. */ const messages = defineMessages({ actions: { id: 'actions', defaultMessage: 'Vedi azioni', }, print: { id: 'print', defaultMessage: 'Stampa', }, mailto: { id: 'mailto', defaultMessage: 'Invia', }, download: { id: 'download', defaultMessage: 'Scarica', }, }); const Actions = (props) => { const intl = useIntl(); const publicUrl = toPublicURL(props.url); const socials = [ { id: 'print', attributes: null, title: intl.formatMessage(messages.print), url: '#', icon: 'it-print', }, { id: 'mailto', attributes: null, title: intl.formatMessage(messages.mailto), url: `mailto:?subject=${props.title}&body=${publicUrl}`, icon: 'it-mail', }, ]; const handlePrint = (e) => { e.preventDefault(); return window.print(); }; const handleKeyDown = (e) => { if (e.key === 'Enter' || e.code === 'Space') { const childElement = e.target.firstChild; if (childElement.tagName === 'BUTTON' || childElement.tagName === 'A') { // La libreria del dropdown ha dei problemi nel suo focus manager interno. // Enter e spazio chiudono il menu, quindi fermiamo il bubbling (per chiudere si usa esc, // come correttamente dichiarato dallo screen reader), poi simuliamo il click e.stopPropagation(); childElement.click(); } } }; return ( <UncontrolledDropdown className="d-inline page-actions" id="page-actions"> <DropdownToggle className={`btn btn-dropdown ps-0`} color="" tag={'button'} caret > <Icon className={undefined} color="" icon="it-more-items" padding={false} size="" alt={intl.formatMessage(messages.actions)} title={intl.formatMessage(messages.actions)} /> <small>{intl.formatMessage(messages.actions)}</small> </DropdownToggle> <DropdownMenu> <LinkList> {socials.map((item, i) => { const commonButtonProps = { icon: undefined, title: item.title, alt: item.title, 'aria-label': item.title, id: item.id, }; const icon = ( <> <Icon className={undefined} color="" icon={item.icon} padding={false} size="" alt={item.title} title={item.title} /> <span>{item.title}</span> </> ); let buttonProps = { ...commonButtonProps }; if (item.id === 'print') buttonProps = { ...commonButtonProps, tag: 'button', onClick: handlePrint, color: 'link', }; else if (item.id === 'mailto') buttonProps = { ...commonButtonProps, href: item.url, }; return ( // https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/menu_role#:~:text=within%20the%20menu-,tabindex,-attribute <LinkListItem key={item.id} role="menuitem" tabIndex={-1} onKeyDown={handleKeyDown} > {item.id === 'print' && ( <Button {...buttonProps}>{icon}</Button> )} {item.id === 'mailto' && <a {...buttonProps}>{icon}</a>} </LinkListItem> ); })} </LinkList> </DropdownMenu> </UncontrolledDropdown> ); }; export default Actions; Actions.propTypes = { params: PropTypes.shape({ title: PropTypes.string, url: PropTypes.string, }), };