Skip to content
Snippets Groups Projects
Maps.tsx 3.19 KiB
Newer Older
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
import React, { useEffect, useState } from "react"
import { twMerge } from "tailwind-merge"
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
import CardList from "./core/CardList"
import Button from "./core/Button"
import TitleComponent from "./core/TitleComponent"
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed

interface IMaps {
    anime?: boolean
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
    layout?: "row" | "col" | "grid"
    size?: "xs" | "base" | "xl"
    limit?: number
    title?: string
    action?: {
        name?: string
        url?: string
        classname?: string
    }
Julien MARGAIL's avatar
Julien MARGAIL committed
    options?: object
    format?: "mapstore" | "maps"
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
}

const Maps = (props: IMaps) => {
    const {
        title,
        action,
        anime,
        layout = "row",
        size = "xs",
        limit = 3,
        format = "maps",
Julien MARGAIL's avatar
Julien MARGAIL committed
    const options = props.options ?? {}
    const oClass = options.class || {}

Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
    const [data, setData] = useState([])

    const mapsUrl = getMapsUrl(format, limit)
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
    useEffect(() => {
        fetch(mapsUrl)
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
            .then((res) => {
                if (!res.ok) {
                    throw new Error(res.statusText)
                }

                return res.json()
            })
            .then((response) => {
                const results = response.results
                if (results.length) {
                    setData(results)
                }
            })
            .catch((e) => {
                console.log(e)
            })
    }, [])

    if (!data.length) return null

    const dataCards = data.map((data: any) => {
        let oData = getDataCardsByFormat(data, format)

Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
        return {
            size: size,
            anime: anime || options.anime,
            options: options.card,
            ...oData,
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
        }
    })

    return (
        <div data-theme={options.theme} className={twMerge(oClass.main)}>
            <TitleComponent
                title={title}
                className="mb-6 p-2 text-2xl font-extrabold tracking-tight sm:text-3xl"
                options={options}
            />
            <CardList cards={dataCards} layout={layout} {...options.cards} />
            <div
                className={twMerge("my-8 flex justify-center", oClass.actions)}
            >
                {action && <Button {...action} {...options.action} />}
            </div>
const isFormatMaps = (format: string) => {
    return format == "maps"
}

const getMapsUrl = (format: string, limit: number) => {
    let url

    if (isFormatMaps(format)) {
        url = `/fr/maps/maps/?format=json&q=&highlight=true&page=1&page_size=${limit}`
    } else {
        url = `/geoportal/rest/geostore/extjs/search/category/MAP/***/thumbnail,details,featured?includeAttributes=true&start=0&limit=${limit}`
    }

    return url
}

const getDataCardsByFormat = (data: any, format: string) => {
    let oData

    if (isFormatMaps(format)) {
        oData = {
            name: data.display_name,
            description: data.description,
            image: data.thumbnail.url,
            url: `/maps/#/map/${data.id}`,
        }
    } else {
        oData = {
            name: data.name,
            description: data.description,
            image: `/geoportal/${data.thumbnail}`,
            url: `/geoportal/#/context/Admin/${data.id}`,
        }
    }

    return oData
}

Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
export default Maps