diff --git a/components/konstitisyon/edit/handle-edit.js b/components/konstitisyon/edit/handle-edit.js new file mode 100644 index 0000000..175111e --- /dev/null +++ b/components/konstitisyon/edit/handle-edit.js @@ -0,0 +1,93 @@ +'use client' + +import PropTypes from 'prop-types' +import {useRef} from 'react' +import FormHandler from '../form-handler.js' +import {formatFormContent} from '@/lib/format.js' +import {createVersion} from '@/lib/directus.js' + +export default function HandleEdit({ + id, + session, + isOpen, + setIsOpen, + collection, + contenu, + setError, + setSuccess, + setIsSuccessAlertOpen, + setIsErrorAlertOpen +}) { + const countdownRef = useRef() + + const handleFormSubmit = async e => { + e.preventDefault() + console.log('e', e) + + const formattedContent = formatFormContent(e.currentTarget) + + const {accessToken, userId} = session.user + + await createVersion({ + accessToken, + userId, + collection, + id, + formattedContent, + setIsErrorAlertOpen, + setSuccess, + setIsSuccessAlertOpen, + setError, + countdownRef + }) + } + + if (collection === 'titres') { + return ( + + ) + } + + if (collection === 'articles') { + return ( + + ) + } +} + +HandleEdit.propTypes = { + id: PropTypes.string.isRequired, + session: PropTypes.object.isRequired, + isOpen: PropTypes.bool.isRequired, + setIsOpen: PropTypes.func.isRequired, + setSuccess: PropTypes.func.isRequired, + setIsErrorAlertOpen: PropTypes.func.isRequired, + setIsSuccessAlertOpen: PropTypes.func.isRequired, + setError: PropTypes.func.isRequired, + contenu: PropTypes.string, + collection: PropTypes.oneOf(['titres', 'articles']).isRequired +} diff --git a/components/konstitisyon/edit/index.js b/components/konstitisyon/edit/index.js index 2f7173d..9aecfdc 100644 --- a/components/konstitisyon/edit/index.js +++ b/components/konstitisyon/edit/index.js @@ -1,5 +1,6 @@ 'use client' +import {useState} from 'react' import PropTypes from 'prop-types' import {useRouter} from 'next/navigation' import IconButton from '@mui/material/IconButton' @@ -7,6 +8,8 @@ import {styled} from '@mui/material/styles' import Tooltip, {tooltipClasses} from '@mui/material/Tooltip' import ArticleIcon from '@mui/icons-material/Article' import TitleIcon from '@mui/icons-material/Title' +import HandleEdit from './handle-edit.js' +import AuthAlert from '@/components/auth-form/auth-alert.js' const LightTooltip = styled(({className, ...props}) => ( @@ -21,30 +24,64 @@ const LightTooltip = styled(({className, ...props}) => ( export default function Edit({id, session, contenu, collection}) { const router = useRouter() + const [isDialogOpen, setIsDialogOpen] = useState(false) + const [isErrorAlertOpen, setIsErrorAlertOpen] = useState(false) + const [isSuccessAlertOpen, setIsSuccessAlertOpen] = useState(false) + const [error, setError] = useState('') + const [success, setSuccess] = useState('') const handleClick = () => { console.log('🚀 ~ Edit ~ id:', id) console.log('🚀 ~ Edit ~ contenu:', contenu) console.log('🚀 ~ Edit ~ collection:', collection) + setIsDialogOpen(true) if (!session) { router.push('/login') } } return ( - - {collection === 'titres' && ( - - - - )} + <> + {error && } - {collection === 'articles' && ( - - - - )} - + {success && } + + + {collection === 'titres' && ( + + + + )} + + {collection === 'articles' && ( + + + + )} + + + ) } diff --git a/components/konstitisyon/form-handler.js b/components/konstitisyon/form-handler.js index c7c10a1..dad8ee6 100644 --- a/components/konstitisyon/form-handler.js +++ b/components/konstitisyon/form-handler.js @@ -23,7 +23,8 @@ export default function FormHandler({ listItems, handleFormSubmit, countdownRef, - setSelectValue + setSelectValue, + contenu }) { const handleClose = () => { setIsOpen(false) @@ -55,6 +56,7 @@ export default function FormHandler({ autoFocus required fullWidth + value={contenu} multiline={Boolean(hasMultiline)} mt={2} rows={4} @@ -85,5 +87,6 @@ FormHandler.propTypes = { title: PropTypes.string.isRequired, label: PropTypes.string.isRequired, hasMultiline: PropTypes.bool, - listItems: PropTypes.array.isRequired + listItems: PropTypes.array.isRequired, + contenu: PropTypes.string } diff --git a/lib/directus.js b/lib/directus.js index ad9dacf..c9370d5 100644 --- a/lib/directus.js +++ b/lib/directus.js @@ -1,6 +1,7 @@ +/* eslint-disable camelcase */ import { createDirectus, rest, authentication, withToken, createItem, - readUser + readUser, createContentVersion, readContentVersions } from '@directus/sdk' import {signOut} from 'next-auth/react' import {hasRestrictedChar} from './format.js' @@ -67,3 +68,61 @@ export async function handleSubmit({ } } } + +export async function createVersion({ + accessToken, + userId, + collection, + id, + content, + countdownRef, + setSuccess, + setError, + setIsErrorAlertOpen, + setIsSuccessAlertOpen +}) { + try { + if (hasRestrictedChar(content)) { + throw new Error('Le texte ne doit pas contenir certains caractères spéciaux : <, >, ", .') + } + + await handleUserStatus(accessToken, userId) + + const versions = await directusClient.request( + withToken( + accessToken, + readContentVersions() + ) + ) + + const versionsCount = versions.length + 1 + + const date = Date.now() + const name = `v${versionsCount}-${date}` + const key = `${id}-${date}` + + await directusClient.request( + withToken( + accessToken, + createContentVersion({ + key, + name, + item: id, + user_created: userId, + collection, + }) + ) + ) + + setSuccess(`Version créée avec succès : ${name}`) + setIsSuccessAlertOpen(true) + } catch (error) { + if (error?.errors[0]?.message === 'Token expired.') { + countdownRef.current.startCountdown() + } else { + console.log(error?.errors[0]?.message) + setError(error?.errors[0]?.message) + setIsErrorAlertOpen(true) + } + } +}