Skip to content

Commit 43370f2

Browse files
toggle and delete use case made ready
1 parent e056ced commit 43370f2

File tree

2 files changed

+86
-25
lines changed

2 files changed

+86
-25
lines changed

src/app/api/task/route.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ export async function PUT(request) {
88
const searchParams = request.nextUrl.searchParams;
99
const id = searchParams.get('id');
1010

11-
console.log('deleting task..', id, form)
12-
// await connectToDatabase();
13-
// const updatedTask: ITask | null = await Task.findByIdAndUpdate(id, req.body, { new: true });
14-
return NextResponse.json({}, { status: 200 });
11+
console.log('toggling task..', id, form)
12+
await connectToDatabase();
13+
const updatedTask: ITask | null = await Task.findByIdAndUpdate(id, form, { new: true });
14+
return NextResponse.json(updatedTask, { status: 200 });
1515
}
1616

1717

src/app/page.tsx

Lines changed: 82 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,19 @@
1-
"use client"
2-
import { useState, useEffect } from 'react';
3-
import axios from 'axios';
4-
import { Container, Typography, TextField, Button, List, ListItem, ListItemText, IconButton, Checkbox } from '@mui/material';
5-
import DeleteIcon from '@mui/icons-material/Delete';
1+
"use client";
2+
import { useState, useEffect } from "react";
3+
import axios from "axios";
4+
import {
5+
Container,
6+
Typography,
7+
TextField,
8+
Button,
9+
List,
10+
ListItem,
11+
ListItemText,
12+
IconButton,
13+
Checkbox,
14+
} from "@mui/material";
15+
import DeleteIcon from "@mui/icons-material/Delete";
16+
import Snackbar, { SnackbarCloseReason } from "@mui/material/Snackbar";
617

718
interface Task {
819
_id: string;
@@ -12,34 +23,65 @@ interface Task {
1223

1324
export default function Home() {
1425
const [tasks, setTasks] = useState<Task[]>([]);
15-
const [newTask, setNewTask] = useState<string>('');
26+
const [newTask, setNewTask] = useState<string>("");
27+
const [openSnackBar, setOpenSnackBar] = useState(false);
28+
const [snackBarMsg, setSnackBarMsg] = useState("");
29+
30+
const showSnackBar = (msg: string) => {
31+
setSnackBarMsg(msg);
32+
setOpenSnackBar(true);
33+
};
34+
35+
const hideSnackBar = () => {
36+
setSnackBarMsg("");
37+
setOpenSnackBar(false);
38+
};
1639

1740
useEffect(() => {
18-
axios.get('/api/tasks').then((res) => setTasks(res.data));
41+
axios.get("/api/tasks").then((res) => setTasks(res.data));
1942
}, []);
2043

2144
const addTask = async () => {
2245
if (!newTask) return;
23-
const form = { title: newTask }
46+
const form = { title: newTask };
2447
// console.log('addtask:', form)
25-
const res = await axios.post<Task>('/api/tasks', form);
48+
const res = await axios.post<Task>("/api/tasks", form);
2649
setTasks([...tasks, res.data]);
27-
setNewTask('');
50+
setNewTask("");
51+
showSnackBar("Task added!");
2852
};
2953

3054
const toggleTask = async (task: Task) => {
31-
const res = await axios.put<Task>(`/api/task?id=${task._id}`, { completed: !task.completed });
55+
const res = await axios.put<Task>(`/api/task?id=${task._id}`, {
56+
completed: !task.completed,
57+
});
3258
setTasks(tasks.map((t) => (t._id === task._id ? res.data : t)));
59+
showSnackBar("Task done!");
3360
};
3461

3562
const deleteTask = async (id: string) => {
3663
await axios.delete(`/api/task?id=${id}`);
37-
setTasks(tasks.filter((t) => t._id !== id));
64+
const list = tasks.filter((t) => t._id !== id);
65+
// console.log('after.deletion:', list)
66+
showSnackBar("Task deleted!");
67+
setTasks(list);
68+
};
69+
70+
const handleClose = (
71+
event: React.SyntheticEvent | Event,
72+
reason?: SnackbarCloseReason
73+
) => {
74+
if (reason === "clickaway") {
75+
return;
76+
}
77+
hideSnackBar();
3878
};
3979

4080
return (
4181
<Container maxWidth="sm" sx={{ mt: 5 }}>
42-
<Typography variant="h4" gutterBottom>Task Manager</Typography>
82+
<Typography variant="h5" gutterBottom>
83+
Task Manager
84+
</Typography>
4385
<TextField
4486
fullWidth
4587
label="New Task"
@@ -48,19 +90,38 @@ export default function Home() {
4890
onChange={(e) => setNewTask(e.target.value)}
4991
sx={{ mb: 2 }}
5092
/>
51-
<Button variant="contained" onClick={addTask}>Add Task</Button>
93+
<Button variant="contained" onClick={addTask}>
94+
Add Task
95+
</Button>
5296
<List>
5397
{tasks.map((task) => (
54-
<ListItem key={task._id} secondaryAction={
55-
<IconButton edge="end" onClick={() => deleteTask(task._id)}>
56-
<DeleteIcon />
57-
</IconButton>
58-
}>
59-
<Checkbox checked={task.completed} onChange={() => toggleTask(task)} />
60-
<ListItemText primary={task.title} sx={{ textDecoration: task.completed ? 'line-through' : 'none' }} />
98+
<ListItem
99+
key={task._id}
100+
secondaryAction={
101+
<IconButton edge="end" onClick={() => deleteTask(task._id)}>
102+
<DeleteIcon />
103+
</IconButton>
104+
}
105+
>
106+
<Checkbox
107+
checked={task.completed}
108+
onChange={() => toggleTask(task)}
109+
/>
110+
<ListItemText
111+
primary={task.title}
112+
sx={{ textDecoration: task.completed ? "line-through" : "none" }}
113+
/>
61114
</ListItem>
62115
))}
63116
</List>
117+
<Snackbar
118+
open={openSnackBar}
119+
autoHideDuration={3000}
120+
onClose={handleClose}
121+
message={snackBarMsg}
122+
anchorOrigin={{ vertical: "top", horizontal: "center" }}
123+
// action={action}
124+
/>
64125
</Container>
65126
);
66127
}

0 commit comments

Comments
 (0)