189 lines
5.4 KiB
TypeScript

"use client"
import { icons } from "#/assets/icons"
import Statistics from "#/components/stats"
import Table from "#/components/table/table"
import { Company } from "#/types"
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"
import { ColumnDef } from "@tanstack/react-table"
import axios from "axios"
import { useSession } from "next-auth/react"
import Image from "next/image"
import { Modal } from "#/components/modal"
import { useState } from "react"
export default function HomePage () {
const {data: session, status} = useSession()
const queryClient = useQueryClient()
const [open, setOpen] = useState(false);
console.log("Session = ", session)
const { data: companies, refetch, isLoading} = useQuery({
enabled: status === 'authenticated',
queryKey: ["companies"],
queryFn: async () => {
try {
const response = await axios.get(
'https://private-docs-api.intside.co/companies', {
headers: {
'Authorization': `Bearer ${session?.user.access_token}`
}
}
)
if(response.data) {
return response.data.data as Company[]
}
} catch (error) {
console.error(error)
}
}
})
const { mutate, isPending } = useMutation({
mutationFn: async (id: string) => {
try {
const response = await axios.delete(
`https://private-docs-api.intside.co/companies/${id}/`, {
headers: {
'Authorization': `Bearer ${session?.user.access_token}`
}
}
)
if(response.status === 200 || response.status === 201) {
console.log('Suppresion réussie !')
}
} catch (error) {
console.error(error)
}
},
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ["companies"] })
refetch()
}
})
const columns: ColumnDef<Company>[] = [
{
accessorKey: "name",
header: "Organisations",
},
{
accessorKey: "total_users",
header: "Utilisateurs",
},
{
header: "Administrateurs",
cell: ({ row }) => {
const value = String(row.original.owner.first_name) + " " + String(row.original.owner.last_name)
const initials = String(row.original.owner.first_name[0]) + String(row.original.owner.last_name[0])
return(
<div className="flex space-x-2 items-center">
<div className="flex items-center justify-center bg-[#DCDCFE] text-[#246BFD] w-10 h-10 rounded-full">
{initials}
</div>
<p>{value}</p>
</div>
)
}
},
{
accessorKey: "owner.email",
header: "Adresse e-mail"
},
{
accessorKey: "status",
header: "Statut",
cell: ({ cell }) => {
const status = String(cell.getValue())
return (
<p
className={`rounded-full px-2 py-1 font-medium text-sm w-20 h-6 text-center
${
status === "active" ? "bg-[#ECF9E8] text-[#49C91E]" :
status === "inactive" ? "bg-[#E7EBF3] text-[#9FA8BC]" :
status === "pending" ? "bg-[#EAF7FC] text-[#30B2EA]" :
status === "blocked" ? "bg-[#FDEBE8] text-[#F33F19]" :
""
}
`}
>
{
status === "active" ? "Actif" :
status === "inactive" ? "Inactif" :
status === "pending" ? "En attente" :
status === "blocked" ? "Bloquée" :
""
}
</p>
)
}
},
{
id: "delete",
cell: ({ cell }) => {
const id = String(cell.row.original.id)
return (
<div className="relative p-2 cursor-pointer"
// onClick={() => { mutate(id) }}
>
<Modal
open={open}
trigger={
<div onClick={() => setOpen(true)}>
<Image alt="" src={icons.trash} className="absolute right-2 top-[-50%] transform translate-middle-y hover:text-blue-500" />
</div>
}
title={
<p className="font-bold text-3xl">Supprimer une organisation</p>
}
content={
<div>
<p>Voulez-vous vraiment supprimer cette organisation ?</p>
<div className="grid grid-cols-2 gap-3 mt-3">
<button
className="bg-blue-100 text-blue-600 py-2 px-4 text-lg rounded-full text-center hover:bg-blue-200"
onClick={() => { setOpen(false) }}
>
Annuler
</button>
<button
className="bg-red-500 text-white py-2 px-4 text-lg rounded-full text-center hover:bg-red-600"
onClick={() => {
mutate(id)
setOpen(false)
}}
>
Supprimer
</button>
</div>
</div>
}
/>
</div>
)
}
}
]
return(
<div className="space-y-10">
<Statistics />
<p className="font-bold text-xl">Dernières organisations actives</p>
<Table
columns={columns}
data={companies || []}
pageSize={5}
/>
</div>
)
}