diff --git a/frontend/components/App.js b/frontend/components/App.js index 815684369..6327737ed 100644 --- a/frontend/components/App.js +++ b/frontend/components/App.js @@ -1,9 +1,98 @@ -import React from 'react' +import React from 'react'; +import TodoList from './TodoList'; +import Form from './Form'; +import axios from 'axios'; -const URL = 'http://localhost:9000/api/todos' +const URL = 'http://localhost:9000/api/todos'; export default class App extends React.Component { + constructor(){ + super(); + this.state = { + todoList: [], + inputValue: '', + hideCompleted: false, + error:'' + } + } + axioserror = error => this.setState({...this.state, error: error.response.message}) + + componentDidMount(){ + console.log('App: Component Mounted'); + axios.get(URL) + .then(res => { + this.setState({ + ...this.state, + todoList: res.data.data + }) + console.log(res); + }) + .catch(err => console.log('App: The following error occured', err)); + } + + toggleHidden = ()=>{ + this.setState({ + ...this.state, + hideCompleted: !this.state.hideCompleted + }) + } + + toggleCompleted = (itemId)=>{ + this.setState({ + todoList: this.state.todoList.map(item => { + if(itemId === item.id) { + return { + ...item, + completed: !item.completed + }; + }; + return {...item}; + }) + }); + axios.patch(`${URL}/${itemId}`, { data: [...this.state.todoList] }) + .then(res =>{ + console.log('App: Successful patch made', res) + }) + .catch(err =>{ + console.log('App: Failed patch', err); + }) + }; + + inputChange = (e)=>{ + this.setState({ + ...this.state, + inputValue: e.target.value + }) + } + + handleSubmit = (e)=>{ + e.preventDefault(); + const newListItem = { + name: this.state.inputValue, + id: new Date().getTime(), + completed: false + } + axios.post(URL, newListItem) + .then(res => { + this.setState({ + ...this.state, + todoList: [...this.state.todoList, res.data.data], + inputValue: '' + }) + }) + .catch( + this.axioserror()); + } + render() { - return null + console.log('App: Rendered Component', this.state.todoList); + return ( +
+
Error:{this.state.error}
+ +
+ +
+ ) } -} +}; \ No newline at end of file diff --git a/frontend/components/Form.js b/frontend/components/Form.js index 3932207be..f3f0eaa38 100644 --- a/frontend/components/Form.js +++ b/frontend/components/Form.js @@ -2,6 +2,14 @@ import React from 'react' export default class Form extends React.Component { render() { - return null + return ( + + + + + ) } -} +} \ No newline at end of file diff --git a/frontend/components/Todo.js b/frontend/components/Todo.js index aac687f6d..37989e55f 100644 --- a/frontend/components/Todo.js +++ b/frontend/components/Todo.js @@ -1,7 +1,19 @@ -import React from 'react' +import React, {useEffect} from 'react' export default class Todo extends React.Component { + constructor(){ + super(); + } render() { - return null + return ( +
this.props.toggleCompleted(this.props.todoItem.id)} + > + {this.props.todoItem.name}{this.props.todoItem.completed ? ' ✔️' : ''} +
+
+
+ ) } -} +} \ No newline at end of file diff --git a/frontend/components/TodoList.js b/frontend/components/TodoList.js index ce08a27ba..814bfb254 100644 --- a/frontend/components/TodoList.js +++ b/frontend/components/TodoList.js @@ -1,7 +1,21 @@ -import React from 'react' +import React from 'react'; +import Todo from './Todo'; export default class TodoList extends React.Component { + constructor(){ + super(); + } + render() { - return null + return ( +
+ Todos: +
+
+ {this.props.todoItems.map(item => { + return + })} +
+ ) } -} +} \ No newline at end of file diff --git a/frontend/index.js b/frontend/index.js index 2c8561e84..98f251be1 100644 --- a/frontend/index.js +++ b/frontend/index.js @@ -6,7 +6,7 @@ import './styles/styles.css' render( -

Todo App AJAX

+

Todo App

, document.getElementById('root') diff --git a/frontend/styles/styles.css b/frontend/styles/styles.css index fda8a420d..81ad737f3 100644 --- a/frontend/styles/styles.css +++ b/frontend/styles/styles.css @@ -83,3 +83,10 @@ ul, form { .todo:hover { cursor: pointer; } +.list { + display: flex; + flex-direction: column; + border: solid black 2px; + max-width: 100%; + height: 100%; +} \ No newline at end of file