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" ;
6
17
7
18
interface Task {
8
19
_id : string ;
@@ -12,34 +23,65 @@ interface Task {
12
23
13
24
export default function Home ( ) {
14
25
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
+ } ;
16
39
17
40
useEffect ( ( ) => {
18
- axios . get ( ' /api/tasks' ) . then ( ( res ) => setTasks ( res . data ) ) ;
41
+ axios . get ( " /api/tasks" ) . then ( ( res ) => setTasks ( res . data ) ) ;
19
42
} , [ ] ) ;
20
43
21
44
const addTask = async ( ) => {
22
45
if ( ! newTask ) return ;
23
- const form = { title : newTask }
46
+ const form = { title : newTask } ;
24
47
// console.log('addtask:', form)
25
- const res = await axios . post < Task > ( ' /api/tasks' , form ) ;
48
+ const res = await axios . post < Task > ( " /api/tasks" , form ) ;
26
49
setTasks ( [ ...tasks , res . data ] ) ;
27
- setNewTask ( '' ) ;
50
+ setNewTask ( "" ) ;
51
+ showSnackBar ( "Task added!" ) ;
28
52
} ;
29
53
30
54
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
+ } ) ;
32
58
setTasks ( tasks . map ( ( t ) => ( t . _id === task . _id ? res . data : t ) ) ) ;
59
+ showSnackBar ( "Task done!" ) ;
33
60
} ;
34
61
35
62
const deleteTask = async ( id : string ) => {
36
63
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 ( ) ;
38
78
} ;
39
79
40
80
return (
41
81
< Container maxWidth = "sm" sx = { { mt : 5 } } >
42
- < Typography variant = "h4" gutterBottom > Task Manager</ Typography >
82
+ < Typography variant = "h5" gutterBottom >
83
+ Task Manager
84
+ </ Typography >
43
85
< TextField
44
86
fullWidth
45
87
label = "New Task"
@@ -48,19 +90,38 @@ export default function Home() {
48
90
onChange = { ( e ) => setNewTask ( e . target . value ) }
49
91
sx = { { mb : 2 } }
50
92
/>
51
- < Button variant = "contained" onClick = { addTask } > Add Task</ Button >
93
+ < Button variant = "contained" onClick = { addTask } >
94
+ Add Task
95
+ </ Button >
52
96
< List >
53
97
{ 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
+ />
61
114
</ ListItem >
62
115
) ) }
63
116
</ 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
+ />
64
125
</ Container >
65
126
) ;
66
127
}
0 commit comments