From beb54b0acb7721068bc36da6906bd615eb01fb8c Mon Sep 17 00:00:00 2001 From: Andrew Lee Date: Sat, 29 Jun 2024 08:38:44 -0400 Subject: Merged Guestbook and Blog Comments into HOC --- src/components/FetchMessages.jsx | 86 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 src/components/FetchMessages.jsx (limited to 'src/components/FetchMessages.jsx') diff --git a/src/components/FetchMessages.jsx b/src/components/FetchMessages.jsx new file mode 100644 index 0000000..aa6f261 --- /dev/null +++ b/src/components/FetchMessages.jsx @@ -0,0 +1,86 @@ +import { Component } from 'preact'; + +const withMessages = (WrappedComponent, apiEndpoint, FormComponent) => { + return class extends Component { + state = { + message: null, + error: null, + page: 1, + }; + + fetchMessages = async (page) => { + try { + const { slug } = this.props; + const response = await fetch(`${import.meta.env.PUBLIC_API_URL}${apiEndpoint.replace(':slug', slug)}?page=${page}`); + + if (!response.ok) { + const errorData = await response.json(); + this.setState({ error: errorData.message }); + console.error(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: `Failed to fetch data: ${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 ? ( + + ) : ( +

Loading messages...

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