posting.tsx 7.24 KB
Newer Older
1
import React, { FormEvent, useState } from "react";
Lee Soobeom's avatar
Lee Soobeom committed
2
import { useNavigate } from "react-router-dom";
3
4
5
import isLength from "validator/lib/isLength";
import equals from "validator/lib/equals";
import { catchErrors } from "../helpers";
Lee Soobeom's avatar
Lee Soobeom committed
6
import { PostType } from "../types";
7
import { postApi } from "../apis";
Lee Soobeom's avatar
Lee Soobeom committed
8
import { File } from "formidable";
Kim, MinGyu's avatar
Kim, MinGyu committed
9

10
11
12
13
14
export default function Posting() {
  const [city, setCity] = useState<string>("질문종류");
  const [theme, setTheme] = useState<string>("질문종류");
  const [title, setTitle] = useState<string>("");
  const [text, setText] = useState<string>("");
Lee Soobeom's avatar
Lee Soobeom committed
15
16
  const [file, setFile] = useState<File>();
  const [imgSrc, setImgSrc] = useState<string[]>();
Lee Soobeom's avatar
Lee Soobeom committed
17
  const navigate = useNavigate();
Kim, MinGyu's avatar
Kim, MinGyu committed
18

Lee Soobeom's avatar
Lee Soobeom committed
19
  const [user, setUser] = useState<PostType>({
20
21
22
23
    title: "",
    text: "",
    theme: "",
    city: "",
Lee Soobeom's avatar
Lee Soobeom committed
24
25
    date: "",
    user: "",
Lee Soobeom's avatar
Lee Soobeom committed
26
    counts: 0,
Lee Soobeom's avatar
Lee Soobeom committed
27
    _id: "",
28
  });
Kim, MinGyu's avatar
Kim, MinGyu committed
29

Lee Soobeom's avatar
Lee Soobeom committed
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
  const imgArr = new Array();

  const img2Url = (fileBlob: Blob) => {
    const reader = new FileReader();
    reader.readAsDataURL(fileBlob);

    reader.onload = (data) => {
      if (typeof data.target?.result === "string") {
        console.log(data.target?.result);
        imgArr.push(data.target?.result);
        // setImgSrc(data.target?.result);
      }
    };
  };

45
46
47
48
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState("");
  const [disabled, setDisabled] = useState(false);
  const [success, setSuccess] = useState(false);
Kim, MinGyu's avatar
Kim, MinGyu committed
49

50
  async function handlePostSubmit(event: FormEvent) {
Lee Soobeom's avatar
Lee Soobeom committed
51
52
    event.preventDefault();

53
54
55
56
57
58
    try {
      setError("");
      console.log("user data", user);
      if (postingFormMatch()) {
        setLoading(true);
        const res = await postApi.posting(user);
Lee Soobeom's avatar
Lee Soobeom committed
59
        console.log("서버연결됬나요", res);
Lee Soobeom's avatar
Lee Soobeom committed
60
61
        // console.log("user save");
        navigate("/board", { replace: true });
62
63
64
65
66
67
68
69
70
        setSuccess(true);
        setError("");
      }
    } catch (error) {
      console.log("에러발생");
      catchErrors(error, setError);
    } finally {
      setLoading(false);
    }
Kim, MinGyu's avatar
Kim, MinGyu committed
71
72
  }

73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
  function postingFormMatch() {
    if (!isLength(user.title ?? "", { min: 1 })) {
      setError("제목을 입력해 주세요.");
      return false;
    } else if (!isLength(user.text ?? "", { min: 1 })) {
      setError("내용을 입력해 주세요.");
      return false;
    } else if (equals(city, "질문종류")) {
      setError("테마를 선택해 주세요.");
      return false;
    } else if (equals(theme, "질문종류")) {
      setError("도시를 선택해 주세요.");
      return false;
    } else {
      return true;
    }
Kim, MinGyu's avatar
Kim, MinGyu committed
89
90
  }

91
92
93
94
95
96
97
  const titleChange = (event: React.ChangeEvent<HTMLTextAreaElement>) => {
    const title = event.currentTarget.value;
    const newUser = { ...user, title: title };
    console.log(event.currentTarget.value);
    setTitle(event.currentTarget.value);
    setUser(newUser);
  };
Kim, MinGyu's avatar
Kim, MinGyu committed
98

99
100
101
102
103
104
105
  const textChange = (event: React.ChangeEvent<HTMLTextAreaElement>) => {
    const text = event.currentTarget.value;
    const newUser = { ...user, text: text };
    console.log(event.currentTarget.value);
    setText(event.currentTarget.value);
    setUser(newUser);
  };
Kim, MinGyu's avatar
Kim, MinGyu committed
106

107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
  const cityChange = (event: React.ChangeEvent<HTMLSelectElement>) => {
    const city = event.currentTarget.value;
    const newUser = { ...user, city: city };
    console.log(event.currentTarget.value);
    setCity(event.currentTarget.value);
    setUser(newUser);
  };

  const themeChange = (event: React.ChangeEvent<HTMLSelectElement>) => {
    const theme = event.currentTarget.value;
    const newUser = { ...user, theme: theme };
    console.log(event.currentTarget.value);
    setTheme(event.currentTarget.value);
    setUser(newUser);
  };
Lee Soobeom's avatar
Lee Soobeom committed
122

Lee Soobeom's avatar
Lee Soobeom committed
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
  const handleInputPic = (event: React.ChangeEvent<HTMLInputElement>) => {
    // const fileArr = new FileList;
    const maxImg = 5;
    const fileArr = event.target.files;
    if (!(fileArr?.length === undefined)) {
      if (!(fileArr?.length > maxImg)) {
        for (var i = 0; i < maxImg; i++) {
          // setFile(file);
          console.log(fileArr[i]);
          img2Url(fileArr[i]);
        }
        setImgSrc(imgArr);
      } else {
        alert("사진은 최대 5장까지 업로드 가능합니다!");
      }
    }
  };

Kim, MinGyu's avatar
Kim, MinGyu committed
141
  return (
Lee Soobeom's avatar
Lee Soobeom committed
142
    <div className="flex flex-col border-3 ">
143
      <form onSubmit={handlePostSubmit} className="w-full items-center">
Kim, MinGyu's avatar
Kim, MinGyu committed
144
145
        <div className="flex flex-row relative">
          <p className="basis-1/12 gap-x-8">Id</p>
Lee Soobeom's avatar
Lee Soobeom committed
146
147
148
149
          <p className="basis-6/12 invisible">empty</p>
          <div className="basis-2/12 border-2 border-sky-300">
            <input type="file" multiple onChange={handleInputPic}></input>
          </div>
150
151
152
          <select
            name="city"
            id="Questions"
Lee Soobeom's avatar
Lee Soobeom committed
153
            className="border-2 border-sky-300 w-1/12"
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
            onChange={cityChange}
            defaultValue="질문종류"
          >
            <option value="질문종류">도시</option>
            <option value="Seoul">서울</option>
            <option value="Busan">부산</option>
            <option value="Incheon">인천</option>
            <option value="Daegoo">대구</option>
            <option value="Kwangjoo">광주</option>
            <option value="Daejeon">대전</option>
            <option value="Woolsan">울산</option>
            <option value="Sejong">세종</option>
            <option value="Dokdo">독도</option>
            <option value="Jeju">제주</option>
          </select>
          <select
            name="theme"
            id="Questions"
Lee Soobeom's avatar
Lee Soobeom committed
172
            className="border-2 border-sky-300 w-1/12"
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
            onChange={themeChange}
            defaultValue="질문종류"
          >
            <option value="질문종류">테마</option>
            <option value="cycling">사이클링</option>
            <option value="surfing">서핑</option>
            <option value="activity">액티비티</option>
            <option value="camping">캠핑</option>
            <option value="sking">스키</option>
            <option value="boat">보트</option>
            <option value="desert">사막</option>
            <option value="golf">골프</option>
            <option value="cave">동굴</option>
            <option value="history">문화재</option>
            <option value="zoo">동물원</option>
            <option value="cycling">사이클링</option>
          </select>
Kim, MinGyu's avatar
Kim, MinGyu committed
190
191
192

          <button
            type="submit"
Lee Soobeom's avatar
Lee Soobeom committed
193
            className="border-2 border-sky-300 basis-1/12 gap-x-8"
Kim, MinGyu's avatar
Kim, MinGyu committed
194
195
196
197
198
          >
            글쓰기
          </button>
        </div>

Lee Soobeom's avatar
Lee Soobeom committed
199
        <div className="flex">
Kim, MinGyu's avatar
Kim, MinGyu committed
200
          <textarea
201
202
            name="title"
            onChange={titleChange}
Kim, MinGyu's avatar
Kim, MinGyu committed
203
            placeholder="title"
Lee Soobeom's avatar
Lee Soobeom committed
204
            className="w-full h-8 border-2 border-sky-300"
Kim, MinGyu's avatar
Kim, MinGyu committed
205
206
          ></textarea>
        </div>
Lee Soobeom's avatar
Lee Soobeom committed
207
208
209
210
211
212
213
214
215
        <div className="flex flex-col ">
          <div className="flex">
            {/* {imgSrc?.map((img, i) => (
              <div>
                <img key={i} src={img} width={200} height={200} />
              </div>
            ))} */}
            {/* <img src={imgSrc?.[0]} width={200} height={200} /> */}
          </div>
216
217
218
219
          <textarea
            onChange={textChange}
            name="text"
            placeholder="text"
Lee Soobeom's avatar
Lee Soobeom committed
220
            className="w-full h-96 border-2 border-sky-300"
221
          ></textarea>
Lee Soobeom's avatar
Lee Soobeom committed
222
        </div>
Kim, MinGyu's avatar
Kim, MinGyu committed
223
224
225
226
      </form>
    </div>
  );
}