From 6cd9fb7c8964f8f1b3cc8137bbda45a633e62587 Mon Sep 17 00:00:00 2001 From: Andrew Lee Date: Sun, 4 Feb 2024 16:48:49 -0500 Subject: Update AstroJS; sanitize HTML and markdown support in Guestbook form --- src/components/Guestbook.jsx | 25 +++++++++----- src/components/GuestbookForm.jsx | 75 +++++++++++++++++++++++----------------- 2 files changed, 60 insertions(+), 40 deletions(-) (limited to 'src/components') diff --git a/src/components/Guestbook.jsx b/src/components/Guestbook.jsx index 91e2a0f..498bbbe 100644 --- a/src/components/Guestbook.jsx +++ b/src/components/Guestbook.jsx @@ -1,6 +1,7 @@ import { h, Component } from 'preact'; import { pb } from '../services/pocketbase'; import { formatDate } from "../util"; +import sanitizeHtml from 'sanitize-html'; class Guestbook extends Component { state = { @@ -8,7 +9,7 @@ class Guestbook extends Component { error: null }; - async componentDidMount() { + fetchMessages = async () => { try { const message = await pb.collection('guestbook').getFullList({ sort: '-created', @@ -20,6 +21,10 @@ class Guestbook extends Component { } } + async componentDidMount() { + await this.fetchMessages(); + } + render() { const { message, error } = this.state; @@ -33,14 +38,16 @@ class Guestbook extends Component { return (
- {message.map((g) => ( -
-

Message from: {g.name}

- {formatDate(g.created)} -

{g.message}

- {g.website && Website} -
- ))} +
+ {message.map((g) => ( +
+

Message from: {g.name}

+ {formatDate(g.created)} +
+ {g.website && Website} +
+ ))} +
); } diff --git a/src/components/GuestbookForm.jsx b/src/components/GuestbookForm.jsx index aae5e10..b8fc1c2 100644 --- a/src/components/GuestbookForm.jsx +++ b/src/components/GuestbookForm.jsx @@ -1,12 +1,16 @@ import { h, Component } from 'preact'; import { createMessage } from '../services/GuestbookService'; +import '../styles/GuestbookForm.css'; +import { marked } from "marked"; +import DOMPurify from 'dompurify'; class GuestbookForm extends Component { state = { name: '', email: '', website: '', - message: '' + message: '', + isMessageSent: false, }; handleChange = (e) => { @@ -15,40 +19,49 @@ class GuestbookForm extends Component { handleSubmit = async (e) => { e.preventDefault(); - await createMessage(this.state); - this.setState({ - name: '', - email: '', - website: '', - message: '' - }); + + if (this.state.isMessageSent) { + return; + } + + const messageHtml = marked(DOMPurify.sanitize(this.state.message)); + try { + await createMessage({ ...this.state, message: messageHtml }); + + this.setState({ + name: '', + email: '', + website: '', + message: '', + isMessageSent: true, + errorMessage: '' + }); + } catch (error) { + this.setState({ errorMessage: error.message }); + } } render() { return ( -
-

Submit Message

- -
- -
- -
- - -
+
+
+

Submit Message

+ + + + + + + + + +
+ {this.state.isMessageSent &&

Sent successfully!

} +
); } } -- cgit v1.2.3