/**
* External dependencies
*/
import { faChevronLeft } from '@fortawesome/free-solid-svg-icons';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { Link } from 'react-router-dom';
export interface ILayout {
// Page Heading Section: Required
title: JSX.Element;
slug: string;
headingCustomClass?: string;
// Back buttons
hasBackButton?: boolean;
backButtonTitle?: string;
backButtonLink?: string;
// Page Right Side Contents
hasRightSideContent?: boolean;
rightSideContent?: JSX.Element;
children: React.ReactNode;
}
/**
* Generate Default Props for Layout component.
*/
const LayoutDefaultProps = {
title: <></>,
slug: '',
headingCustomClass: '',
hasBackButton: false,
backButtonTitle: '',
backButtonLink: '',
hasRightSideContent: false,
rightSideContent: <></>,
};
/**
* Layout Component.
*
* Handles all of the page scaffolding.
*
* @param props
* @return {JSX.Element} JSX element
*/
const Layout = (props: ILayout) => {
const {
title,
slug,
headingCustomClass,
hasBackButton,
backButtonTitle,
backButtonLink,
hasRightSideContent,
rightSideContent,
children,
} = props;
const getClassNames = () => {
let leftSideClassNames = 'flex-1';
const rightSideClassNames = 'flex-1 text-right';
// For overview/dashboard page, remove right side flex for mobile devices.
if ('overview' === slug || 'email-template-create' === slug) {
leftSideClassNames = 'flex-none';
}
return {
leftSideClassNames,
rightSideClassNames,
};
};
return (
<div className={`cp-${slug}-page`}>
{hasBackButton && (
<div className="w-full mb-2">
<Link
to={
typeof backButtonLink !== 'undefined'
? backButtonLink
: ''
}
className="focus:shadow-none focus:outline-none"
>
<span className="text-gray-dark text-sm">
<FontAwesomeIcon
icon={faChevronLeft}
className="mr-3"
/>
{backButtonTitle}
</span>
</Link>
</div>
)}
{/* Page Heading Section */}
<div className={`flex mb-5 mx-8 ${headingCustomClass}`}>
<div className={getClassNames().leftSideClassNames}>
{title}
</div>
{/* Page Right Side Section */}
{hasRightSideContent && (
<div className={getClassNames().rightSideClassNames}>
{rightSideContent}
</div>
)}
</div>
{/* Page Content Section */}
<div className="cp-content-area mx-8">{children}</div>
</div>
);
};
Layout.defaultProps = LayoutDefaultProps;
export default Layout;
|