diff --git a/components/konstitisyon/comments/handle-comments.js b/components/konstitisyon/comments/handle-comments.js
index 949e3e9..106cb8e 100644
--- a/components/konstitisyon/comments/handle-comments.js
+++ b/components/konstitisyon/comments/handle-comments.js
@@ -26,6 +26,8 @@ export default function HandleComments({
setSuccess={setSuccess}
setIsErrorAlertOpen={setIsErrorAlertOpen}
setIsSuccessAlertOpen={setIsSuccessAlertOpen}
+ title={selectedTitre.titre}
+ label='Écrivez votre commentaire'
/>
)
}
diff --git a/components/konstitisyon/comments/write-comment.js b/components/konstitisyon/comments/write-comment.js
index 641cc9f..c124e67 100644
--- a/components/konstitisyon/comments/write-comment.js
+++ b/components/konstitisyon/comments/write-comment.js
@@ -1,117 +1,14 @@
'use client'
-import {useRef} from 'react'
-import PropTypes from 'prop-types'
-import Button from '@mui/material/Button'
-import TextField from '@mui/material/TextField'
-import Dialog from '@mui/material/Dialog'
-import DialogActions from '@mui/material/DialogActions'
-import DialogContent from '@mui/material/DialogContent'
-import DialogContentText from '@mui/material/DialogContentText'
-import DialogTitle from '@mui/material/DialogTitle'
-import {createItem, withToken} from '@directus/sdk'
-import LogoutCountdown from '../../session/logout-countdown.js'
-import {directusClient} from '@/lib/directus.js'
-
-function hasRestrictedChar(text) {
- const regex = /[<>&"]/g
-
- return Boolean(regex.test(text))
-}
-
-export default function WriteComment({session, selectedTitre, isOpen, setIsOpen, setError, setSuccess, setIsErrorAlertOpen, setIsSuccessAlertOpen}) {
- const countdownRef = useRef()
-
- const handleClose = () => {
- setIsOpen(false)
- }
-
- const handleFormSubmit = async e => {
- e.preventDefault()
-
- const formData = new FormData(e.currentTarget)
- const formJson = Object.fromEntries(formData.entries())
- const {comment} = formJson
- const formattedComment = comment.replaceAll('\'', '’')
-
- try {
- if (hasRestrictedChar(formattedComment)) {
- setError('Le texte ne doit pas contenir certains caractères spéciaux : <, >, ", .')
- setIsErrorAlertOpen(true)
-
- return
- }
-
- await directusClient.request(withToken(
- session.user.accessToken,
- createItem('commentaires', {
- text: formattedComment,
- titre: selectedTitre,
- status: 'draft'
- })
- ))
-
- setSuccess('Envoyé avec succès. Commentaire en attente de validation.')
- 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)
- }
- }
-
- handleClose()
- }
+import CreateForm from '../forms/create-form.js'
+export default function WriteComment(props) {
return (
- <>
-
-
- >
+
)
}
-
-WriteComment.propTypes = {
- session: PropTypes.object,
- selectedTitre: PropTypes.object.isRequired,
- isOpen: PropTypes.bool.isRequired,
- setIsOpen: PropTypes.func.isRequired,
- setError: PropTypes.func.isRequired,
- setSuccess: PropTypes.func.isRequired,
- setIsErrorAlertOpen: PropTypes.func.isRequired,
- setIsSuccessAlertOpen: PropTypes.func.isRequired
-}
diff --git a/components/konstitisyon/forms/create-form.js b/components/konstitisyon/forms/create-form.js
new file mode 100644
index 0000000..6e98453
--- /dev/null
+++ b/components/konstitisyon/forms/create-form.js
@@ -0,0 +1,115 @@
+'use client'
+
+import {useRef} from 'react'
+import PropTypes from 'prop-types'
+import Button from '@mui/material/Button'
+import TextField from '@mui/material/TextField'
+import Dialog from '@mui/material/Dialog'
+import DialogActions from '@mui/material/DialogActions'
+import DialogContent from '@mui/material/DialogContent'
+import DialogContentText from '@mui/material/DialogContentText'
+import DialogTitle from '@mui/material/DialogTitle'
+import LogoutCountdown from '../../session/logout-countdown.js'
+import {handleSubmit} from '@/lib/directus.js'
+import {formatFormContent} from '@/lib/format.js'
+
+export default function CreateForm({
+ session,
+ selectedTitre,
+ isOpen,
+ setIsOpen,
+ setError,
+ setSuccess,
+ setIsErrorAlertOpen,
+ setIsSuccessAlertOpen,
+ dialogText,
+ collection,
+ title,
+ label
+}) {
+ const countdownRef = useRef()
+
+ const handleClose = () => {
+ setIsOpen(false)
+ }
+
+ const handleFormSubmit = async e => {
+ e.preventDefault()
+ let requestObject
+
+ const formattedContent = formatFormContent(e.currentTarget)
+
+ if (collection === 'commentaires') {
+ requestObject = {
+ text: formattedContent,
+ titre: selectedTitre,
+ status: 'draft',
+ }
+ }
+
+ await handleSubmit({
+ accessToken: session.user.accessToken,
+ content: formattedContent,
+ collection,
+ requestObject,
+ setError,
+ setSuccess,
+ setIsErrorAlertOpen,
+ setIsSuccessAlertOpen,
+ countdownRef,
+ })
+
+ handleClose()
+ }
+
+ return (
+ <>
+
+
+ >
+ )
+}
+
+CreateForm.propTypes = {
+ session: PropTypes.object,
+ selectedTitre: PropTypes.object.isRequired,
+ isOpen: PropTypes.bool.isRequired,
+ setIsOpen: PropTypes.func.isRequired,
+ setError: PropTypes.func.isRequired,
+ setSuccess: PropTypes.func,
+ setIsErrorAlertOpen: PropTypes.func.isRequired,
+ setIsSuccessAlertOpen: PropTypes.func,
+ dialogText: PropTypes.string.isRequired,
+ collection: PropTypes.string.isRequired,
+ title: PropTypes.string.isRequired,
+ label: PropTypes.string.isRequired
+}
diff --git a/lib/directus.js b/lib/directus.js
index 2e2cb98..2dd0b33 100644
--- a/lib/directus.js
+++ b/lib/directus.js
@@ -1,4 +1,7 @@
-import {createDirectus, rest, authentication} from '@directus/sdk'
+import {
+ createDirectus, rest, authentication, withToken, createItem
+} from '@directus/sdk'
+import {hasRestrictedChar} from './format.js'
const apiUrl = process.env.DIRECTUS_API_URL || process.env.NEXT_PUBLIC_DIRECTUS_API_URL
@@ -6,3 +9,40 @@ export const directusClient = createDirectus(apiUrl)
.with(authentication('cookie', {credentials: 'include', autoRefresh: true}))
.with(rest())
+export async function handleSubmit({
+ accessToken,
+ content,
+ collection,
+ requestObject,
+ setError,
+ setSuccess,
+ setIsErrorAlertOpen,
+ setIsSuccessAlertOpen,
+ countdownRef,
+}) {
+ try {
+ if (hasRestrictedChar(content)) {
+ setError('Le texte ne doit pas contenir certains caractères spéciaux : <, >, ", .')
+ setIsErrorAlertOpen(true)
+ return
+ }
+
+ await directusClient.request(
+ withToken(
+ accessToken,
+ createItem(collection, requestObject)
+ )
+ )
+
+ setSuccess('Envoyé avec succès. En attente de validation.')
+ 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)
+ }
+ }
+}
diff --git a/lib/format.js b/lib/format.js
index cdd4873..885e3ab 100644
--- a/lib/format.js
+++ b/lib/format.js
@@ -24,3 +24,17 @@ export function formatDate(date, formatStr = 'PP') {
locale: fr
})
}
+
+export function hasRestrictedChar(text) {
+ const regex = /[<>&"]/g
+
+ return Boolean(regex.test(text))
+}
+
+export function formatFormContent(currentTarget) {
+ const formData = new FormData(currentTarget)
+ const formJson = Object.fromEntries(formData.entries())
+ const {content} = formJson
+
+ return content.replaceAll('\'', '’')
+}