diff --git a/frontend/components/App.js b/frontend/components/App.js
index 38b7a2f5..61bfbcac 100644
--- a/frontend/components/App.js
+++ b/frontend/components/App.js
@@ -1,10 +1,75 @@
import React from 'react'
+import TodoList from './TodoList';
+import TodoForm from "./Form";
export default class App extends React.Component {
+ constructor() {
+ super();
+ this.state = {
+ todos: [
+ {
+ name: 'Organize Garage',
+ id: 1528817077286, // could look different, you could use a timestamp to generate it
+ completed: false
+ },
+ {
+ name: 'Bake Cookies',
+ id: 1528817084358,
+ completed: false
+ },
+ {
+ name: 'Workout',
+ id: 1528817084351,
+ completed: true
+ },
+ ]
+ }
+ }
+
+ handleClear = () => {
+ this.setState({
+ ...this.state,
+ todos: this.state.todos.filter(element => {
+ return (element.completed === false);
+ })
+ });
+ }
+
+ handleAdd = (value) => {
+ this.setState({
+ ...this.state,
+ todos: [...this.state.todos, {
+ name: value,
+ id: (Math.random() * (1 - 1528817084351) + 1),
+ completed: false
+ }]
+ })
+ }
+
+ handleToggle = (clickedID) => {
+ this.setState({
+ ...this.state,
+ todos: this.state.todos.map(element => {
+ if (element.id === clickedID) {
+ return ({
+ ...element,
+ completed: !element.completed
+ })
+ }
+ return element;
+ })
+ })
+ }
+
+
render() {
+ const { todos } = this.state;
return (
- Todo App
+
Todos
+
+
+
)
}
diff --git a/frontend/components/Form.js b/frontend/components/Form.js
index 30fbc48d..65e02010 100644
--- a/frontend/components/Form.js
+++ b/frontend/components/Form.js
@@ -1,11 +1,27 @@
-import React from 'react'
+import React from "react";
+
+export default class TodoForm extends React.Component {
+
+ handleSubmit = (event) => {
+ event.preventDefault();
+ this.props.handleAdd(this.state.input);
+ }
+
+ handleChange = (event) => {
+ this.setState({
+ ...this.state,
+ input: event.target.value
+ })
+ }
-export default class Form extends React.Component {
render() {
- return (
-
- Form
-
- )
+ return(
+ );
}
}
diff --git a/frontend/components/Todo.js b/frontend/components/Todo.js
index ca86f981..dd684e39 100644
--- a/frontend/components/Todo.js
+++ b/frontend/components/Todo.js
@@ -1,11 +1,12 @@
import React from 'react'
export default class Todo extends React.Component {
+
+ handleClick = () => {
+ this.props.handleToggle(this.props.element.id);
+ }
+
render() {
- return (
-
- Todo
-
- )
+ return ({this.props.element.name} {this.props.element.completed?- completed : })
}
}
diff --git a/frontend/components/TodoList.js b/frontend/components/TodoList.js
index 95410373..d6c3c08c 100644
--- a/frontend/components/TodoList.js
+++ b/frontend/components/TodoList.js
@@ -1,11 +1,12 @@
import React from 'react'
+import Todo from './Todo'
export default class TodoList extends React.Component {
render() {
- return (
-
- TodoList
-
- )
+ return (
+ {this.props.todos.map(element => {
+ return ()
+ })}
+
)
}
}
diff --git a/package-lock.json b/package-lock.json
index 0f5d77b0..2921dac7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12473,7 +12473,8 @@
"node_modules/react-is": {
"version": "17.0.2",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
- "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+ "dev": true
},
"node_modules/react-router": {
"version": "6.2.2",
@@ -17928,8 +17929,7 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz",
"integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==",
- "dev": true,
- "requires": {}
+ "dev": true
},
"@webpack-cli/info": {
"version": "1.4.1",
@@ -17944,8 +17944,7 @@
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz",
"integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==",
- "dev": true,
- "requires": {}
+ "dev": true
},
"@xmldom/xmldom": {
"version": "0.7.5",
@@ -18014,15 +18013,13 @@
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz",
"integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
- "dev": true,
- "requires": {}
+ "dev": true
},
"acorn-jsx": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
"integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "dev": true,
- "requires": {}
+ "dev": true
},
"acorn-walk": {
"version": "7.2.0",
@@ -18094,8 +18091,7 @@
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
- "dev": true,
- "requires": {}
+ "dev": true
},
"ansi-align": {
"version": "3.0.1",
@@ -21120,8 +21116,7 @@
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
"integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
- "dev": true,
- "requires": {}
+ "dev": true
},
"ieee754": {
"version": "1.2.1",
@@ -22450,8 +22445,7 @@
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
"integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
- "dev": true,
- "requires": {}
+ "dev": true
},
"jest-regex-util": {
"version": "27.5.1",
@@ -24376,8 +24370,7 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
"integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
- "dev": true,
- "requires": {}
+ "dev": true
},
"postcss-modules-local-by-default": {
"version": "4.0.0",
@@ -24663,7 +24656,8 @@
"react-is": {
"version": "17.0.2",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
- "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+ "dev": true
},
"react-router": {
"version": "6.2.2",
@@ -25646,8 +25640,7 @@
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz",
"integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==",
- "dev": true,
- "requires": {}
+ "dev": true
},
"styled-components": {
"version": "5.3.3",
@@ -26506,8 +26499,7 @@
"version": "8.5.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz",
"integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==",
- "dev": true,
- "requires": {}
+ "dev": true
}
}
},
@@ -26720,8 +26712,7 @@
"version": "7.5.7",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz",
"integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==",
- "dev": true,
- "requires": {}
+ "dev": true
},
"xdg-basedir": {
"version": "4.0.0",