import { useEffect, useState } from 'react'; import nProgress from 'nprogress'; import axios, { AxiosResponse } from 'axios'; import FormLayout from '../../components/FormLayout'; import TextBox from '../../components/TextBox'; import Selector from '../../components/Selector'; import Checkbox from '../../components/Checkbox'; import styles from '../../styles/create.module.scss'; import { Category } from '../../types'; import { BuildCategory, HandleAxiosError, IsValidURL } from '../../utils/front'; import { prisma } from '../../utils/back'; function CreateLink({ categories }: { categories: Category[]; }) { const [name, setName] = useState(''); const [url, setUrl] = useState(''); const [favorite, setFavorite] = useState(false); const [categoryId, setCategoryId] = useState(categories?.[0].id || null); const [error, setError] = useState(null); const [success, setSuccess] = useState(null); const [canSubmit, setCanSubmit] = useState(false); useEffect(() => { if (name !== '' && IsValidURL(url) && favorite !== null && categoryId !== null) { setCanSubmit(true); } else { setCanSubmit(false); } }, [name, url, favorite, categoryId]); const handleSubmit = async (event) => { event.preventDefault(); setSuccess(null); setError(null); setCanSubmit(false); nProgress.start(); try { const payload = { name, url, favorite, categoryId }; const { data }: AxiosResponse = await axios.post('/api/link/create', payload); setSuccess(data?.success || 'Lien modifié avec succès'); } catch (error) { setError(HandleAxiosError(error)); } finally { setCanSubmit(true); nProgress.done(); } } return (<> setName(value)} value={name} fieldClass={styles['input-field']} placeholder='Nom du lien' /> setUrl(value)} value={url} fieldClass={styles['input-field']} placeholder='https://www.example.org/' /> setCategoryId(value)} options={categories.map(({ id, name }) => ({ label: name, value: id }))} /> setFavorite(value)} label='Favoris' /> ); } CreateLink.authRequired = true; export default CreateLink; export async function getServerSideProps() { const categoriesDB = await prisma.category.findMany(); const categories = categoriesDB.map((categoryDB) => BuildCategory(categoryDB)); return { props: { categories: JSON.parse(JSON.stringify(categories)) } } }