Skip to content
Snippets Groups Projects
Section.tsx 5.45 KiB
Newer Older
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
import React from "react"

import { useStaticQuery, graphql } from "gatsby"
import { twMerge } from "tailwind-merge"
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed

import { Content, Button } from "@onegeo-suite/gatsby-theme-onegeo"
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
import Component from "./section/component"

interface ISection {
    id: string
}

Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
const GRAPHQL_QUERY = graphql`
    query getSections {
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
        directus {
            sections {
                id
                title
                subtitle
                content
                background
                size
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                actions {
                    actions_id {
                        name
                        url
                        style
                        id
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                    }
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                }
                components {
                    components_id {
                        id
                        title
                        subtitle
                        content
                        url_dataviz
                        url_map
                        type
                        mapdid
                        layout
                        length
                        size
Julien MARGAIL's avatar
Julien MARGAIL committed
                        options
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                        actions {
                            actions_id {
                                name
                                url
                                style
Julien MARGAIL's avatar
Julien MARGAIL committed
                                color
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                                id
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                            }
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                        }
                        services {
                            services_id {
                                name
                                url
                                description
                                id
                                image {
                                    imageFile {
                                        publicURL
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                                    }
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                                    id
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                                }
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                            }
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                        }
                        images {
                            directus_files_id {
                                imageFile {
                                    childImageSharp {
                                        gatsbyImageData
                                    }
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                                }
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                                id
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
        }
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
    }
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
`
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed

Julien MARGAIL's avatar
Julien MARGAIL committed
const sectionColumns = {
    1: "lg:grid-cols-1",
    2: "lg:grid-cols-2",
    3: "lg:grid-cols-3",
}
const sectionSize = {
    full: "max-w-full",
    xl: "max-w-7xl",
    lg: "max-w-4xl",
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
const Section = (props: ISection) => {
    const { id } = props

Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
    const data = useStaticQuery(GRAPHQL_QUERY)
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed

Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
    const section = data.directus.sections.find((section) => section.id === id)
    if (!section) return null
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed

    const options = section.options ?? {}
    const oClass = options.class || {}

    // Need style for custom color / classname at runtime
    const ContentStyle = section.background
        ? { backgroundColor: section.background }
        : undefined

Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
    return (
            className={twMerge("mb-10", sectionSize[section.size], oClass.main)}
            style={ContentStyle}
        >
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
            {section.title && (
                <h2
                    className={twMerge("text-3xl font-extrabold", oClass.title)}
                >
                    {section.title}
                </h2>
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
            )}
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
            {section.subtitle && (
                <h4
                    className={twMerge(
                        "mt-2 text-2xl font-bold",
                        oClass.subtitle
                    )}
                >
                    {section.subtitle}
                </h4>
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
            )}
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
            {section.content && (
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                <div
                    className={twMerge(
                        "py-4 text-justify text-lg leading-8",
                        oClass.content
                    )}
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                    dangerouslySetInnerHTML={{ __html: section.content }}
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                ></div>
            )}
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
            {section.components.length > 0 && (
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                <div
                    className={twMerge(
                        "grid grid-cols-1 gap-4",
                        sectionColumns[section.components.length],
                        oClass.components
                    )}
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                >
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                    {section.components.map((component) => {
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                        const dtComponent = component.components_id
                        if (!dtComponent) return null
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed

                        return (
                            <React.Fragment key={dtComponent.id}>
                                <Component {...dtComponent} />
                            </React.Fragment>
                        )
                    })}
                </div>
            )}
            {section.actions.length > 0 ? (
                <div className="mt-4 flex space-x-4">
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                    {section.actions.map((actionId) => {
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                        const action = actionId.actions_id

Julien MARGAIL's avatar
Julien MARGAIL committed
                        return <Button key={action.id} {...action} />
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                    })}
                </div>
        </Content>
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
    )
}

export default Section