Skip to content
Snippets Groups Projects
news.tsx 2.91 KiB
Newer Older
import React, { ReactElement, useState } from "react"
import { graphql, PageProps } from "gatsby"
import { IGatsbyImageData } from "gatsby-plugin-image"
Manoa Harinjo's avatar
Manoa Harinjo committed
import dayjs from "dayjs"
tovo's avatar
tovo committed

Manoa Harinjo's avatar
Manoa Harinjo committed
import { Layout, Content, CardList } from "@onegeo-suite/gatsby-theme-onegeo"

import { ViewListIcon, ViewGridIcon } from "@heroicons/react/outline"
tovo's avatar
tovo committed

interface INew {
    id?: string
    title?: string
    content?: string
    image?: {
        id?: string
        imageFile?: IGatsbyImageData
    }
tovo's avatar
tovo committed
}

interface DataProps {
    directus: {
        news: INew[]
    }
tovo's avatar
tovo committed
}

function News({ data }: PageProps<DataProps>): ReactElement {
    const [bLayoutGrid, setLayoutGrid] = useState(false)
tovo's avatar
tovo committed

    const onSetLayout = () => {
        setLayoutGrid((prevState) => !prevState)
    }
tovo's avatar
tovo committed

    const layout = bLayoutGrid ? "grid" : "row"
tovo's avatar
tovo committed

    const listNews = data.directus.news.map((dt) => {
        return {
            name: dt.title,
            description: dt.abstract || dt.content,
            image: dt.image?.imageFile,
            url: "/news/" + dt.slug,
Manoa Harinjo's avatar
Manoa Harinjo committed
            category: dt.categories,
Manoa Harinjo's avatar
Manoa Harinjo committed
            date: dayjs(dt.date_published).format("DD/MM/YYYY"),
tovo's avatar
tovo committed

Manoa Harinjo's avatar
Manoa Harinjo committed
        <Layout>
Manoa Harinjo's avatar
Manoa Harinjo committed
            <Content>
                <div className="p-6 sm:flex">
                    <h2 className="w-full text-3xl font-extrabold tracking-tight sm:text-4xl">
                        Actualités
                    </h2>
                    <div className="flex w-full items-center gap-6">
                        <button className="h-8 w-8" onClick={onSetLayout}>
                            {bLayoutGrid ? <ViewGridIcon /> : <ViewListIcon />}
                        </button>
                        <input
                            type="text"
                            placeholder="Titre, description"
                            className="input input-bordered w-full"
                        />
                    </div>
                </div>

                <CardList
                    cards={listNews}
                    layout={layout}
                    anime={bLayoutGrid}
                />
            </Content>
tovo's avatar
tovo committed
}

export default News
tovo's avatar
tovo committed

export const query = graphql`
    query {
        directus {
            news(
                filter: { status: { _eq: "published" } }
                sort: "-date_published"
            ) {
                id
                slug
                content
                title
                date_published
                image {
                    id
                    imageFile {
                        childImageSharp {
                            gatsbyImageData
                        }
Manoa Harinjo's avatar
Manoa Harinjo committed
                categories {
                    id
                    name
                    label
                }
tovo's avatar
tovo committed
            }
        }
    }
Manoa Harinjo's avatar
Manoa Harinjo committed
`