import { Component } from 'preact'; import '../styles/Form.css'; import { marked } from "marked"; import DOMPurify from 'dompurify'; class BlogCommentsForm extends Component { state = { author: '', comment: '', isMessageSent: false, commentId: '' }; componentDidMount() { // Ensure the Turnstile script is loaded with explicit rendering const script = document.createElement('script'); script.src = 'https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit&onload=onloadTurnstileCallback'; script.defer = true; document.body.appendChild(script); // Callback function to handle Turnstile token window.onloadTurnstileCallback = () => { window.turnstile.render('#turnstile-container', { sitekey: '0x4AAAAAAAdb4uvxFFzNEDxB', callback: (token) => { // Here you can handle the token, e.g., by storing it in a hidden form field this.setState({turnstileToken: token}); }, }); }; // Cleanup function to remove the script when the component unmounts return () => { document.body.removeChild(script); }; } handleChange = (e) => { this.setState({ [e.target.name]: e.target.value }); } handleSubmit = async (e) => { e.preventDefault(); if (this.state.isMessageSent) { this.setState({ errorMessage: 'You have already sent a comment.', }); return; } try { const messageHtml = marked(DOMPurify.sanitize(this.state.comment)); const { isMessageSent, errorMessage, ...messageData } = this.state; // Exclude isMessageSent from the data const response = await fetch(`${import.meta.env.PUBLIC_API_URL}/comments/${this.props.slug}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ ...messageData, comment: messageHtml }), }); if (!response.ok) { const errorBody = await response.json(); const errorMessage = `HTTP Error ${response.status}: ${response.statusText}
${errorBody.message}`; this.setState({ errorMessage: `There was an error submitting your comment.
Details:
${errorMessage}`, isMessageSent: false, }); return; } const responseBody = await response.json(); this.setState({ author: '', comment: '', isMessageSent: true, errorMessage: '', commentId: responseBody.id, }); if (this.props.onMessageSent) { this.props.onMessageSent(); } } catch (error) { this.setState({ errorMessage: `There was an error submitting your message.
Details:
${error.message}
Check the console for more details.`, isMessageSent: false, }); } } render() { return (

Submit Comment

{this.state.errorMessage &&

} {this.state.isMessageSent && !this.state.errorMessage &&

Sent successfully!

(Optional)

Save this message ID: {this.state.commentId}

Then send it to me, to verify that you sent this comment.

Email me or tag/message me on these platforms.

}
); } } export default BlogCommentsForm;