개발자 박가나
[241126 TIL] 본캠프 40일차 ('MBTI' 프로젝트 기능 구현) 본문
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();
};
}
'내일배움캠프' 카테고리의 다른 글
[241128 TIL] 본캠프 42일차 (HTTP와 HTTPS) (0) | 2024.11.28 |
---|---|
[241127 TIL] 본캠프 41일차 (TanStack Query 실습) (0) | 2024.11.27 |
[241125 TIL] 본캠프 39일차 ('MBTI' 프로젝트 기능 구현) (0) | 2024.11.25 |
[241122 TIL] 본캠프 38일차 (1) | 2024.11.22 |
[241121 TIL] 본캠프 37일차 (0) | 2024.11.21 |