import axios, { AxiosResponse } from 'axios'; import { useRouter } from 'next/router'; import nProgress from 'nprogress'; import { useMemo, useState } from 'react'; import Checkbox from '../../components/Checkbox'; import FormLayout from '../../components/FormLayout'; import Selector from '../../components/Selector'; import TextBox from '../../components/TextBox'; import { Category, Link } from '../../types'; import { BuildCategory, HandleAxiosError, IsValidURL } from '../../utils/front'; import { prisma } from '../../utils/back'; import styles from '../../styles/create.module.scss'; function CreateLink({ categories }: { categories: Category[]; }) { const { query } = useRouter(); const categoryIdQuery = Number(query.categoryId?.[0]); const [name, setName] = useState(''); const [url, setUrl] = useState(''); const [favorite, setFavorite] = useState(false); const [categoryId, setCategoryId] = useState(categoryIdQuery || categories?.[0].id || null); const [error, setError] = useState(null); const [success, setSuccess] = useState(null); const [submitted, setSubmitted] = useState(false); const canSubmit = useMemo( () => name !== '' && IsValidURL(url) && favorite !== null && categoryId !== null && !submitted, [name, url, favorite, categoryId, submitted] ); const handleSubmit = async (event) => { event.preventDefault(); setSuccess(null); setError(null); setSubmitted(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 { setSubmitted(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)) } } }