From 64cd7fc83d43a0ad7db1b51214291736bd245b44 Mon Sep 17 00:00:00 2001 From: Andrew Lee Date: Fri, 28 Jun 2024 20:31:02 -0400 Subject: Guestbook overhaul; Comments; New post; Updated packages --- src/components/BlogComments.jsx | 89 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 src/components/BlogComments.jsx (limited to 'src/components/BlogComments.jsx') diff --git a/src/components/BlogComments.jsx b/src/components/BlogComments.jsx new file mode 100644 index 0000000..183fb94 --- /dev/null +++ b/src/components/BlogComments.jsx @@ -0,0 +1,89 @@ +import { Component } from 'preact'; +import { formatDate } from "../util"; +import sanitizeHtml from 'sanitize-html'; +import BlogCommentsForm from "./BlogCommentsForm.jsx"; + +class BlogComments extends Component { + state = { + message: null, + error: null, + page: 1, + }; + + fetchMessages = async (page) => { + try { + const response = await fetch(`${import.meta.env.PUBLIC_API_URL}/comments/${this.props.slug}?page=${page}`); + + if (!response.ok) { + const errorData = await response.json(); + this.setState({ error: errorData.message }); + console.error('Failed to fetch data:', errorData.message); + return; + } + + const { messages, totalPages } = await response.json(); + + this.setState({ + message: messages, + totalPages: totalPages, + error: null // clear any previous error + }); + + } catch (error) { + this.setState({ error: `${error.message}` }); + console.error('Failed to fetch data:', error); + } + } + + refresh = async () => { + await this.fetchMessages(this.state.page); + } + + async componentDidMount() { + await this.fetchMessages(this.state.page); + } + + handleNext = async () => { + const nextPage = this.state.page + 1; + if (nextPage > this.state.totalPages) { + return; + } + this.setState({ page: nextPage }); + await this.fetchMessages(nextPage); + } + + handlePrevious = async () => { + const previousPage = this.state.page - 1; + this.setState({ page: previousPage }); + await this.fetchMessages(previousPage); + } + + render() { + const { message, error, page, totalPages } = this.state; + + return ( +
+ + {error ? ( +

{error}

+ ) : message ? ( +
+ {message.map((g) => ( +
+

{g.author}

+
+ {formatDate(g.created_at)} +
+ ))} + {page > 1 && } + {page < totalPages && } +
+ ) : ( +

Loading comments...

+ )} +
+ ); + } +} + +export default BlogComments; -- cgit v1.2.3