aboutsummaryrefslogtreecommitdiff
path: root/src/components/FetchMessages.jsx
blob: 0a7eea34ee0cbd6aa2576f356d8f0519ea316267 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import { Component } from 'react';

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 (
                <div>
                    <FormComponent onMessageSent={this.refresh} {...this.props} />
                    {error ? (
                        <p>{error}</p>
                    ) : message ? (
                        <WrappedComponent
                            message={message}
                            page={page}
                            totalPages={totalPages}
                            handleNext={this.handleNext}
                            handlePrevious={this.handlePrevious}
                            {...this.props}
                        />
                    ) : (
                        <p>Loading messages...</p>
                    )}
                </div>
            );
        }
    };
}

export default withMessages;