diff --git a/todo-app/package-lock.json b/todo-app/package-lock.json
index 687d18f..b3e24eb 100644
--- a/todo-app/package-lock.json
+++ b/todo-app/package-lock.json
@@ -799,6 +799,15 @@
"resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz",
"integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw=="
},
+ "@semantic-ui-react/event-stack": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@semantic-ui-react/event-stack/-/event-stack-3.0.0.tgz",
+ "integrity": "sha512-5qVx0KdwN1iBWrbiXiuuaw1NShhmveNiEHynq/sjvI6U9eXn/k3yMZRZgeQof45iVwDP5NDy/fsF1sDcsk4eNA==",
+ "requires": {
+ "exenv": "^1.2.2",
+ "prop-types": "^15.6.2"
+ }
+ },
"@svgr/core": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@svgr/core/-/core-2.4.1.tgz",
@@ -2600,6 +2609,11 @@
}
}
},
+ "classnames": {
+ "version": "2.2.6",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz",
+ "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q=="
+ },
"clean-css": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz",
@@ -4240,6 +4254,11 @@
}
}
},
+ "exenv": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz",
+ "integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50="
+ },
"exit": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
@@ -4598,6 +4617,11 @@
}
}
},
+ "font-awesome": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz",
+ "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM="
+ },
"for-in": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
@@ -7129,6 +7153,11 @@
"topo": "2.x.x"
}
},
+ "jquery": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz",
+ "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg=="
+ },
"js-levenshtein": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.4.tgz",
@@ -7266,6 +7295,11 @@
"array-includes": "^3.0.3"
}
},
+ "keyboard-key": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/keyboard-key/-/keyboard-key-1.0.2.tgz",
+ "integrity": "sha512-05cjQmw4ss/YuY2utmVim0wywDyBZGUivo8siLPkWinwGWtKlO8/4RGbPUqNycwlD3u/3D15eNRjnNAyaTDs8g=="
+ },
"killable": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
@@ -12411,6 +12445,43 @@
"node-forge": "0.7.5"
}
},
+ "semantic-ui-css": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/semantic-ui-css/-/semantic-ui-css-2.4.1.tgz",
+ "integrity": "sha512-Pkp0p9oWOxlH0kODx7qFpIRYpK1T4WJOO4lNnpNPOoWKCrYsfHqYSKgk5fHfQtnWnsAKy7nLJMW02bgDWWFZFg==",
+ "requires": {
+ "jquery": "x.*"
+ }
+ },
+ "semantic-ui-react": {
+ "version": "0.83.0",
+ "resolved": "https://registry.npmjs.org/semantic-ui-react/-/semantic-ui-react-0.83.0.tgz",
+ "integrity": "sha512-rPW4TZwbDJRJZeKxCpYuNiRnBwUpWeDkZ/yF3j5iLNS8hZ6yOjoFFmqGohqpqKD+jVyzlxz2NCmah54mwbNGOw==",
+ "requires": {
+ "@babel/runtime": "^7.1.2",
+ "@semantic-ui-react/event-stack": "^3.0.0",
+ "classnames": "^2.2.6",
+ "keyboard-key": "^1.0.2",
+ "lodash": "^4.17.10",
+ "prop-types": "^15.6.2",
+ "shallowequal": "^1.1.0"
+ },
+ "dependencies": {
+ "@babel/runtime": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.1.2.tgz",
+ "integrity": "sha512-Y3SCjmhSupzFB6wcv1KmmFucH6gDVnI30WjOcicV10ju0cZjak3Jcs67YLIXBrmZYw1xCrVeJPbycFwrqNyxpg==",
+ "requires": {
+ "regenerator-runtime": "^0.12.0"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.12.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz",
+ "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg=="
+ }
+ }
+ },
"semver": {
"version": "5.6.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
@@ -12562,6 +12633,11 @@
}
}
},
+ "shallowequal": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
+ "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
+ },
"shebang-command": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
diff --git a/todo-app/package.json b/todo-app/package.json
index 22c0fa4..16de5c0 100644
--- a/todo-app/package.json
+++ b/todo-app/package.json
@@ -6,13 +6,16 @@
"dependencies": {
"ajv": "^6.5.4",
"axios": "^0.18.0",
+ "font-awesome": "^4.7.0",
"immutability-helper": "^2.8.1",
"react": "^16.5.2",
"react-dom": "^16.5.2",
"react-redux": "^5.0.7",
"react-scripts": "2.0.4",
"redux": "^4.0.1",
- "redux-thunk": "^2.3.0"
+ "redux-thunk": "^2.3.0",
+ "semantic-ui-css": "^2.4.1",
+ "semantic-ui-react": "^0.83.0"
},
"scripts": {
"start": "react-scripts start",
diff --git a/todo-app/src/App.js b/todo-app/src/App.js
index 0dc8d9c..b6eb3b3 100644
--- a/todo-app/src/App.js
+++ b/todo-app/src/App.js
@@ -1,18 +1,14 @@
import React, { Component } from 'react';
import './App.css';
+// import TodosContainer from './containers/TodosContainer.old'
import TodosContainer from './containers/TodosContainer'
class App extends Component {
- render() {
- return (
-
- );
- }
+ render() {
+ return (
+
+ );
+ }
}
export default App;
diff --git a/todo-app/src/components/InputBox.js b/todo-app/src/components/InputBox.js
new file mode 100644
index 0000000..65db361
--- /dev/null
+++ b/todo-app/src/components/InputBox.js
@@ -0,0 +1,30 @@
+import React, { Component } from 'react'
+
+class InputBox extends Component {
+ constructor(props) {
+ super(props);
+ }
+
+ createTodo = (e) => {
+ if (e.key === 'Enter' && !(this.getTitle.value === '')) {
+ this.props.createTodo(this.getTitle.value)
+ this.getTitle.value = '';
+ }
+ }
+
+ render() {
+ return(
+
+
+
Todo List
+
+
+ this.getTitle = input} />
+
+
+ );
+ }
+}
+
+export default InputBox;
\ No newline at end of file
diff --git a/todo-app/src/components/TodoItem.js b/todo-app/src/components/TodoItem.js
new file mode 100644
index 0000000..8d89ee7
--- /dev/null
+++ b/todo-app/src/components/TodoItem.js
@@ -0,0 +1,31 @@
+import React, { Component } from 'react'
+
+class TodoItem extends Component {
+ constructor(props) {
+ super(props);
+ }
+
+ updateTodo = (e, id) => {
+ this.props.updateTodo({id: id, checked: e.target.checked})
+ }
+
+ deleteTodo = (id) => {
+ this.props.deleteTodo(id)
+ }
+
+ render() {
+ const todo = this.props.todo;
+ return(
+
+ this.updateTodo(e, todo.id)} />
+
+ this.deleteTodo(todo.id)}>
+ x
+
+
+ );
+ }
+}
+
+export default TodoItem;
\ No newline at end of file
diff --git a/todo-app/src/components/TodoList.js b/todo-app/src/components/TodoList.js
new file mode 100644
index 0000000..8b4e534
--- /dev/null
+++ b/todo-app/src/components/TodoList.js
@@ -0,0 +1,27 @@
+import React, { Component } from 'react'
+import TodoItem from './TodoItem'
+
+class TodoList extends Component {
+ constructor(props) {
+ super(props);
+ }
+
+ render() {
+ const todos = this.props.todos;
+ return(
+
+
+ {todos.map((todo) => {
+ return (
+
+ )
+ })}
+
+
+ );
+ }
+}
+
+export default TodoList;
\ No newline at end of file
diff --git a/todo-app/src/containers/TodosContainer.js b/todo-app/src/containers/TodosContainer.js
index 61774cd..7f3f62d 100644
--- a/todo-app/src/containers/TodosContainer.js
+++ b/todo-app/src/containers/TodosContainer.js
@@ -2,80 +2,65 @@ import React, { Component } from 'react'
import axios from 'axios'
import { connect } from 'react-redux'
import { loadTodos, addTodo, toggleTodo, deleteTodo } from '../actions/actionCreators'
+import InputBox from '../components/InputBox'
+import TodoList from '../components/TodoList'
-class TodosContainer extends Component {
+class Todos extends Component {
- getTodos() {
- axios.get('/api/v1/todos')
- .then(response => {
- this.props.dispatch(loadTodos(response.data));
- })
- .catch(error => console.log(error))
- }
-
- createTodo = (e) => {
- if (e.key === 'Enter' && !(this.getTitle.value === '')) {
- axios.post('/api/v1/todos', {todo: {title: this.getTitle.value}})
- .then(response => {
- this.props.dispatch(addTodo(response.data.id, response.data.title))
- this.getTitle.value = '';
- })
- .catch(error => console.log(error))
- }
- }
-
- updateTodo = (e, id) => {
- axios.put(`/api/v1/todos/${id}`, {todo: {done: e.target.checked}})
- .then(response => {
- this.props.dispatch(toggleTodo(id))
- })
- .catch(error => console.log(error))
- }
-
- deleteTodo = (id) => {
- axios.delete(`/api/v1/todos/${id}`)
- .then(response => {
- this.props.dispatch(deleteTodo(id))
- })
- .catch(error => console.log(error))
- }
-
- componentDidMount() {
- this.getTodos();
+ getTodos() {
+ axios.get('/api/v1/todos')
+ .then(response => {
+ this.props.dispatch(loadTodos(response.data));
+ })
+ .catch(error => console.log(error))
}
+ createTodo = (title) => {
+ if (!(title === '')) {
+ axios.post('/api/v1/todos', {todo: {title: title}})
+ .then(response => {
+ this.props.dispatch(addTodo(response.data.id, response.data.title))
+ })
+ .catch(error => console.log(error))
+ }
+ }
+
+ updateTodo = (params) => {
+ axios.put(`/api/v1/todos/${params.id}`, {todo: {done: params.checked}})
+ .then(response => {
+ this.props.dispatch(toggleTodo(params.id))
+ })
+ .catch(error => console.log(error))
+ }
+
+ deleteTodo = (id) => {
+ axios.delete(`/api/v1/todos/${id}`)
+ .then(response => {
+ this.props.dispatch(deleteTodo(id))
+ })
+ .catch(error => console.log(error))
+ }
+
+ componentDidMount() {
+ this.getTodos();
+ }
+
render() {
- return (
-
-
- this.getTitle = input} />
-
-
-
- )
+ return (
+
+
+
+
+ )
}
}
const mapStateToProps = (state) => {
- return {
- todos: state.todos
- }
+ return {
+ todos: state.todos
+ }
}
-export default connect(mapStateToProps)(TodosContainer)
+export default connect(mapStateToProps)(Todos)
diff --git a/todo-app/src/containers/TodosContainer.old.js b/todo-app/src/containers/TodosContainer.old.js
new file mode 100644
index 0000000..fedf10a
--- /dev/null
+++ b/todo-app/src/containers/TodosContainer.old.js
@@ -0,0 +1,84 @@
+import React, { Component } from 'react'
+import axios from 'axios'
+import { connect } from 'react-redux'
+import { loadTodos, addTodo, toggleTodo, deleteTodo } from '../actions/actionCreators'
+
+class TodosContainer extends Component {
+
+ getTodos() {
+ axios.get('/api/v1/todos')
+ .then(response => {
+ this.props.dispatch(loadTodos(response.data));
+ })
+ .catch(error => console.log(error))
+ }
+
+ createTodo = (e) => {
+ if (e.key === 'Enter' && !(this.getTitle.value === '')) {
+ axios.post('/api/v1/todos', {todo: {title: this.getTitle.value}})
+ .then(response => {
+ this.props.dispatch(addTodo(response.data.id, response.data.title))
+ this.getTitle.value = '';
+ })
+ .catch(error => console.log(error))
+ }
+ }
+
+ updateTodo = (e, id) => {
+ axios.put(`/api/v1/todos/${id}`, {todo: {done: e.target.checked}})
+ .then(response => {
+ this.props.dispatch(toggleTodo(id))
+ })
+ .catch(error => console.log(error))
+ }
+
+ deleteTodo = (id) => {
+ axios.delete(`/api/v1/todos/${id}`)
+ .then(response => {
+ this.props.dispatch(deleteTodo(id))
+ })
+ .catch(error => console.log(error))
+ }
+
+ componentDidMount() {
+ this.getTodos();
+ }
+
+ render() {
+ return (
+
+
+
Todo List
+
+
+ this.getTitle = input} />
+
+
+
+ )
+ }
+}
+
+const mapStateToProps = (state) => {
+ return {
+ todos: state.todos
+ }
+}
+
+export default connect(mapStateToProps)(TodosContainer)
diff --git a/todo-app/src/reducers/rootReducer.js b/todo-app/src/reducers/rootReducer.js
index 46260d5..305115d 100644
--- a/todo-app/src/reducers/rootReducer.js
+++ b/todo-app/src/reducers/rootReducer.js
@@ -3,7 +3,6 @@ import todosReducer from './todosReducer'
const rootReducer = combineReducers({
todos: todosReducer
- // todosReducer
});
export default rootReducer;
\ No newline at end of file