SurveysLayout.tsx 2.53 KB
Newer Older
1
2
3
4
import React, { useEffect, useState } from "react";
import { Outlet, useOutletContext } from "react-router-dom";
import { surveyApi } from "../apis";
import { catchErrors } from "../helpers";
5
import type { ICreateSurvey, ISurvey } from "../types";
6
7
8
9

type SurveysContextType = {
  error: string;
  loading: boolean;
10
  surveys: ICreateSurvey[];
11
12
  create: () => Promise<any>;
  remove: (id: string) => Promise<any>;
13
  update: (survey: ICreateSurvey) => Promise<any>;
14
15
16
17
18
};

export const SurveysLayout = () => {
  const [error, setError] = useState("");
  const [loading, setLoading] = useState(false);
19
  const [surveys, setSurveys] = useState<ICreateSurvey[]>([]);
20
21
22

  useEffect(() => {
    const getSurveys = async () => {
23
      const surveys: ICreateSurvey[] = await surveyApi.getSurveys();
24
25
26
27
28
29
30
      // console.log(surveys);
      setSurveys(surveys);
    };
    getSurveys();
  }, []);

  const create = async (surveyData: ISurvey) => {
31
    const result: ICreateSurvey = await surveyApi.createSurvey(surveyData);
32
33
34
35
    setSurveys([result, ...surveys]);
    return result;
  };

36
37
38
39
40
41
42
43
44
45
46
  /**
   * 수정된 설문 객체를 적용한 새로운 설문 배열 생성하여 리랜더링
   * @param surveyData 바꾸려는 설문 객체
   */
  const update = async (surveyData: ICreateSurvey) => {
    // const result = await surveyApi.updateSurvey(surveyData);
    // const index = surveys.findIndex((survey) => survey._id === result._id);
    // surveys[index] = result;
    const index = surveys.findIndex((survey) => survey._id === surveyData._id);
    surveys[index] = surveyData;
    console.log("update in surveys layout layout:", surveyData);
47
    setSurveys([...surveys]);
48
    // return result;
49
50
51
52
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
79
80
81
82
83
84
  };

  /**
   * 설문 삭제
   * @param id survey id
   */
  const remove = async (id: string) => {
    if (window.confirm("해당 설문조사를 삭제하시겠습니까?")) {
      try {
        setLoading(true);
        const result = await surveyApi.deleteSurvey(id);
        console.log("deleted survey", result);
        setError("");
        const items = surveys.filter((survey) => survey._id !== result._id);
        // console.log("items left:", newItems);
        setSurveys(items);
        alert("삭제되었습니다.");
      } catch (error) {
        console.log("에러발생");
        catchErrors(error, setError);
      } finally {
        setLoading(false);
      }
    }
  };

  return (
    <>
      <Outlet context={{ error, loading, surveys, create, remove, update }} />
    </>
  );
};

export const useSurveys = () => {
  return useOutletContext<SurveysContextType>();
};