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

import { useStaticQuery, graphql } from "gatsby"
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
                        }
                        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
}

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

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

Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
    return (
        <Content
            className={"mb-20 " + sectionSize[section.size]}
            style={ContentStyle}
        >
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
            {section.title && (
                <h1 className="text-3xl font-extrabold">{section.title}</h1>
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
            )}
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
            {section.subtitle && (
                <h4 className="mt-2 text-2xl font-bold">{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="py-4 text-justify text-lg leading-8"
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
Julien MARGAIL's avatar
Julien MARGAIL committed
                    className={`grid grid-cols-1 ${
                        sectionColumns[section.components.length]
                    } gap-4`}
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

                        return (
                            <React.Fragment key={dtComponent.id}>
                                <Component {...dtComponent} />
                            </React.Fragment>
                        )
                    })}
                </div>
            )}
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
            {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