StudyPlanEditForm.js 6.78 KB
Newer Older
1
import { useState, useEffect } from 'react';
Kim, Subin's avatar
Kim, Subin committed
2
import { useParams, Redirect } from 'react-router-dom';
Kim, Subin's avatar
Kim, Subin committed
3
import { useAuth } from "../../utils/context";
4
import BtnGroup from "../Buttons/BtnGroup";
Kim, Subin's avatar
Kim, Subin committed
5
6
7
import subjectApi from '../../apis/subject.api';
import planApi from '../../apis/plan.api';
import catchErrors from '../../utils/catchErrors';
8
9
10
import styles from "./form.module.scss";

const StudyPlanEditForm = () => {
Choi Ga Young's avatar
Choi Ga Young committed
11
12
13
14
15
    const { user } = useAuth();
    const params = useParams();
    const [disabled, setDisabled] = useState(true)
    const [selected, setSelected] = useState("");
    const [error, setError] = useState("");
Kim, Subin's avatar
Kim, Subin committed
16
    const [success, setSuccess] = useState(false)
Choi Ga Young's avatar
Choi Ga Young committed
17
    const [subName, setSubName] = useState("");
18
19
20
    const [studyplan, setStudyplan] = useState({
        studyplanTitle: "",
        endDate: "",
Choi Ga Young's avatar
Choi Ga Young committed
21
22
23
        memo: "",
        deadline: "",
        selected: ""
24
    })
Kim, Subin's avatar
Kim, Subin committed
25
    const [subjectList, setList] = useState([])
26
27
28

    useEffect(() => {
        let isMounted = true;
Choi Ga Young's avatar
Choi Ga Young committed
29
30
        const checkInfo = { studyplanTitle: studyplan.studyplanTitle, endDate: studyplan.endDate, selected: selected }
        if (studyplan.deadline === "on") {
31
32
33
34
35
36
37
38
39
40
41
42
43
            checkInfo.endTime = studyplan.endTime
        } else {
            delete checkInfo.endTime
        }
        if (isMounted) {
            const isStudyPlan = Object.values(checkInfo).every((el) => Boolean(el));
            isStudyPlan ? setDisabled(false) : setDisabled(true);
        }
        return () => {
            isMounted = false;
        }
    }, [studyplan])

Choi Ga Young's avatar
Choi Ga Young committed
44
    useEffect(() => {
Kim, Subin's avatar
Kim, Subin committed
45
        getSubject(user.id)
Choi Ga Young's avatar
Choi Ga Young committed
46
47
48
49
50
51
52
        if (params.hasOwnProperty('planId')) {
            console.log('planId params확인');
            getInfo(params.planId);
        }
    }, [])

    async function getInfo(id) {
Kim, Subin's avatar
Kim, Subin committed
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
        try {
            setError("")
            const result = await planApi.getDetail(id)
            console.log('수정 getInfo result', result)
            if (result.endTime) {
                setStudyplan({
                    studyplanTitle: result.title,
                    endDate: result.endDate,
                    endTime: result.endTime,
                    memo: result.memo,
                    deadline: result.deadline,
                    selected: result.subjectId
                })
                setSubName(result.subjectName)
            } else {
                setStudyplan({
                    studyplanTitle: result.title,
                    endDate: result.endDate,
                    memo: result.memo,
                    deadline: result.deadline,
                    selected: result.subjectId
                })
                setSubName(result.subjectName)
            }
        } catch (error) {
            catchErrors(error, setError)
Choi Ga Young's avatar
Choi Ga Young committed
79
        }
Choi Ga Young's avatar
Choi Ga Young committed
80
81
    }

Kim, Subin's avatar
Kim, Subin committed
82
83
84
85
86
87
88
89
    async function getSubject(id) {
        try {
            setError("")
            const result = await subjectApi.subjectTitle(id)
            setList(result)
        } catch (error) {
            catchErrors(error, setError)
        }
Choi Ga Young's avatar
Choi Ga Young committed
90
91
    }

92
93
94
95
96
97
98
99
100
    function handleChange(e) {
        const { name, value } = e.target
        if (name === "deadline") {
            studyplan.deadline !== "on" ? setStudyplan({ ...studyplan, [name]: value }) : setStudyplan({ ...studyplan, [name]: "off" })
        } else {
            setStudyplan({ ...studyplan, [name]: value })
        }
    }

Choi Ga Young's avatar
Choi Ga Young committed
101
102
103
104
105
106
107
108
109
    async function handleSubmit(e) {
        e.preventDefault();
        try {
            setError("")
            studyplan.selected = selected
            if (params.hasOwnProperty('subjectId')) {
                //등록함수 실행
                console.log('등록함수')
                const result = await planApi.addPlan(studyplan, params.subjectId)
Kim, Subin's avatar
Kim, Subin committed
110
                alert("해당 학업계획이 성공적으로 등록되었습니다.")
Choi Ga Young's avatar
Choi Ga Young committed
111
112
113
            } else {
                //수정함수 실행
                console.log('수정함수')
Choi Ga Young's avatar
Choi Ga Young committed
114
                const result = await planApi.editPlan(studyplan, params.planId)
Choi Ga Young's avatar
Choi Ga Young committed
115
                console.log('수정 후 result확인', result)
Kim, Subin's avatar
Kim, Subin committed
116
                alert("해당 학업계획이 성공적으로 수정되었습니다.")
Choi Ga Young's avatar
Choi Ga Young committed
117
            }
Kim, Subin's avatar
Kim, Subin committed
118
            setSuccess(true)
Choi Ga Young's avatar
Choi Ga Young committed
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
        } catch (error) {
            catchErrors(error, setError)
            setStudyplan({
                studyplanTitle: "",
                endDate: "",
                deadline: "",
                memo: ""
            })
        }
    }

    function handleSelect(e) {
        setSelected(e.target.value);
    }

Kim, Subin's avatar
Kim, Subin committed
134
135
136
137
    if (success) {
        return <Redirect to="/studyplan" />
    }

138
    return (
Kim, Subin's avatar
Kim, Subin committed
139
        <div className="pt-5">
Choi Ga Young's avatar
Choi Ga Young committed
140
            <select className={`form-select mb-4 ${styles.selectInput}`} aria-label="Choose subject" onChange={handleSelect}>
Choi Ga Young's avatar
Choi Ga Young committed
141
                {studyplan.selected ? <option value={studyplan.selected} selected>{subName}</option> : <option selected>관련 과목을 선택해주세요.</option>}
Kim, Subin's avatar
Kim, Subin committed
142
                {subjectList.length !== 0 ? subjectList.map((i) => <option value={i.id}>{i.name}</option>) : null}
Kim, Subin's avatar
Kim, Subin committed
143
144
145
            </select>
            <input type="text" name="studyplanTitle"
                className={`form-control shadow-none rounded-0 mb-5 ${styles.textInput}`}
Choi Ga Young's avatar
Choi Ga Young committed
146
                placeholder="제목" value={studyplan.studyplanTitle} onChange={handleChange} />
Kim, Subin's avatar
Kim, Subin committed
147
148
            <div className="d-flex mb-3">
                <label className="col col-form-label align-self-center py-0">마감일</label>
Choi Ga Young's avatar
Choi Ga Young committed
149
150
                <div className={studyplan.deadline === "on" ? "col-5" : "col-7"}>
                    <input className={`form-control shadow-none ${styles.dateInput}`} type="date" name="endDate" aria-label="endDate" value={studyplan.endDate} onChange={handleChange} />
151
                </div>
Choi Ga Young's avatar
Choi Ga Young committed
152
153
                <div className={"col-4 " + (studyplan.deadline === "on" ? "d-block" : "d-none")}>
                    <input className={`form-control shadow-none ${styles.dateInput}`} type="time" name="endTime" aria-label="endTime" value={studyplan.endTime} onChange={handleChange} />
154
                </div>
Kim, Subin's avatar
Kim, Subin committed
155
156
            </div>
            <div className="d-flex justify-content-end form-check mb-4">
Choi Ga Young's avatar
Choi Ga Young committed
157
                <input className={`form-check-input shadow-none ${styles.checkBox} me-2`} type="checkbox" id="deadline" name="deadline" onChange={handleChange} checked={studyplan.deadline === "on" ? true : false} />
Kim, Subin's avatar
Kim, Subin committed
158
159
160
161
162
                <label className="form-check-label" htmlFor="deadline">시간 </label>
            </div>
            <div className="d-flex justify-content-between mb-5">
                <i className="col bi bi-journal-text fs-3"></i>
                <div className="col-10">
Choi Ga Young's avatar
Choi Ga Young committed
163
                    <textarea className={`form-control shadow-none ${styles.textArea}`} name="memo" rows="5" value={studyplan.memo} onChange={handleChange}></textarea>
164
165
                </div>
            </div>
Choi Ga Young's avatar
Choi Ga Young committed
166
            <BtnGroup disabled={disabled} handleSubmit={handleSubmit} />
Kim, Subin's avatar
Kim, Subin committed
167
        </div>
168
169
170
171
    )
}

export default StudyPlanEditForm