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

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

interface Props {
Toavina's avatar
Toavina committed
    title?: string
    content?: string
    image?: string | IGatsbyImageData
    mapid?: number
Toavina's avatar
Toavina committed
    layout?: "left" | "right"
    backgroundImage?: string
    action?: {
        name?: string
        url?: string
Toavina's avatar
Toavina committed
        className?: string
    }
    custom?: JSX.Element
tovo's avatar
tovo committed
}
tovo's avatar
tovo committed
interface FeatureComponentProps {
Toavina's avatar
Toavina committed
    image?: string | IGatsbyImageData
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
    mapid?: number
Toavina's avatar
Toavina committed
    custom?: JSX.Element
tovo's avatar
tovo committed
}
tovo's avatar
tovo committed

const oClassName = {
Toavina's avatar
Toavina committed
    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
}

Toavina's avatar
Toavina committed
const FeatureComponent = (props: FeatureComponentProps) => {
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
    const { image, mapid, custom } = props
tovo's avatar
tovo committed

Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
    if (mapid) {
Toavina's avatar
Toavina committed
        return (
            <>
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                <Map mapid={mapid} />
Toavina's avatar
Toavina committed
            </>
        )
    }
tovo's avatar
tovo committed

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

Toavina's avatar
Toavina committed
    return <>{custom && custom}</>
tovo's avatar
tovo committed
}

tovo's avatar
tovo committed
const Feature = (props: Props) => {
Toavina's avatar
Toavina committed
    const {
        layout = "left",
        title = "",
        content = "",
        image,
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
        mapid,
Toavina's avatar
Toavina committed
        backgroundImage,
        action,
        custom,
    } = props
tovo's avatar
tovo committed

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

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

Toavina's avatar
Toavina committed
export default Feature