Recent Posts
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
관리 메뉴

개발자 박가나

[241126 TIL] 본캠프 40일차 ('MBTI' 프로젝트 기능 구현) 본문

내일배움캠프

[241126 TIL] 본캠프 40일차 ('MBTI' 프로젝트 기능 구현)

gnchoco97 2024. 11. 26. 20:31

MBTI 테스트 결과 데이터 저장을 위해서 json-server를 사용하였다.

 

테스트 결과 저장

/* src/api/TestResult.js */

import axios from 'axios';

const BASE_URL = 'http://localhost:5000/testResults';

export const createTestResult = async (data) => {
    try {
        await axios.post(BASE_URL, data);
    } catch (e) {
        return { error: e };
    }
};
/* src/pages/Test.jsx */

import { useForm } from '../hooks/useForm';
import { calculateMBTI } from '../utils/calculateMBTI';
import { createTestResult } from '../api/TestResult';
import { fetchUser } from '../api/Auth';
import { formatDate } from '../utils/formatDate';

export default function Test() {
    const token = localStorage.getItem('accessToken');

    const { values, handleSelect, handleReset } = useForm(
        Array(questions.length).fill({ type: '', answer: '', value: '' })
    );

    const handleSubmit = async (e) => {
        e.preventDefault();

        const { data } = await fetchUser(token);

        await createTestResult({
            created_at: formatDate(),
            user: data,
            result: calculateMBTI(values),
            isVisibility: true
        });
    };
}

 

 

테스트 결과 삭제

/* src/api/TestResult.js */

import axios from 'axios';

const BASE_URL = 'http://localhost:5000/testResults';

export const getTestResults = async () => {
    try {
        const response = await axios.get(BASE_URL);

        return { data: response.data };
    } catch (e) {
        return { error: e };
    }
};

export const deleteTestResult = async (id) => {
    try {
        await axios.delete(`${BASE_URL}/${id}`);
    } catch (e) {
        return { error: e };
    }
};
/* src/pages/Result.jsx */

import { useState } from 'react';
import { deleteTestResult, getTestResults } from '../api/TestResult';
import { useAuth } from '../contexts/AuthContext';

export default function Result() {
    const [results, setResults] = useState([]);

    const { user } = useAuth();

    const fetchResults = async () => {
        const { data } = await getTestResults();

        const filterData = data.filter((item) => item.user.id === user?.id || item.isVisibility);
        setResults(filterData);
    };

    const handleDelete = async (id) => {
        await deleteTestResult(id);
        fetchResults();
    };
}

 

 

테스트 결과 공개 여부 변경

/* src/api/TestResult.js */

import axios from 'axios';

const BASE_URL = 'http://localhost:5000/testResults';

export const getTestResults = async () => {
    try {
        const response = await axios.get(BASE_URL);

        return { data: response.data };
    } catch (e) {
        return { error: e };
    }
};

export const updateTestResultVisibility = async (id, visibility) => {
    try {
        await axios.patch(`${BASE_URL}/${id}`, { isVisibility: visibility });
    } catch (e) {
        return { error: e };
    }
};
/* src/pages/Result.jsx */

import { useState } from 'react';
import { deleteTestResult, getTestResults } from '../api/TestResult';
import { useAuth } from '../contexts/AuthContext';

export default function Result() {
    const [results, setResults] = useState([]);

    const { user } = useAuth();

    const fetchResults = async () => {
        const { data } = await getTestResults();

        const filterData = data.filter((item) => item.user.id === user?.id || item.isVisibility);
        setResults(filterData);
    };

	const handleUpdateVisibility = async (id, visibility) => {
        await updateTestResultVisibility(id, visibility);
        fetchResults();
    };
}