Skip to content
Snippets Groups Projects
Data.tsx 3.35 KiB
Newer Older
Tojo Andrianomentsoaniaina's avatar
Tojo Andrianomentsoaniaina committed
import React, { useState, useEffect } from "react"
import CardList from "./core/CardList"
import TitleComponent from "./core/TitleComponent"
import { twMerge } from "tailwind-merge"
import { Button } from "@onegeo-suite/gatsby-theme-onegeo"
Tojo Andrianomentsoaniaina's avatar
Tojo Andrianomentsoaniaina committed

interface Idata {
    anime?: boolean
Tojo Andrianomentsoaniaina's avatar
Tojo Andrianomentsoaniaina committed
    layout?: "row" | "col" | "grid"
    size?: "xs" | "base" | "xl"
    title?: string
    action?: {
        name?: string
        url?: string
        classname?: string
    }
const EXPLORER_PATH = process.env.OGS_EXPLORER_PATH || "/explorer"

Tojo Andrianomentsoaniaina's avatar
Tojo Andrianomentsoaniaina committed
const Data = (props: Idata) => {
    const { title, action, anime, layout = "row", size = "xs" } = props
    const options = props.options ?? {}
    const oClass = options.class || {}

Tojo Andrianomentsoaniaina's avatar
Tojo Andrianomentsoaniaina committed
    const [data, setData] = useState<any[]>([])

    useEffect(() => {
        fetch("/fr/indexer/elastic/_search/?request_cache=true", {
            method: "POST",
            headers: new Headers({
                "Content-Type": "application/json; charset=UTF-8",
            }),
            body: JSON.stringify({
                from: 0,
                size: 3,
                collapse: {
                    field: "uuid.keyword",
                },
                sort: [
                    {
                        "metadata-fr.publicationDate": {
                            order: "asc",
                            unmapped_type: "date",
                        },
                    },
                ],
                _source: {
                    include: [
                        "slug",
                        "_dataset.display_name",
                        "_dataset.description",
                        "_dataset.thumbnail",
                        "_dataset.publication_date",
                    ],
                },
            }),
        })
            .then((res) => {
                if (!res.ok) {
                    throw new Error(res.statusText)
                }
                return res.json()
            })
            .then((response) => {
                const hits = response?.hits?.hits
                if (hits.length) {
                    setData(hits)
                }
            })
            .catch((e) => {
                console.log(e)
            })
Tojo Andrianomentsoaniaina's avatar
Tojo Andrianomentsoaniaina committed
    }, [])

    if (!data.length) return null

    const dataCards = data.map((item: any) => {
        const md = item?._source?._dataset
        const url = item?._source?.slug
        if (!md) return null
Tojo Andrianomentsoaniaina's avatar
Tojo Andrianomentsoaniaina committed
        return {
            name: md.display_name,
            description: md.description,
            image: md.thumbnail,
            url: `${EXPLORER_PATH}/fr/jeux-de-donnees/${url}`,
Tojo Andrianomentsoaniaina's avatar
Tojo Andrianomentsoaniaina committed
            size: size,
            // url: `/geoportal/#/context/Admin/${item.id}`,
            anime: anime || options.anime,
            options: options.card,
Tojo Andrianomentsoaniaina's avatar
Tojo Andrianomentsoaniaina committed
        }
    })
    return (
        <div data-theme={options.theme} className={twMerge(oClass.main)}>
            <TitleComponent
                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>
Tojo Andrianomentsoaniaina's avatar
Tojo Andrianomentsoaniaina committed
        </div>
    )
}

export default Data