Menu.js 4.11 KB
Newer Older
Kim, Subin's avatar
Kim, Subin committed
1
import { useState, useEffect } from "react";
Kim, Subin's avatar
Kim, Subin committed
2
import { Link } from "react-router-dom";
Kim, Subin's avatar
Kim, Subin committed
3
import todoApi from "../../apis/todo.api";
4
import { useAuth } from "../../utils/context.js";
Kim, Subin's avatar
Kim, Subin committed
5
import catchErrors from "../../utils/catchErrors";
Kim, Subin's avatar
Monthly    
Kim, Subin committed
6
import moment from "moment";
7
8
import styles from "./menu.module.scss";

Kim, Subin's avatar
Kim, Subin committed
9
const Menu = () => {
Kim, Subin's avatar
context    
Kim, Subin committed
10
    const { user, logout } = useAuth();
Kim, Subin's avatar
Kim, Subin committed
11
    const [todoList, setTodoList] = useState({ percent: 0, list: [] })
Kim, Subin's avatar
Kim, Subin committed
12
13
14
15
16
17
18
19
20
    const [error, setError] = useState("");

    useEffect(() => {
        todayTodo()
    }, [])

    async function todayTodo() {
        try {
            setError("")
Kim, Subin's avatar
Kim, Subin committed
21
            const result = await todoApi.getTodopercent(user.id, moment().format("YYYY-MM-DD"))
Kim, Subin's avatar
Kim, Subin committed
22
23
24
25
26
27
28
29
30
31
32
33
            setTodoList({ ...todoList, ...result })
        } catch (error) {
            catchErrors(error, setError)
        }
    }

    async function checkFn(e, todoId) {
        try {
            setError("")
            const check_v = e.target.value === "true" ? true : false
            await todoApi.edit({id: todoId, done: check_v}, user.id)
            todayTodo()
Kim, Subin's avatar
Kim, Subin committed
34
35
36
37
        } catch (error) {
            catchErrors(error, setError)
        }
    }
Kim, Subin's avatar
Kim, Subin committed
38

Kim, Subin's avatar
Kim, Subin committed
39
    return (
40
41
42
43
44
        <>
            <button className="btn btn-crimson shadow-none mt-2" type="button" data-bs-toggle="collapse" data-bs-target="#menuContent" aria-controls="menuContent" aria-expanded="false" aria-label="menu">
                <i className="bi bi-list fs-4"></i>
            </button>
            <div className={`collapse collapse-horizontal position-absolute top-0 start-0 h-100 ${styles.content}`} id="menuContent">
Kim, Subin's avatar
Kim, Subin committed
45
46
47
                <div className="d-flex flex-column" style={{ transition: ".15s ease", height: "inherit" }}>
                    <button type="button" className={`btn-close btn-close-white btn-lg position-absolute ${styles.close}`} data-bs-toggle="collapse" data-bs-target="#menuContent" aria-controls="menuContent" aria-expanded="true" aria-label="menu"></button>
                    <div className="d-flex flex-column align-items-center text-white py-5" style={{ backgroundColor: "crimson" }}>
Kim, Subin's avatar
context    
Kim, Subin committed
48
                        <h1 className="my-3">{user.name} </h1>
Kim, Subin's avatar
Kim, Subin committed
49
                        <h2 className="my-2">오늘의 목표 {todoList.percent}% 달성!</h2>
Kim, Subin's avatar
Kim, Subin committed
50
                    </div>
Kim, Subin's avatar
Kim, Subin committed
51
52
                    <div className="d-flex flex-column justify-content-between flex-grow-1 py-4 ps-3 text-dark" >
                        <div className="user-select-none w-75 ps-3">
Kim, Subin's avatar
Kim, Subin committed
53
                            <h2 className="mb-4">To-do</h2>
Kim, Subin's avatar
Kim, Subin committed
54
                            {todoList.list.length !== 0 ? todoList.list.map((todo, idx) => <div className="d-flex">
Kim, Subin's avatar
Todo    
Kim, Subin committed
55
                                <p className={`form-check-label border-bottom border-2 text-nowrap fs-5 pb-1 me-3 ${styles.title}`}>{todo.title}</p>
Kim, Subin's avatar
Kim, Subin committed
56
57
58
                                <input className={`form-check-input rounded-0 border-dark shadow-none mt-1 ${styles.checkBox}`} type="checkbox" id={"todoCheck" + idx} value={todo.done} aria-label="checkbox" onClick={(e) => checkFn(e, todo.id)} checked={todo.done} />
                            </div>) : <div className="text-center border-bottom border-2 pb-1">오늘의 Todo를 등록해 보세요!</div>}
                            <Link className="d-flex justify-content-center text-dark text-decoration-none mt-2" to={`/todo/${moment().format("YYYY-MM-DD")}`}>
Kim, Subin's avatar
Kim, Subin committed
59
60
61
62
63
                                <i className="bi bi-plus-lg me-2"></i>
                                <p className="mb-0">더보기</p>
                            </Link>
                        </div>
                        <div className="d-flex flex-column">
Kim, Subin's avatar
Monthly    
Kim, Subin committed
64
                            <Link className="text-dark text-decoration-none" to={`/schedule/${moment().format("YYYY-MM-DD")}`}><i className="bi bi-check"></i>일정</Link>
Kim, Subin's avatar
Kim, Subin committed
65
66
                            <Link className="text-dark text-decoration-none" to="/studyplan"><i className="bi bi-check"></i>학업별 계획</Link>
                        </div>
67
                        <p className={`position-absolute bottom-0 text-dark ${styles.logout}`} onClick={logout}>로그아웃</p>
Kim, Subin's avatar
Kim, Subin committed
68
69
                    </div>
                </div>
70
71
            </div>
        </>
Kim, Subin's avatar
Kim, Subin committed
72
73
74
75
    )
}

export default Menu