Migraine Tracker – Create Frontend

Firstly, I use create-react-app to create my project files.  But then I’ll delete everything in src folder and start from scratch to get the things I want to have in it.

In preparation for some packages I’ll need later on, I “yarn add” (same as “npm install”, using yarn the following packages: redux, redux-promise, react-redux, and react-router-dom.

I also want to use the Material UI framework, so I’ll yarn add “@material-ui/core”.

I also need to yarn add ‘redux-thunk’.

import React, { Component } from "react";
import { connect } from "react-redux";
import { Router, browserHistory } from "react-router";
import { withRouter } from "react-router-dom";
import {
  loadHeadaches,
  removeHeadaches,
  addHeadache,
  postNewHeadache
} from "../store/actions/headaches.js";
import { withStyles } from "@material-ui/core/styles";
import { DateFormatInput, TimeFormatInput } from "material-ui-next-pickers";
import TextField from "@material-ui/core/TextField";
import MenuItem from "@material-ui/core/MenuItem";
import InputAdornment from "@material-ui/core/InputAdornment";
import Input from "@material-ui/core/Input";
import InputLabel from "@material-ui/core/InputLabel";
import Button from "@material-ui/core/Button";
import "./MyHeadacheNewForm.css";
import { format, parse } from "date-fns";

// console.log("postNewHeadache", postNewHeadache);

const buttonStyle = {
  margin: "5px",
  color: "blue"
};

const styles = theme => ({
  container: {
    display: "flex",
    flexWrap: "wrap"
  },
  textField: {
    marginLeft: theme.spacing.unit,
    marginRight: theme.spacing.unit,
    width: 200
  }
});

const pain = [
  {
    value: 1,
    label: "1"
  },
  {
    value: 2,
    label: "2"
  },
  {
    value: 3,
    label: "3"
  },
  {
    value: 4,
    label: "4"
  },
  {
    value: 5,
    label: "5"
  },
  {
    value: 6,
    label: "6"
  },
  {
    value: 7,
    label: "7"
  },
  {
    value: 8,
    label: "8"
  },
  {
    value: 9,
    label: "9"
  },
  {
    value: 10,
    label: "10"
  }
];

pain.map(function(item) {
  console.log("pain item", item);
});

// let date = {};
class NewHeadacheForm extends Component<{}, NewHeadacheForm> {
  constructor(props) {
    super(props);
    const { authUser } = this.props;
    this.state = {
      date: "",
      painLevel: 0,
      comment: ""
    };
    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
    // this.handleNewHeadache = this.handleNewHeadache.bind(this);
    // this.onChangeDate = this.onChangeDate.bind(this);
    // this.postNewHeadache = this.postNewHeadache.bind(this);
  }

  handleChange = prop => event => {
    console.log("prop", prop, "event.target.value", event.target.value);
    this.setState({ [prop]: event.target.value });
    // console.log("this.state", this.state);
  };

  // onChangeDate = (event, date) => {
  //   console.log("Date:", date);
  //   this.setState({ selectedDate: date, dateText: format(date, "MM/DD/YYYY") });
  // };

  handleNewHeadache = event => {
    console.log("event", event);
    event.preventDefault();
    console.log("postNewHeadache", postNewHeadache);
    console.log("this.state", { ...this.state });
    // console.log("this.router.history", this.router.history);

    this.props.postNewHeadache({ ...this.state });
    console.log("hello");
    // this.setState({});
    this.props.history.push("/myHeadaches/list");
  };
  handleSubmit(e) {
    console.log("AuthForm.js this.props", this.props);

    e.preventDefault();
    const authType = this.props.signUp ? "signup" : "signin";
    console.log("MyHeadacheNewForm - authType", authType);
    console.log("MyHeadacheNewForm - this.props", this.props);
    this.props
      .onAuth(authType, this.state)
      .then(() => {
        this.props.history.push("/myHeadaches/list");
      })
      .catch(() => {
        return;
      });
  }

  render() {
    return (
      <form onSubmit={this.handleNewHeadache}>
        <div>
          <h1>New Headache Form</h1>
          <TextField
            className="headacheInput"
            id="date"
            name="date"
            label="Headache Date"
            type="date"
            defaultValue="2020-01-01"
            onChange={this.handleChange("date")}
            InputLabelProps={{ shrink: true }}
          />
          <p> </p>
          <TextField
            id="painLevel"
            className="headacheInput"
            select
            label="Pain Level"
            value={this.state.painLevel}
            onChange={this.handleChange("painLevel")}
          >
            {pain.map(option => (
              <MenuItem key={option.value} value={option.value}>
                {option.label}
              </MenuItem>
            ))}
          </TextField>
          <p> </p>
          <TextField
            id="name"
            className="headacheInput"
            label="Comment"
            value={this.state.comment}
            onChange={this.handleChange("comment")}
            type="text"
            name="comment"
          />
        </div>
        <div>
          <Button
            variant="outlined"
            label="Submit"
            style={buttonStyle}
            type="submit"
          >
            Submit
          </Button>
        </div>
      </form>
    );
  }
}

// interface NewHeadacheForm {
//   date: Date;
// }

function mapStateToProps(state) {
  return {
    errors: state.errors,
    newHeadache: state
  };
}

export default withRouter(
  connect(
    mapStateToProps,
    { postNewHeadache }
  )(NewHeadacheForm)
);

Continues….

I had to add a sort function to my map function in order to get the headache entries to display in descending order of date.

    <TableBody>
          {myHeadaches
            .sort((a, b) => (a.date < b.date ? 0 : -1))
            .map(n => {
              return (
                <TableRow key={n._id}>
                  <TableCell numeric>{n.date}</TableCell>
                  <TableCell numeric>{n.painLevel}</TableCell>
                  <TableCell numeric>{n.comment}</TableCell>
                  <TableCell numeric>
                    <span>
                      <button
                        onClick={removeHeadache.bind(this, n.user._id, n._id)}
                      >
                        X
                      </button>
                    </span>
                  </TableCell>
                </TableRow>
              );
            })}
        </TableBody>

 

Leave a Reply

Your email address will not be published. Required fields are marked *