Skip to content
Snippets Groups Projects
Fetcher.js 1.66 KiB
Newer Older
  • Learn to ignore specific revisions
  • meskio's avatar
    meskio committed
    import React from "react";
    import { Spinner, Alert, Row } from "react-bootstrap";
    import AuthContext from "./AuthContext";
    
    meskio's avatar
    meskio committed
    import { url } from "./util";
    
    meskio's avatar
    meskio committed
    
    class Fetcher extends React.Component {
    
    meskio's avatar
    meskio committed
      static contextType = AuthContext;
    
    meskio's avatar
    meskio committed
    
    
    meskio's avatar
    meskio committed
      constructor(props) {
        super(props);
        this.state = {
    
          isLoading: true,
    
    meskio's avatar
    meskio committed
          error: null,
        };
      }
    
    meskio's avatar
    meskio committed
    
    
    meskio's avatar
    meskio committed
      componentDidMount() {
        this.fetch();
    
        if (!this.props.oneShot) {
          this.timerID = setInterval(
            () => this.fetch(),
            10000 // every 10 seconds
          );
        }
    
    meskio's avatar
    meskio committed
      }
    
    meskio's avatar
    meskio committed
    
    
    meskio's avatar
    meskio committed
      compomentWillUnmount() {
        clearInterval(this.timerID);
      }
    
    meskio's avatar
    meskio committed
    
    
    meskio's avatar
    meskio committed
      fetch() {
        if (this.state.error) {
          this.setState({ error: null });
    
    meskio's avatar
    meskio committed
        }
    
    meskio's avatar
    meskio committed
        fetch(url(this.props.url), {
    
    meskio's avatar
    meskio committed
          headers: { "x-authentication": this.context.token },
        })
          .then((response) => {
            if (!response.ok) {
              throw new Error(
                response.status.toString() + " " + response.statusText
              );
            }
            return response.json();
          })
          .then((data) => {
    
    meskio's avatar
    meskio committed
            if (this.state.isLoading) {
    
    meskio's avatar
    meskio committed
              this.setState({ isLoading: false });
    
    meskio's avatar
    meskio committed
            }
    
    meskio's avatar
    meskio committed
            this.props.onFetch(data);
          })
          .catch((e) => this.setState({ error: e.message, isLoading: false }));
      }
    
    meskio's avatar
    meskio committed
    
    
    meskio's avatar
    meskio committed
      render() {
        if (this.state.isLoading) {
          return (
            <Row className="justify-content-md-center">
              <Spinner animation="border" />
            </Row>
          );
        }
    
    meskio's avatar
    meskio committed
    
    
    meskio's avatar
    meskio committed
        if (this.state.error != null) {
          console.log(this.state.error);
          return (
            <Alert variant="danger">
              Ha ocurrido un error cargando datos: {this.state.error}
            </Alert>
          );
    
    meskio's avatar
    meskio committed
        }
    
    meskio's avatar
    meskio committed
    
        return this.props.children;
      }
    
    meskio's avatar
    meskio committed
    }
    
    export default Fetcher;