diff --git a/app/api/service/diary.tsx b/app/api/service/diary.tsx index 91c404b..add0c4b 100644 --- a/app/api/service/diary.tsx +++ b/app/api/service/diary.tsx @@ -1,5 +1,6 @@ import axios from "axios"; import { GET } from "../refresh_token/route"; +import { axiosInstance } from "../../lib/api"; /* @@ -31,9 +32,9 @@ export const getDiaryList = async (page: number, pageSize: number) => { }; // [get] 유저의 특정 다이어리 조회 -export const getDiary = async (diaryId: number) => { +export const getDiary = async (diaryId: string) => { try { - const response = await axios({ + const response = await axiosInstance({ method: "GET", url: `/api/diary/${diaryId}`, }); @@ -74,10 +75,10 @@ export const postDiary = async ( // [patch] 일기 수정하기 export const patchDiary = async ( - diaryId: number, + diaryId: string, title: string, content: string, - isShare: string + isShare: boolean ) => { try { // 요청 : title / content / isShare diff --git a/app/community/page.tsx b/app/community/page.tsx index 8e1a489..00119ac 100644 --- a/app/community/page.tsx +++ b/app/community/page.tsx @@ -1,109 +1,113 @@ -'use client'; +"use client"; -import React, { useEffect, useState } from 'react'; -import styles from './community.module.css'; -import HallOfFame from '../components/HallOfFame/HallOfFame'; -import BasicPagination from '../components/BasicPagination'; -import Diary, { DiaryProps } from '../components/Diary/Diary'; -import Search from '../components/Search/Search'; -import { useAxios } from '../hooks/useAxios'; -import { useRouter } from 'next/router'; -import { getSearchDiary } from '../api/service/search'; +import React, { useEffect, useState } from "react"; +import styles from "./community.module.css"; +import HallOfFame from "../components/HallOfFame/HallOfFame"; +import BasicPagination from "../components/BasicPagination"; +import Diary, { DiaryProps } from "../components/Diary/Diary"; +import Search from "../components/Search/Search"; +import { useAxios } from "../hooks/useAxios"; +import { useRouter } from "next/router"; +import { getSearchDiary } from "../api/service/search"; export interface Data { - total: number; - diaries: DiaryType[]; + total: number; + diaries: DiaryType[]; } interface Like { - id: string; - memberId: string; - diaryId: string; + id: string; + memberId: string; + diaryId: string; } export interface DiaryType { - id: string; - title: string; - likes: number; - updated_At: string; - isShare: boolean; - contents: string; - like: Like[]; - writerName: string; - writerId: number; - writerPicture: string; + id: string; + title: string; + likes: number; + updated_At: string; + isShare: boolean; + contents: string; + like: Like[]; + writerName: string; + writerId: number; + writerPicture: string; } function CommunityPage() { - const [page, setPage] = useState(1); // 현재 페이지 - const [totalPages, setTotalPages] = useState(0); // 총 데이터 수 - const [data, setData] = useState(null); - const [searchKeyword, setSearchKeyword] = useState(''); // 자식에게 받을 검색어 + const [page, setPage] = useState(1); // 현재 페이지 + const [totalPages, setTotalPages] = useState(0); // 총 데이터 수 + const [data, setData] = useState(null); + const [searchKeyword, setSearchKeyword] = useState(""); // 자식에게 받을 검색어 - // 페이지 업데이트 - const handleChangePage = ( - event: React.ChangeEvent, - value: number - ) => { - setPage(value); // 페이지 변경 시 현재 페이지 상태 업데이트 - }; + // 페이지 업데이트 + const handleChangePage = ( + event: React.ChangeEvent, + value: number + ) => { + setPage(value); // 페이지 변경 시 현재 페이지 상태 업데이트 + }; - // 검색바 -> 검색어 업데이트 - const handleSearchKeyword = (result: string) => { - setSearchKeyword(result); - console.log(result); - }; + // 검색바 -> 검색어 업데이트 + const handleSearchKeyword = (result: string) => { + setSearchKeyword(result); + setPage(1); + console.log(result); + }; - // [api] 꿈 일기 목록 get 요청 - useEffect(() => { - (async () => { - try { - const data = await getSearchDiary(searchKeyword, page); - setData(data); - console.log(data.diaries); - } catch (error) { - console.error('다이어리 목록을 불러오는 데 실패했습니다.', error); - } - })(); - }, [page, searchKeyword]); // 페이지 번호가 변경될 때마다 리렌더링 + // [api] 꿈 일기 목록 get 요청 + useEffect(() => { + (async () => { + try { + const data = await getSearchDiary(searchKeyword, page); + setData(data); + console.log(data.diaries); + } catch (error) { + console.error( + "다이어리 목록을 불러오는 데 실패했습니다.", + error + ); + } + })(); + }, [page, searchKeyword]); // 페이지 번호가 변경될 때마다 리렌더링 - console.log(data); - return ( -
-
- -
-
-

꿈 게시글 검색

- -
-
- {data?.diaries && data.diaries.length > 0 ? ( - data.diaries.map((d) => ( - - )) - ) : ( -

등록된 일기가 없습니다.

- )} -
-
- -
-
- ); + console.log(data); + return ( +
+
+ +
+
+

꿈 게시글 검색

+ +
+
+ {data?.diaries && data.diaries.length > 0 ? ( + data.diaries.map((d) => ( + + )) + ) : ( +

등록된 일기가 없습니다.

+ )} +
+
+ +
+
+ ); } export default CommunityPage; diff --git a/app/dictionary/page.tsx b/app/dictionary/page.tsx index b008aac..802daa0 100644 --- a/app/dictionary/page.tsx +++ b/app/dictionary/page.tsx @@ -1,143 +1,153 @@ -'use client'; +"use client"; -import React, { useEffect, useState } from 'react'; -import styles from './dictionary.module.css'; -import Search from '../components/Search/Search'; -import BasicPagination from '../components/BasicPagination'; -import page from '../page'; -import Dream from '../components/Dream/Dream'; -import { getSearchDictionary } from '../api/service/search'; -import { getDictionary } from '../api/service/dictionary'; +import React, { useEffect, useState } from "react"; +import styles from "./dictionary.module.css"; +import Search from "../components/Search/Search"; +import BasicPagination from "../components/BasicPagination"; +import page from "../page"; +import Dream from "../components/Dream/Dream"; +import { getSearchDictionary } from "../api/service/search"; +import { getDictionary } from "../api/service/dictionary"; interface Dictionary { - id: string; - category: string; - title: string; - contents: string; + id: string; + category: string; + title: string; + contents: string; } interface Response { - total: number; - dictionaries: Dictionary[]; + total: number; + dictionaries: Dictionary[]; } function DiaryPage() { - const [page, setPage] = useState(1); // 현재 페이지 - const [totalPages, setTotalPages] = useState(0); // 총 데이터 수 - const [data, setData] = useState(null); - const [searchKeyword, setSearchKeyword] = useState(''); // 자식에게 받을 검색어 - const [category, setCategory] = useState(''); // 카테고리 선택 + const [page, setPage] = useState(1); // 현재 페이지 + const [totalPages, setTotalPages] = useState(0); // 총 데이터 수 + const [data, setData] = useState(null); + const [searchKeyword, setSearchKeyword] = useState(""); // 자식에게 받을 검색어 + const [category, setCategory] = useState(""); // 카테고리 선택 - const handleChangePage = ( - event: React.ChangeEvent, - value: number - ) => { - setPage(value); // 페이지 변경 시 현재 페이지 상태 업데이트 - }; + const handleChangePage = ( + event: React.ChangeEvent, + value: number + ) => { + setPage(value); // 페이지 변경 시 현재 페이지 상태 업데이트 + }; - // 검색바 -> 검색어 업데이트 - const handleSearchKeyword = (result: string) => { - setSearchKeyword(result); - console.log(result); - }; + // 검색바 -> 검색어 업데이트 + const handleSearchKeyword = (result: string) => { + setSearchKeyword(result); + setPage(1); + console.log(result); + }; - // 카테고리 선택 - const handleCategoryClick = (event: React.MouseEvent) => { - const target = event.target as HTMLElement; - setCategory(target.dataset.key); - }; + // 카테고리 선택 + const handleCategoryClick = (event: React.MouseEvent) => { + const target = event.target as HTMLElement; + setCategory(target.dataset.key); + }; - // [api] 꿈 해몽 카테고리별 조회 - useEffect(() => { - (async () => { - try { - if (category !== undefined) { - const data = await getDictionary(category, page); - setData(data); - console.log(data); - } - } catch (error) { - console.error('다이어리 목록을 불러오는 데 실패했습니다.', error); - } - })(); - }, [page, category]); // 페이지 번호가 변경될 때마다 리렌더링 + // [api] 꿈 해몽 카테고리별 조회 + useEffect(() => { + (async () => { + try { + if (category !== undefined) { + const data = await getDictionary(category, page); + setData(data); + console.log(data); + } + } catch (error) { + console.error( + "다이어리 목록을 불러오는 데 실패했습니다.", + error + ); + } + })(); + }, [page, category]); // 페이지 번호가 변경될 때마다 리렌더링 - // [api] 꿈 일기 목록 get 요청 - useEffect(() => { - (async () => { - try { - const data = await getSearchDictionary(searchKeyword, page, 10); - setData(data); - console.log(data); - } catch (error) { - console.error('다이어리 목록을 불러오는 데 실패했습니다.', error); - } - })(); - }, [page, searchKeyword]); // 페이지 번호가 변경될 때마다 리렌더링 + // [api] 꿈 일기 목록 get 요청 + useEffect(() => { + (async () => { + try { + const data = await getSearchDictionary(searchKeyword, page, 10); + setData(data); + console.log(data); + } catch (error) { + console.error( + "다이어리 목록을 불러오는 데 실패했습니다.", + error + ); + } + })(); + }, [page, searchKeyword]); // 페이지 번호가 변경될 때마다 리렌더링 - return ( -
-
-
-

꿈 해몽 사전

- -
-

- 자연 -

-

- 인물 -

-

- 식물 -

-

- 동물 -

-

- 신체 -

-

- 물건 -

-

- 장소 -

-

- 행동 -

-

- 기타 -

-
-
-
+ return ( +
+
+
+

꿈 해몽 사전

+ +
+

+ 자연 +

+

+ 인물 +

+

+ 식물 +

+

+ 동물 +

+

+ 신체 +

+

+ 물건 +

+

+ 장소 +

+

+ 행동 +

+

+ 기타 +

+
+
+
-
- {data?.dictionaries && data.dictionaries.length > 0 ? ( - data.dictionaries.map((d) => ( - - )) - ) : ( -

등록된 꿈 해몽이 없습니다.

- )} -
+
+ {data?.dictionaries && data.dictionaries.length > 0 ? ( + data.dictionaries.map((d) => ( + + )) + ) : ( +

등록된 꿈 해몽이 없습니다.

+ )} +
- {/* 페이지네이션 */} -
- -
-
- ); + {/* 페이지네이션 */} +
+ +
+
+ ); } export default DiaryPage; diff --git a/app/lotto/page.tsx b/app/lotto/page.tsx index 0cfc4e7..25fa0f4 100644 --- a/app/lotto/page.tsx +++ b/app/lotto/page.tsx @@ -14,10 +14,111 @@ function LottoPage() { // 애니메이션 활성화 상태 const [isAnimating, setIsAnimating] = useState(false); - // 버튼 클릭 이벤트 핸들러 - const handlePlayButtonClick = useCallback(() => { - const isConfirmed = window.confirm( - '300 포인트를 사용하여 로또 번호를 추천 받으시겠습니까?' + // 버튼 클릭 이벤트 핸들러 + const handlePlayButtonClick = useCallback(() => { + const isConfirmed = window.confirm( + "300 포인트를 사용하여 로또 번호를 추천 받으시겠습니까?" + ); + + if (isConfirmed) { + setIsAnimating(true); + + // [api] 랜덤 로또 번호 get (애니메이션으로 살짝 딜레이) + setTimeout(() => { + (async () => { + try { + const data = await getLotto(); + setLotto(data); + console.log(data); + } catch (error) { + console.error( + "로또 추천 번호를 불러오는 데 실패했습니다.", + error + ); + } + })(); + }, 2500); + + // 3초 후 다시 false + setTimeout(() => { + setIsAnimating(false); + }, 3000); + } + }, []); + + // [api] 로그인한 유저 정보 get 요청 + useEffect(() => { + (async () => { + try { + const data = await getUser(); + setUser(data.user); + } catch (error) { + console.error("유저 정보를 불러오는 데 실패했습니다.", error); + } + })(); + // 포인트 차감 후 리렌더링 + }, [lotto]); + + // 로또 번호 7개 추천 + const generateLottoNumbers = () => { + const numbers = new Set(); + while (numbers.size < 7) { + const number = Math.floor(Math.random() * 45) + 1; // 1부터 45까지의 랜덤 숫자 + numbers.add(number); + } + return Array.from(numbers); + }; + + return ( +
+
+

로또 번호 추천

+

+ 꿈 일기로 포인트를 모아 로또 번호를 추천 받아보세요. +
+ 분명 좋은 일이 생길거예요! (1회 : 100 포인트) +

+
+ +
+

{user.name} 님

+

+

{user.point} p

+

+
+ +
+
+

{lotto ? lotto[0] : "?"}

+
+
+

{lotto ? lotto[1] : "?"}

+
+
+

{lotto ? lotto[2] : "?"}

+
+
+

{lotto ? lotto[3] : "?"}

+
+
+

{lotto ? lotto[4] : "?"}

+
+
+

{lotto ? lotto[5] : "?"}

+
+
+

{lotto ? lotto[6] : "?"}

+
+
+ +
+ 추첨하기 +
+
); if (isConfirmed) { diff --git a/app/post/[id]/page.tsx b/app/post/[id]/page.tsx new file mode 100644 index 0000000..3937f43 --- /dev/null +++ b/app/post/[id]/page.tsx @@ -0,0 +1,133 @@ +"use client"; + +import React, { useState, useEffect } from "react"; +import styles from "../post.module.css"; +import { usePathname, useRouter } from "next/navigation"; +import { getDiary, patchDiary } from "../../api/service/diary"; +import { useAxios } from "../../hooks/useAxios"; +import { ReadProps } from "../../read/[id]/page"; + +interface InputData { + title: string; + contents: string; + isShare: boolean; + // date: string; +} + +function PostPage() { + const router = useRouter(); + const diaryId = usePathname().slice(5); + const [today, setToday] = useState(); + const [inputData, setInputData] = useState({ + title: "", + contents: "", + isShare: false, + }); + const [data, setData] = useState({}); + + // input 데이터 갱신 + const handleInputChange = ( + event: React.ChangeEvent< + HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement + > + ) => { + const { name, value } = event.target; + setInputData((prevInputData) => ({ + ...prevInputData, + [name]: value, + })); + }; + + // 저장 + const handleSubmit = async (event: any) => { + console.log(inputData); + let boolean_share = false; + if (inputData.isShare) boolean_share = true; + // [api] post 요청 + await patchDiary( + diaryId, + inputData.title, + inputData.contents, + boolean_share + ); + // 바로 전 화면으로 이동 + router.back(); + }; + + // [api] 글 불러오기 + useEffect(() => { + (async () => { + try { + const data = await getDiary(diaryId); + setInputData(data); + console.log(data); + } catch (error) { + console.error( + "다이어리 목록을 불러오는 데 실패했습니다.", + error + ); + } + })(); + }, []); + + console.log(data); + + return ( +
+
+

오늘의 꿈 일기

+ +
+
+
+ {/* 입력 1 : 공개 범위 */} + {inputData.isShare ? ( + <> + + + ) : null} + + {/* 입력 2 : 날짜 */} +

{inputData.updated_At}

+
+ +
+ {/* 입력 3 : 제목 */} + + + {/* 입력 4 : 본문 */} + +
+
+
+ ); +} + +export default PostPage; diff --git a/app/read/[id]/page.tsx b/app/read/[id]/page.tsx index 13fb025..7505059 100644 --- a/app/read/[id]/page.tsx +++ b/app/read/[id]/page.tsx @@ -120,10 +120,10 @@ function ReadPage() { } }; - if (data) { - checkOwner(); // data가 있을 때만 checkOwner 함수를 호출합니다. - } - }, [data]); // 의존성 배열에 data를 추가하여, data가 변경될 때마다 이 useEffect가 실행되도록 합니다. + // [api] 글 수정 + const handlePostPatch = (event: React.MouseEvent) => { + router.push(`/post/${data?.id}`); + }; return (