Skip to content
Snippets Groups Projects
Feature.tsx 2.41 KiB
Newer Older
tovo's avatar
tovo committed
import React from "react";
import { IGatsbyImageData } from "gatsby-plugin-image";

tovo's avatar
tovo committed
import Image from "./core/Image";
tovo's avatar
tovo committed
import Map from "./core/Map";
tovo's avatar
tovo committed
import Button from "./core/Button";
tovo's avatar
tovo committed

interface Props {
  title?: string;
  content?: string;
  image?: string | IGatsbyImageData;
  idMap?: number;
  layout?: 'left' | 'right';
  backgroundImage?: string;
  action?: {
tovo's avatar
tovo committed
    title?: string;
    to?: string;
    className?: string;
tovo's avatar
tovo committed
  };
  custom?: JSX.Element;
}
tovo's avatar
tovo committed
interface FeatureComponentProps {
  image?: string | IGatsbyImageData;
  idMap?: number;
  custom?: JSX.Element;
}
tovo's avatar
tovo committed


const oClassName = {
  'left' : {
    'container': 'flex-col lg:flex-row',
    'content': 'pt-10 lg:pl-10'
  },
  'right' : {
    'container': 'flex-col-reverse lg:flex-row-reverse',
    'content': 'pt-10 pb-10 lg:pr-10 lg:pb-0'
  }
}


tovo's avatar
tovo committed
const FeatureComponent  = (props: FeatureComponentProps) => {
  const {
    image,
    idMap,
    custom
  } = props;

  if (idMap) {
    return (
      <>
        <Map
          idMap={idMap}
        />
      </>
    )
  }

  if (image) {
    return (
      <>
tovo's avatar
tovo committed
        <Image 
tovo's avatar
tovo committed
          image={image}
        />
      </>
    )
  }

  return (
    <>
      {custom && custom}
    </>
  );
}


tovo's avatar
tovo committed
const Feature = (props: Props) => {
  const {
    layout='left',
    title='',
    content='',
    image,
    idMap,
    backgroundImage,
    action,
    custom
  } = props;

  const className = oClassName[layout];
  const bTextOnly = ( ! (idMap || image || custom));
  const classNameContent = (bTextOnly) ? 'grow' : `lg:w-1/2 ${className['content']}`;
  const classNameBackground = (backgroundImage) ? "bg-[url('" + backgroundImage + "')] bg-cover bg-no-repeat bg-center " : '';

  return (
    <div className={`flex ${className['container']} ${classNameBackground}`}>
      {
        ! bTextOnly && (
          <div className="h-[480px] lg:w-1/2">
            <FeatureComponent 
              idMap={idMap}
              image={image}
              custom={custom}
            />
          </div>
        )
      }
      <div className={classNameContent}>
        <h2 className="font-extrabold sm:text-4xl">{title}</h2>
tovo's avatar
tovo committed
        <p className="text-xl leading-8 pt-10 text-justify">{content}</p>
tovo's avatar
tovo committed
        {
          action && (
tovo's avatar
tovo committed
            <Button 
              title={action.title}
tovo's avatar
tovo committed
              to={action.to}
tovo's avatar
tovo committed
              className={`mt-10 ${action.className}`}
tovo's avatar
tovo committed
            />
tovo's avatar
tovo committed
          )
tovo's avatar
tovo committed
        }
tovo's avatar
tovo committed
      </div>
    </div>
  );
};

export default Feature;