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

Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
import { IGatsbyImageData } from "gatsby-plugin-image"
import CustomComponent from "./customComponent"
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed

Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
import Map from "../core/Map"
import News from "../News"
import Stats from "../Stats"
import Hero from "../Hero"
import Image from "../core/Image"
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
import Data from "../Data"
import Maps from "../Maps"
import Events from "../Events"
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
import Iframe from "../core/Iframe"
import Text from "../Text"
import Partners from "../Partners"
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed

export interface IAction {
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
    actions_id: {
        name: string
        url: string
        style: string
    }
}

export interface IService {
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
    services_id: {
        name: string
        url: string
        description: string
        image: {
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
            imageFile?: {
                publicURL?: string
            }
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
        }
export interface Iimage {
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
    directus_files_id: {
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
        imageFile: IGatsbyImageData
export interface IComponent {
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
    type: string
    actions: IAction[] | []
    mapdid: string
    title: string
    subtitle: string
    content: string
    url_dataviz: string
    url_map: string
    layout: string
    length: number
    size: string
    services: IService[] | []
    images: Iimage[] | []
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
}

const getActions = (actionsProps: IAction[] | []) => {
    if (!actionsProps.length) return undefined

    return actionsProps.map((action_id) => {
        let action = action_id.actions_id
        return {
            ...action,
metourneau's avatar
metourneau committed
            classname: action?.style,
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
        }
    })
}

const getServices = (servicesProps: IService[] | []) => {
    if (!servicesProps.length) return undefined

    return servicesProps.map((services_id) => {
        let service = services_id.services_id
        return {
            ...service,
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
            image: service.image?.imageFile?.publicURL ?? "",
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
        }
    })
}

const getImages = (imagesProps: Iimage[] | []) => {
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
    if (!imagesProps.length) return undefined

    return imagesProps.map((images) => {
        return { src: images.directus_files_id.imageFile }
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
    })
}

const Component = (props: IComponent) => {
    const {
        type,
        actions: actionsProps = [],
        services: servicesProps = [],
        images: imagesProps = [],
        mapdid,
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
        length,
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
        url_dataviz,
        url_map,
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
        ...restProps
    } = props

    const actions = getActions(actionsProps)
    const services = getServices(servicesProps)
    const images = getImages(imagesProps)

    switch (type) {
        case "news":
            let newsaction = actions?.length ? actions[0] : undefined
Julien MARGAIL's avatar
Julien MARGAIL committed
            return <News {...restProps} action={newsaction} />
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
        case "maps":
Julien MARGAIL's avatar
Julien MARGAIL committed
            return <Maps limit={length} {...restProps} />
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
        case "map":
            if (!mapdid) return <div>Map</div>
            return (
                <div className="h-full min-h-[500px] w-full">
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                    <Map {...restProps} mapid={parseInt(mapdid)} />
                </div>
            )
        case "data":
Julien MARGAIL's avatar
Julien MARGAIL committed
            return <Data {...restProps} />
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
        case "stats":
            return <Stats {...restProps} />
        case "hero":
            let heroaction = actions?.length
                ? actions[0]
                : { name: "", url: "" }
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed

            return (
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                    services={services!}
                    {...restProps}
                    action={heroaction!}
                    bgImage={images}
                    options={{
                        size: "base",
                        layout: "card",
                        ...restProps.options,
                    }}
                />
            )
        case "herotile":
            return (
                <Hero
                    services={services!}
                    {...restProps}
                    bgImage={images}
                    options={{
                        size: "base",
                        layout: "tile",
                        ...restProps.options,
                    }}
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                />
            )
        case "text":
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
            let textAction = actions?.length ? actions[0] : undefined
Julien MARGAIL's avatar
Julien MARGAIL committed
            return <Text {...restProps} action={textAction} />
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
        case "image":
metourneau's avatar
metourneau committed
            let img = images?.length ? images[0].src : undefined
Julien MARGAIL's avatar
Julien MARGAIL committed

metourneau's avatar
metourneau committed
            var oClass = restProps.options ? restProps.options.class : ""
Julien MARGAIL's avatar
Julien MARGAIL committed
            return <Image image={img} className={oClass} />
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
        case "mapgl":
            return <div>Carte Maplibre</div>
        case "geoportal":
Julien MARGAIL's avatar
Julien MARGAIL committed
            return <Iframe {...restProps} url={url_map} />
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
        case "dataviz":
Julien MARGAIL's avatar
Julien MARGAIL committed
            return <Iframe {...restProps} url={url_dataviz} />
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
        case "events":
Julien MARGAIL's avatar
Julien MARGAIL committed
            return <Events {...restProps} />
        case "partners":
    return <CustomComponent {...props} />
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
}

export default Component