Skip to content

Instantly share code, notes, and snippets.

@webmasterdevlin
Last active March 14, 2019 02:06
Show Gist options
  • Save webmasterdevlin/9dc681267e6ceec6d92c7631951f29e6 to your computer and use it in GitHub Desktop.
Save webmasterdevlin/9dc681267e6ceec6d92c7631951f29e6 to your computer and use it in GitHub Desktop.
React Class Component : src/pages/heroes/Heroes.js
import React, { Component } from "react";
import NewItemForm from "../../common-components/NewItemForm";
import {
deleteHero,
loadHeroes,
postHero
} from "../../store/hero/hero-actions";
import { connect } from "react-redux";
import { Link } from "react-router-dom";
class Heroes extends Component {
state = {
hero: {
id: "",
firstName: "",
lastName: "",
house: "",
knownAs: ""
},
isShowNewItemForm: false
};
async componentDidMount() {
await this.props.onLoadData(); // Dispatches the loadHeroes action
}
removeItem = async (id, name) => {
const isConfirmed = window.confirm(`Delete ${name}?`);
if (!isConfirmed) return;
await this.props.onRemoveHero(id); // Takes an id to be dispatched. This will delete the hero
};
onChange = ({ currentTarget: input }) => {
const newHero = { ...this.state.hero };
const { name, value } = input;
newHero[name] = value;
this.setState({ hero: newHero });
};
onSubmit = event => {
event.preventDefault();
/*
onAddHero takes a hero object to be dispatched.
If successful, it sends a dispatch to load again the heroes array
*/
this.props.onAddHero(this.state.hero).then(() => this.props.onLoadData());
// .then(() => this.props.onLoadData());
// is not necessary if you don't care about the id of the new created item
// An id is required when deleting or getting an item
const { isShowNewItemForm } = this.state;
this.setState({ isShowNewItemForm: !isShowNewItemForm });
};
showNewItemForm = () => {
const { isShowNewItemForm } = this.state;
this.setState({ isShowNewItemForm: !isShowNewItemForm });
};
render() {
const { error } = this.props;
return (
<>
<NewItemForm
isShowNewItemForm={this.state.isShowNewItemForm}
handleOnChange={this.onChange}
handleOnSubmit={this.onSubmit}
handleShowNewItemForm={this.showNewItemForm}
/>
{error && (
<div
className="col-3 col-md-3 offset-9 alert alert-info"
role="alert"
>
Something wrong happened: {error}
</div>
)}
{this.props.heroes.map(item => ( // the array heroes here is the array heroes from your store
<div key={item.id} className="card mt-3" style={{ width: "auto" }}>
<div className="card-header">
<h3 className="card-title">
{item.firstName} {item.lastName}
</h3>
<h5 className="card-subtitle mb-2 text-muted">{item.house}</h5>
<p className="card-text">{item.knownAs}</p>
</div>
<section className="card-body">
<div className="row">
<button
onClick={() => this.removeItem(item.id, item.firstName)}
className="btn btn-outline-danger card-link col text-center"
>
<span className="fas fa-eraser mr-2" />
Delete
</button>
<Link
to={`/edit-hero/${item.id}`}
className="btn btn-outline-primary card-link col text-center"
>
<span className="fas fa-edit mr-2" />
Edit
</Link>
</div>
</section>
</div>
))}
</>
);
}
}
const mapStateToProps = state => {
return state.heroState;
};
const mapDispatchToProps = dispatch => {
return {
onLoadData: () => dispatch(loadHeroes()), // onLoadDate will dispatch loadHeroes when gets invoke
onRemoveHero: id => dispatch(deleteHero(id)), // onRemoveHero will dispatch deleteHero when gets invoke
onAddHero: hero => dispatch(postHero(hero)) // onAddHero will dispatch postHero when gets invoke
};
};
/*
connects the store's dispatches and states to the props of this class
*/
export default connect(
mapStateToProps,
mapDispatchToProps
)(Heroes);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment