@eightshift/frontend-libs
Version:
A collection of useful frontend utility modules. powered by Eightshift
141 lines (127 loc) • 4.23 kB
JavaScript
import React from 'react';
import { __ } from '@wordpress/i18n';
import { Button, TextControl } from '@wordpress/components';
import {
LinkInput,
PopoverWithTrigger,
ReOrderable,
ReOrderableItem,
checkAttr,
getAttrKey,
props,
selector,
} from '@eightshift/frontend-libs/scripts';
import { icons } from '@eightshift/ui-components/icons';
import { clsx } from '@eightshift/ui-components/utilities';
import { ImageEditor } from '../../../components/image/components/image-editor';
import manifest from '../manifest.json';
export const SiteNavigationEditor = ({ attributes, setAttributes }) => {
const {
blockClass,
} = attributes;
const linksClass = selector(blockClass, blockClass, 'links');
const linkClass = clsx(selector(
blockClass, blockClass, 'link'),
'es-border-cool-gray-100 es-cursor-pointer es-bg-none es-pl-2 es-pr-1.25 es-py-1 es-rounded-2',
);
const siteNavigationLinks = checkAttr('siteNavigationLinks', attributes, manifest);
return (
<div className={blockClass}>
<ImageEditor
{...props('logo', attributes, {
setAttributes,
blockClass: blockClass,
selectorClass: 'logo',
})}
/>
<div className={linksClass}>
<ReOrderable
items={siteNavigationLinks}
attributeName={getAttrKey('siteNavigationLinks', attributes, manifest)}
setAttributes={setAttributes}
noBottomSpacing
horizontalVertical
additionalHorizontalVerticalContainerClasses='es-h-spaced-wrap'
>
{siteNavigationLinks.map((link, i) => {
return (
<ReOrderableItem
innerClass={linkClass}
title={link?.text?.length > 0 ? link.text : <i>{__('New link', '%g_textdomain%')}</i>}
preIcon={
<div className='es-display-flex'>
<button
onClick={() => {
const newValue = [...siteNavigationLinks].filter((_, index) => index !== i);
setAttributes({ [getAttrKey('siteNavigationLinks', attributes, manifest)]: newValue });
}}
className='es-button-reset es-bg-transparent es-cursor-pointer es-color-cool-gray-650 es-hover-color-admin-accent es-mr-1 es-line-h-0'
>
{icons.trash}
</button>
<PopoverWithTrigger
trigger={({ ref, setIsOpen, isOpen }) => (
<button
ref={ref}
onClick={() => setIsOpen(!isOpen)}
className='es-button-reset es-bg-transparent es-cursor-pointer es-color-cool-gray-650 es-hover-color-admin-accent es-mr-1 es-line-h-0'
>
{icons.editOptions}
</button>
)}
contentClass='es-popover-content es-w-88'
>
<TextControl
label={__('Link text', '%g_textdomain%')}
value={link?.text}
onChange={(value) => {
const newValue = [...siteNavigationLinks];
newValue[i].text = value;
setAttributes({ [getAttrKey('siteNavigationLinks', attributes, manifest)]: newValue });
}}
/>
<LinkInput
label={__('URL', '%g_textdomain%')}
url={link?.url}
opensInNewTab={link?.newTab}
onChange={({ url, newTab }) => {
const newValue = [...siteNavigationLinks];
if (typeof url !== 'undefined') {
newValue[i].url = url;
}
if (typeof newTab !== 'undefined') {
newValue[i].newTab = newTab;
}
setAttributes({ [getAttrKey('siteNavigationLinks', attributes, manifest)]: newValue });
}}
hideAnchorNotice
noBottomSpacing
/>
</PopoverWithTrigger>
</div>
}
key={link?.id}
/>
);
})}
</ReOrderable>
<Button
icon={icons.plusCircleFillAlt}
className='es-button-square-28 es-button-icon-24'
onClick={() => {
setAttributes({
[getAttrKey('siteNavigationLinks', attributes, manifest)]: [
...siteNavigationLinks,
{
id: (siteNavigationLinks?.length ?? 0) + 1,
url: '',
text: '',
newTab: false,
}],
});
}}
/>
</div>
</div>
);
};