Question.tsx 5.66 KB
Newer Older
Jiwon Yoon's avatar
Jiwon Yoon committed
1
import React, { useState, Dispatch, SetStateAction } from "react";
2
import { BasicQuestionType, EssayType } from "../types";
Jiwon Yoon's avatar
Jiwon Yoon committed
3
import { questionApi } from "../apis";
4
import { EssayForm } from "./EssayForm";
Jiwon Yoon's avatar
Jiwon Yoon committed
5
6
7
8
9
import { CheckboxForm } from "./CheckboxForm";
import { RadioForm } from "./RadioForm";
import { DropdownForm } from "./DropdownForm";
import { FileForm } from "./FileForm";
import { RatingForm } from "./RatingForm";
10
11
12

type Props = {
  element: BasicQuestionType;
Jiwon Yoon's avatar
Jiwon Yoon committed
13
14
  handleQuestion: (id: string) => void;
  deleteQuestion: (id: string) => void;
Jiwon Yoon's avatar
Jiwon Yoon committed
15
16
  changeCurrentId: (id: string) => void;
  currentId: string;
17
18
};

Jiwon Yoon's avatar
Jiwon Yoon committed
19
20
21
22
23
24
25
26
27
28
const typeDropDown = new Map([
  ["essay", "주관식"],
  ["radio", "객관식"],
  ["dropdown", "드롭다운"],
  ["checkbox", "체크박스"],
  ["file", "파일"],
  ["rating", "선형"],
  ["grid", "그리드"],
  ["date", "날짜"],
]);
29

Jiwon Yoon's avatar
Jiwon Yoon committed
30
31
32
33
export const Question = ({
  element,
  handleQuestion,
  deleteQuestion,
Jiwon Yoon's avatar
Jiwon Yoon committed
34
35
  changeCurrentId,
  currentId,
Jiwon Yoon's avatar
Jiwon Yoon committed
36
}: Props) => {
Jiwon Yoon's avatar
Jiwon Yoon committed
37
  const handleEditClick = () => {
Jiwon Yoon's avatar
Jiwon Yoon committed
38
    changeCurrentId(element._id);
Jiwon Yoon's avatar
Jiwon Yoon committed
39
  };
Jiwon Yoon's avatar
Jiwon Yoon committed
40
  async function handleEditComplete() {
Jiwon Yoon's avatar
Jiwon Yoon committed
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
    try {
      const newQuestion: BasicQuestionType = await questionApi.updateQuestion(
        element
      );
      console.log(newQuestion);
      // setSuccess(true);
      // setError("");
    } catch (error) {
      console.log("에러발생");
      // catchErrors(error, setError)
    } finally {
      // setLoading(false);
    }
  }

  function handleSelect(event: React.ChangeEvent<HTMLSelectElement>) {
    const selectedType = event.currentTarget.value;
    console.log(selectedType);
    if (
      selectedType === "radio" ||
      selectedType === "dropdown" ||
      selectedType === "checkbox"
    ) {
      element.content = {
        choices: [
Jiwon Yoon's avatar
Jiwon Yoon committed
66
67
68
          { text: "", value: 0 },
          { text: "", value: 1 },
          { text: "", value: 2 },
Jiwon Yoon's avatar
Jiwon Yoon committed
69
70
71
72
73
74
        ],
      };
    } else if (selectedType === "essay") {
      element.content = { choices: [] };
    } else if (selectedType === "rating") {
      element.content = {
Jiwon Yoon's avatar
Jiwon Yoon committed
75
76
        minRateDescription: "",
        maxRateDescription: "",
Jiwon Yoon's avatar
Jiwon Yoon committed
77
        choices: [
Jiwon Yoon's avatar
Jiwon Yoon committed
78
79
80
          { text: "", value: 0 },
          { text: "", value: 1 },
          { text: "", value: 2 },
Jiwon Yoon's avatar
Jiwon Yoon committed
81
82
83
84
85
86
87
88
89
90
91
92
        ],
      };
    }
    element.type = selectedType;
    handleQuestion(element._id);
  }

  function handleQuestionInfo(event: React.ChangeEvent<HTMLInputElement>) {
    const { name, value } = event.currentTarget;
    element[name] = value;
    handleQuestion(element._id);
  }
93

Jiwon Yoon's avatar
Jiwon Yoon committed
94
95
  function handleDelete() {
    deleteQuestion(element._id);
96
97
98
99
100
  }

  function getContent(element: BasicQuestionType) {
    switch (element.type) {
      case "essay":
Jiwon Yoon's avatar
Jiwon Yoon committed
101
        return <EssayForm element={element} currentId={currentId} />;
102
      case "radio":
Jiwon Yoon's avatar
Jiwon Yoon committed
103
104
105
106
107
108
109
        return (
          <RadioForm
            handleQuestion={handleQuestion}
            element={element}
            currentId={currentId}
          />
        );
110
      case "checkbox":
Jiwon Yoon's avatar
Jiwon Yoon committed
111
        return (
Jiwon Yoon's avatar
Jiwon Yoon committed
112
113
114
115
116
          <CheckboxForm
            handleQuestion={handleQuestion}
            element={element}
            currentId={currentId}
          />
Jiwon Yoon's avatar
Jiwon Yoon committed
117
        );
118
      case "dropdown":
Jiwon Yoon's avatar
Jiwon Yoon committed
119
        return (
Jiwon Yoon's avatar
Jiwon Yoon committed
120
121
122
123
124
          <DropdownForm
            handleQuestion={handleQuestion}
            element={element}
            currentId={currentId}
          />
Jiwon Yoon's avatar
Jiwon Yoon committed
125
        );
126
      case "file":
Jiwon Yoon's avatar
Jiwon Yoon committed
127
        return <FileForm element={element} currentId={currentId} />;
128
      case "rating":
Jiwon Yoon's avatar
Jiwon Yoon committed
129
130
131
132
133
134
135
        return (
          <RatingForm
            handleQuestion={handleQuestion}
            element={element}
            currentId={currentId}
          />
        );
136
137
138
139
140
141
142
143
144
145
146
147
148
      default:
        return <></>;
    }
  }

  return (
    <div className="flex flex-col container w-4/5 h-auto border-2 border-themeColor items-center m-3 py-2">
      <div className="flex h-16 w-full place-content-between items-center">
        <input
          type="text"
          name="title"
          id={element._id}
          className="text-xl font-bold ml-6 border-b-2 w-1/2"
Jiwon Yoon's avatar
Jiwon Yoon committed
149
150
151
          placeholder={"Question Title"}
          value={element.title}
          onChange={handleQuestionInfo}
Jiwon Yoon's avatar
Jiwon Yoon committed
152
          disabled={currentId !== element._id}
153
154
        ></input>
        <select
Jiwon Yoon's avatar
Jiwon Yoon committed
155
          id={element._id}
156
          name="type"
Jiwon Yoon's avatar
Jiwon Yoon committed
157
          onChange={handleSelect}
158
159
          className="w-36 bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-themeColor w-full mr-3 p-2.5"
        >
Jiwon Yoon's avatar
Jiwon Yoon committed
160
161
162
163
164
165
166
167
          {Array.from(typeDropDown.entries()).map(([key, value]) => (
            <option
              id={element._id}
              value={key}
              selected={key === element.type}
            >
              {value}
            </option>
168
169
170
171
172
173
174
175
176
177
          ))}
        </select>
      </div>
      <div className="flex w-full justify-center">
        <input
          type="text"
          name="comment"
          id={element._id}
          className="border w-11/12"
          placeholder="질문에 대한 설명을 입력해주세요"
Jiwon Yoon's avatar
Jiwon Yoon committed
178
179
          value={element.comment}
          onChange={handleQuestionInfo}
Jiwon Yoon's avatar
Jiwon Yoon committed
180
          disabled={currentId !== element._id}
181
182
183
184
        ></input>
      </div>
      {getContent(element)}

Jiwon Yoon's avatar
Jiwon Yoon committed
185
186
187
188
189
190
191
192
193
194
      <div className="place-self-end py-2">
        <button type="button" className="px-1">
          필수
        </button>
        <button type="button" className="px-1">
          옵션
        </button>
        <button type="button" className="px-1" onClick={handleDelete}>
          삭제
        </button>
Jiwon Yoon's avatar
Jiwon Yoon committed
195
        {currentId === element._id ? (
Jiwon Yoon's avatar
Jiwon Yoon committed
196
          <button type="button" className="px-1" onClick={handleEditComplete}>
Jiwon Yoon's avatar
Jiwon Yoon committed
197
198
199
            수정완료
          </button>
        ) : (
Jiwon Yoon's avatar
Jiwon Yoon committed
200
          <button type="button" className="px-1" onClick={handleEditClick}>
Jiwon Yoon's avatar
Jiwon Yoon committed
201
202
203
            수정하기
          </button>
        )}
204
205
206
207
      </div>
    </div>
  );
};