Skip to content

Commit fea36f6

Browse files
committed
Added feature to check, uncheck and reset todos items
1 parent 0e4c8e6 commit fea36f6

File tree

4 files changed

+24
-7
lines changed

4 files changed

+24
-7
lines changed

app/controllers/home_controller.rb

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,22 @@ def landing
99

1010
def edit_todo_item
1111
@todo_item.update(todo_item_params)
12+
render json: @todo_item
1213
end
1314

1415
def reset_todo_items
1516
Todo.update_all(checked: false)
17+
@todos = Todo.all.order(:id)
18+
render json: @todos
1619
end
1720

1821
private
1922

2023
def todo_item_params
21-
params.permit(:id, :title, :checked)
24+
params.require(:home).permit(:id, :title, :checked)
2225
end
2326

2427
def set_todo_item
25-
@todo_item = Todo.find(todo_item_params[:id])
28+
@todo_item = Todo.find(params[:id])
2629
end
2730
end

app/javascript/components/TodoList/index.tsx

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useEffect } from "react";
1+
import React, { useState, useEffect } from "react";
22
import { Container, ListGroup, Form } from "react-bootstrap";
33
import { ResetButton } from "./uiComponent";
44
import axios from "axios";
@@ -14,6 +14,7 @@ type Props = {
1414
};
1515

1616
const TodoList: React.FC<Props> = ({ todoItems }) => {
17+
const [todoList, setTodoList] = useState([...todoItems]);
1718
useEffect(() => {
1819
const token = document.querySelector(
1920
"[name=csrf-token]"
@@ -25,21 +26,34 @@ const TodoList: React.FC<Props> = ({ todoItems }) => {
2526
e: React.ChangeEvent<HTMLInputElement>,
2627
todoItemId: number
2728
): void => {
29+
const checked = e.target.checked;
2830
axios.post("/todo", {
2931
id: todoItemId,
3032
checked: e.target.checked,
33+
}).then(() => {
34+
setTodoList(prevList => {
35+
const updatedList = prevList.map(todo => {
36+
if (todo.id === todoItemId) {
37+
todo.checked = checked;
38+
}
39+
return todo;
40+
})
41+
return updatedList;
42+
});
3143
});
3244
};
3345

3446
const resetButtonOnClick = (): void => {
35-
axios.post("/reset").then(() => location.reload());
47+
axios.post("/reset").then(response => {
48+
setTodoList(response.data);
49+
});
3650
};
3751

3852
return (
3953
<Container>
4054
<h3>2022 Wish List</h3>
4155
<ListGroup>
42-
{todoItems.map((todo) => (
56+
{todoList.map((todo) => (
4357
<ListGroup.Item key={todo.id}>
4458
<Form.Check
4559
type="checkbox"

config/routes.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
Rails.application.routes.draw do
44
root to: "home#landing"
55
post "todo", to: "home#edit_todo_item"
6-
post "reset", to: "home#reset_todo_item"
6+
post "reset", to: "home#reset_todo_items"
77
end

db/schema.rb

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)