Skip to content
Snippets Groups Projects
Section.tsx 4.13 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 Component from "./section/component"
import Button from "./core/Button"

interface ISection {
    id: string
}

Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
const GRAPHQL_QUERY = graphql`
    query {
        directus {
            sections {
                id
                title
                subtitle
                content
                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
                        actions {
                            actions_id {
                                name
                                url
                                style
                                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

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

    return (
        <div>
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="text-2xl font-bold mt-2">{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="text-lg leading-8 py-4 text-justify"
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
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                    className={`grid grid-cols-1 lg:grid-cols-${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 && (
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                <div className="flex space-x-4 mt-4">
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                    {section.actions.map((actionId) => {
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                        const action = actionId.actions_id

                        return (
                            <Button
                                key={action.id}
                                {...action}
                                className={action.style}
                            />
                        )
                    })}
                </div>
            )}
        </div>
    )
}

export default Section