From 180e798b7d5a59e0600b4f6ce7760c471076892a Mon Sep 17 00:00:00 2001 From: jungmin <148514354+JungMINI-developer@users.noreply.github.com> Date: Thu, 20 Nov 2025 09:40:59 +0900 Subject: [PATCH 01/15] Update README with branch convention details Clarify branch naming convention and merging process. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 992f5a6..2e5551d 100644 --- a/README.md +++ b/README.md @@ -16,11 +16,11 @@ | `rename` | ๐Ÿ”„ ํŒŒ์ผ ๊ฒฝ๋กœ ๋ณ€๊ฒฝ ํ˜น์€ ํŒŒ์ผ ์ด๋ฆ„ ๋ณ€๊ฒฝ | ### ๐Ÿ“Œ Branch ์ปจ๋ฒค์…˜ - - feature/issue-์ด์Šˆ๋ฒˆํ˜ธ - feat -> feature๋กœ ์ž‘์„ฑ - ๋‚˜๋จธ์ง€๋Š” ์ปค๋ฐ‹ ์ปจ๋ฒค์…˜ ์ ์šฉ ex) style/issue-01 +- develop ๋ธŒ๋žœ์น˜์—์„œ ๋ธŒ๋žœ์น˜๋ฅผ ๋”ฐ์„œ ์ž‘์—… ํ›„ ์ถฉ๋ถ„ํžˆ ํ…Œ์ŠคํŠธ ํ•œ ๋’ค main๋ธŒ๋žœ์น˜๋กœ ๋ณ‘ํ•ฉํ•˜์—ฌ ์ถœ์‹œ ### ๐Ÿ“Œ ํด๋”๊ตฌ์กฐ From 0ff894deca8c472ba60f8036c82a958a1ce30377 Mon Sep 17 00:00:00 2001 From: rhdmschdl Date: Tue, 13 Jan 2026 19:32:29 +0900 Subject: [PATCH 02/15] =?UTF-8?q?feat:=20cicd=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/deploy-main.yml | 35 +++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 .github/workflows/deploy-main.yml diff --git a/.github/workflows/deploy-main.yml b/.github/workflows/deploy-main.yml new file mode 100644 index 0000000..8f76782 --- /dev/null +++ b/.github/workflows/deploy-main.yml @@ -0,0 +1,35 @@ +name: git push into another repo to deploy to vercel + +on: + push: + branches: [main] + +jobs: + build: + runs-on: ubuntu-latest + container: pandoc/latex + steps: + - name: Checkout source code + uses: actions/checkout@v3 + + - name: Install mustache + run: apk add ruby && gem install mustache + + - name: Run Build Script + run: sh ./build.sh + + - name: Pushes to another repository + id: push_directory + uses: cpina/github-action-push-to-another-repository@main + env: + API_TOKEN_GITHUB: ${{ secrets.DEOKIVE_KEY }} + with: + source-directory: "output" + destination-github-username: ${{ secrets.DEOKIVE_USERNAME }} + destination-repository-name: ${{ secrets.DEOKIVE_REPOSITORY }} + user-email: ${{ secrets.DEOKIVE_EMAIL }} + commit-message: ${{ github.event.commits[0].message }} + target-branch: main + + - name: Test get variable exported by push-to-another-repository + run: echo $DESTINATION_CLONED_DIRECTORY From 07877073a41480ea54f53ae1c1cb9f4af5ba3f51 Mon Sep 17 00:00:00 2001 From: rhdmschdl Date: Tue, 13 Jan 2026 19:36:27 +0900 Subject: [PATCH 03/15] =?UTF-8?q?feat:=20build.sh=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.sh | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 build.sh diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..56907aa --- /dev/null +++ b/build.sh @@ -0,0 +1,5 @@ +#!/bin/sh +cd ../ +mkdir output +cp -R ./FE/* ./output +cp -R ./output ./FE/ \ No newline at end of file From 058d1c297adae770c6a119400f29124e603b0b2c Mon Sep 17 00:00:00 2001 From: strfunctionk <84651690+strfunctionk@users.noreply.github.com> Date: Tue, 13 Jan 2026 20:00:52 +0900 Subject: [PATCH 04/15] Change deployment branch from main to develop --- .github/workflows/deploy-main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-main.yml b/.github/workflows/deploy-main.yml index 8f76782..691cc33 100644 --- a/.github/workflows/deploy-main.yml +++ b/.github/workflows/deploy-main.yml @@ -2,7 +2,7 @@ name: git push into another repo to deploy to vercel on: push: - branches: [main] + branches: [develop] jobs: build: From a27c4a287a401ea391e64e45dca28b37cd2bd123 Mon Sep 17 00:00:00 2001 From: strfunctionk <84651690+strfunctionk@users.noreply.github.com> Date: Tue, 13 Jan 2026 20:01:34 +0900 Subject: [PATCH 05/15] Update deploy-main.yml --- .github/workflows/deploy-main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-main.yml b/.github/workflows/deploy-main.yml index 691cc33..19afa46 100644 --- a/.github/workflows/deploy-main.yml +++ b/.github/workflows/deploy-main.yml @@ -2,7 +2,7 @@ name: git push into another repo to deploy to vercel on: push: - branches: [develop] + branches: [main, develop] jobs: build: From 3bafd6f78d9a9b9f34400a07c36599318acd028b Mon Sep 17 00:00:00 2001 From: strfunctionk <84651690+strfunctionk@users.noreply.github.com> Date: Tue, 13 Jan 2026 20:02:28 +0900 Subject: [PATCH 06/15] Update deploy-main.yml --- .github/workflows/deploy-main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-main.yml b/.github/workflows/deploy-main.yml index 19afa46..e21c95d 100644 --- a/.github/workflows/deploy-main.yml +++ b/.github/workflows/deploy-main.yml @@ -2,7 +2,7 @@ name: git push into another repo to deploy to vercel on: push: - branches: [main, develop] + branches: [main] jobs: build: @@ -20,7 +20,7 @@ jobs: - name: Pushes to another repository id: push_directory - uses: cpina/github-action-push-to-another-repository@main + uses: cpina/github-action-push-to-another-repository@develop env: API_TOKEN_GITHUB: ${{ secrets.DEOKIVE_KEY }} with: From 0ecb7698d75bcbe3f6c92ad7de331baccca6d98d Mon Sep 17 00:00:00 2001 From: strfunctionk <84651690+strfunctionk@users.noreply.github.com> Date: Tue, 13 Jan 2026 20:02:41 +0900 Subject: [PATCH 07/15] Update deploy-main.yml --- .github/workflows/deploy-main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-main.yml b/.github/workflows/deploy-main.yml index e21c95d..4bc18eb 100644 --- a/.github/workflows/deploy-main.yml +++ b/.github/workflows/deploy-main.yml @@ -29,7 +29,7 @@ jobs: destination-repository-name: ${{ secrets.DEOKIVE_REPOSITORY }} user-email: ${{ secrets.DEOKIVE_EMAIL }} commit-message: ${{ github.event.commits[0].message }} - target-branch: main + target-branch: develop - name: Test get variable exported by push-to-another-repository run: echo $DESTINATION_CLONED_DIRECTORY From 98874b9f7349d86de212039602c925487dfd5490 Mon Sep 17 00:00:00 2001 From: strfunctionk <84651690+strfunctionk@users.noreply.github.com> Date: Tue, 13 Jan 2026 20:03:29 +0900 Subject: [PATCH 08/15] Update deploy-main.yml --- .github/workflows/deploy-main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-main.yml b/.github/workflows/deploy-main.yml index 4bc18eb..8f76782 100644 --- a/.github/workflows/deploy-main.yml +++ b/.github/workflows/deploy-main.yml @@ -20,7 +20,7 @@ jobs: - name: Pushes to another repository id: push_directory - uses: cpina/github-action-push-to-another-repository@develop + uses: cpina/github-action-push-to-another-repository@main env: API_TOKEN_GITHUB: ${{ secrets.DEOKIVE_KEY }} with: @@ -29,7 +29,7 @@ jobs: destination-repository-name: ${{ secrets.DEOKIVE_REPOSITORY }} user-email: ${{ secrets.DEOKIVE_EMAIL }} commit-message: ${{ github.event.commits[0].message }} - target-branch: develop + target-branch: main - name: Test get variable exported by push-to-another-repository run: echo $DESTINATION_CLONED_DIRECTORY From 3c788b59d8d9c5677ff71813fe1238c7f191714c Mon Sep 17 00:00:00 2001 From: strfunctionk <84651690+strfunctionk@users.noreply.github.com> Date: Tue, 13 Jan 2026 20:04:42 +0900 Subject: [PATCH 09/15] Update deploy-main.yml --- .github/workflows/deploy-main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-main.yml b/.github/workflows/deploy-main.yml index 8f76782..8188164 100644 --- a/.github/workflows/deploy-main.yml +++ b/.github/workflows/deploy-main.yml @@ -29,7 +29,7 @@ jobs: destination-repository-name: ${{ secrets.DEOKIVE_REPOSITORY }} user-email: ${{ secrets.DEOKIVE_EMAIL }} commit-message: ${{ github.event.commits[0].message }} - target-branch: main + target-branch: deploy - name: Test get variable exported by push-to-another-repository run: echo $DESTINATION_CLONED_DIRECTORY From 6d28e4efad2926e8c49343a313a417b11a1f1957 Mon Sep 17 00:00:00 2001 From: strfunctionk <84651690+strfunctionk@users.noreply.github.com> Date: Tue, 13 Jan 2026 20:05:31 +0900 Subject: [PATCH 10/15] Update deploy-main.yml --- .github/workflows/deploy-main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-main.yml b/.github/workflows/deploy-main.yml index 8188164..4ffa5f1 100644 --- a/.github/workflows/deploy-main.yml +++ b/.github/workflows/deploy-main.yml @@ -29,7 +29,7 @@ jobs: destination-repository-name: ${{ secrets.DEOKIVE_REPOSITORY }} user-email: ${{ secrets.DEOKIVE_EMAIL }} commit-message: ${{ github.event.commits[0].message }} - target-branch: deploy + target-branch: develop - name: Test get variable exported by push-to-another-repository run: echo $DESTINATION_CLONED_DIRECTORY From cfac4611a228a7245e77ba498c1b62f5f5dc2fe0 Mon Sep 17 00:00:00 2001 From: rhdmschdl Date: Tue, 13 Jan 2026 20:19:24 +0900 Subject: [PATCH 11/15] =?UTF-8?q?feat:=20vercel=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vercel.json | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 vercel.json diff --git a/vercel.json b/vercel.json new file mode 100644 index 0000000..1323cda --- /dev/null +++ b/vercel.json @@ -0,0 +1,8 @@ +{ + "rewrites": [ + { + "source": "/(.*)", + "destination": "/index.html" + } + ] +} From 8e9ffa29fa29ecec541f8b844b58ad0efd2a8643 Mon Sep 17 00:00:00 2001 From: strfunctionk <84651690+strfunctionk@users.noreply.github.com> Date: Fri, 30 Jan 2026 23:32:33 +0900 Subject: [PATCH 12/15] =?UTF-8?q?2=EC=B0=A8=20=EB=B0=B0=ED=8F=AC=20(API=20?= =?UTF-8?q?=EC=97=B0=EA=B2=B0=20=ED=9B=84=20=EB=B0=B0=ED=8F=AC)=20(#85)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: ์ด๋ฉ”์ผ ์ „์†ก api ์—ฐ๊ฒฐ ์™„์„ฑ * Feat: ๋กœ๊ทธ์ธ API ์—ฐ๊ฒฐ ์™„๋ฃŒ * feat: ๋กœ๊ทธ์ธ ์‹œ Zustand๋กœ ์ƒํƒœ ๊ด€๋ฆฌ + router ์„ค์ • * Feat: ๋งˆ์ดํŽ˜์ด์ง€์—์„œ ๋‚ด ์ •๋ณด ๋กœ๊ทธ์ธ ํ•œ ์ด๋ฉ”์ผ๋กœ ๋ฐ”๋€Œ๊ฒŒ ์„ค์ • * Feat: ๋กœ๊ทธ์•„์›ƒ & ํšŒ์›ํƒˆํ‡ด api ์—ฐ๊ฒฐ + MainNavbar ๋กœ๊ทธ์ธ/๋น„๋กœ๊ทธ์ธ ์‹œ ์ƒํƒœ ๋ฐ”๋€Œ๊ฒŒ ์„ค์ • * feat: ๋กœ๊ณ  ๋ˆ„๋ฅด๋ฉด ํ™ˆ์œผ๋กœ ์ด๋™ * feat: ๋กœ๊ณ  ๋ณ€๊ฒฝ * feat: ์†Œ์…œ๋กœ๊ทธ์ธ ์—ฐ๊ฒฐ ์นด์นด์˜ค & ๊ตฌ๊ธ€ * bug: ์นด์นด์˜ค ๋กœ๊ทธ์ธ ๋ฒ„๊ทธ๋ฐœ์ƒ * feat: ํ•„์š”ํ•œ ํŽ˜์ด์ง€๋“ค ์ถ”๊ฐ€ * feat: ๋‹ค์ด์–ด๋ฆฌ ํŽ˜์ด์ง€ ๊ธฐ๋ณธํ‹€ ์™„์„ฑ * feat: ๋‹ค์ด์–ด๋ฆฌ ํŽ˜์ด์ง€ ํŽธ์ง‘๋ชจ๋“œ ์™„์„ฑ * feat: ํŽธ์ง€ ์–‘์‹ ์™„์„ฑ * feat: ์ผ๊ธฐ ์ž‘์„ฑ UI ๊ตฌํ˜„ * feat: ์ผ๊ธฐ ์ž‘์„ฑ UI ์™„์„ฑ * [Feat/#49] ํŒŒ์ผ ์—…๋กœ๋“œ api ์—ฐ๊ฒฐ (#50) * chore: tsconfig.app.json ์ˆ˜์ • - enum ์‚ฌ์šฉ์„ ์œ„ํ•œ ์„ค์ • ๋ณ€๊ฒฝ * feat: file enum ์ถ”๊ฐ€ * feat: file type ์ถ”๊ฐ€ * feat: ์—๋Ÿฌ ์–‘์‹ ์ถ”๊ฐ€ ์–‘์‹์ด ์—†์–ด ์ผ๋‹จ ๋ฐ˜ํ™˜๋œ ๊ฐ’์— ๋งž์ถฐ์„œ ์ œ์ž‘ * feat: file api ์ถ”๊ฐ€ * feat: s3์— ์ง์ ‘ ์—…๋กœ๋“œ ๋˜๋Š” api ์ถ”๊ฐ€ * feat: ์—…๋กœ๋“œ ํ›… ์ถ”๊ฐ€ * Feat: ์ผ๊ธฐ๋‚ด์šฉ ํฐํŠธ ์‚ฌ์ด์ฆˆ ์กฐ์ • * [Refactor/#51] ํŒŒ์ผ ์—…๋กœ๋“œ ๋‹ค์ค‘ ์ฒ˜๋ฆฌ ๋กœ์ง ๋ณ€๊ฒฝ ๋ฐ enum ์ˆ˜์ • (#52) * fix: ํ•„์š”ํ•œ enum ๊ฐ’์œผ๋กœ๋งŒ ์ˆ˜์ • * refactor: useFileUpload ์ˆ˜์ • - ๋‹ค์ค‘ ํŒŒ์ผ ์—…๋กœ๋“œ Promise.all๋กœ ๋ณ€๊ฒฝ * Feat: ๋ณธ์ธ์ด ์ž‘์„ฑํ•œ ๋‹ค์ด์–ด๋ฆฌ ๋””ํ…Œ์ผ ํŽ˜์ด์ง€ + ๋‹ค์ด์–ด๋ฆฌ ์ˆ˜์ •ํŽ˜์ด์ง€ ์™„์„ฑ * feat: ํƒ€ ์œ ์ €๊ฐ€ ์—ด๋žŒํ•˜๋Š” ๋‹ค์ด์–ด๋ฆฌ DetailํŽ˜์ด์ง€ ์ž‘์—… ์™„์„ฑ * [Feat/#53] ํ‹ฐ์ผ“ API ์—ฐ๊ฒฐ (#56) * chore: ์ฃผ์„ ์ œ๊ฑฐ * feat: ํƒ€์ž… ์ถ”๊ฐ€ - ํ‹ฐ์ผ“ ํƒ€์ž… ์ถ”๊ฐ€ - ํŽ˜์ด์ง€๋„ค์ด์…˜ ํƒ€์ž… ๋ฐ enum ์ถ”๊ฐ€ * feat: ํ‹ฐ์ผ“ api ์ถ”๊ฐ€ - ์ฟผ๋ฆฌ ํ‚ค ์ถ”๊ฐ€ - ํ‹ฐ์ผ“, ํ‹ฐ์ผ“๋ถ api ์ถ”๊ฐ€ ํ‹ฐ์ผ“, ํ‹ฐ์ผ“๋ถ ํ›… ์ถ”๊ฐ€ * chore: ๋‚ ์งœ ํฌ๋งทํŒ… ์œ ํ‹ธ ์ถ”๊ฐ€ * feat: ํ‹ฐ์ผ“๋ถ api ์—ฐ๊ฒฐ - ํŽธ์ง‘ ์ƒํƒœ ๋ถ€๋ชจ๋กœ ๋ณ€๊ฒฝ - ๋”๋ฏธ๋ฐ์ดํ„ฐ ์ œ๊ฑฐ - getTicketBook, updateTicketBook, DeleteTicket ์‚ฌ์šฉ * fix: ๋ผ์šฐํŠธ ์ˆ˜์ • - ๊ธฐ์กด์˜ archiveId ์—†์ด ํ‹ฐ์ผ“์„ ์ถ”๊ฐ€ํ•˜๋ ค๋˜ ๋ฌธ์ œ ํ•ด๊ฒฐ * fix: props ์ถ”๊ฐ€ - ๋ผ์šฐํŠธ ๋ณ€๊ฒฝ์— ๋”ฐ๋ฅธ archiveId ์ถ”๊ฐ€ * feat: ํ‹ฐ์ผ“ํผ ์ˆ˜์ • - ํŒŒ์ผ ์—…๋กœ๋“œ ์ถ”๊ฐ€ * feat: ํ‹ฐ์ผ“ ์ƒ์„ฑ api ์—ฐ๊ฒฐ * chore: ์˜คํƒ€ ์ˆ˜์ • ticketid -> ticketId * feat: ํ‹ฐ์ผ“ ์ˆ˜์ • api ์—ฐ๊ฒฐ - ๋‹จ์ผ ์ฟผ๋ฆฌํ‚ค ์ดˆ๊ธฐํ™” -> ์ˆ˜์ •์œผ๋กœ ๋ณ€๊ฒฝ * feat: ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์ทจ์†Œ ์ถ”๊ฐ€ * fix: ๋นŒ๋“œ ์˜ค๋ฅ˜ ์ˆ˜์ • * Refactor: ํŽ˜์ด์ง€๋„ค์ด์…˜ ๊ฐœ์„  - ์ฟผ๋ฆฌ ๋ฐฉ์‹์œผ๋กœ ํŽ˜์ด์ง€ ์ฒ˜๋ฆฌ * [Style/#57] ํ‹ฐ์ผ“ ์ด๋ฏธ์ง€ svg๋กœ ๋ณ€๊ฒฝ (#58) * feat: ticket svg ์ปดํฌ๋„ŒํŠธํ™” * style: ํ‹ฐ์ผ“ ์ด๋ฏธ์ง€ svg๋กœ ๋ณ€๊ฒฝ ๋ฐ css ์ ์šฉ ์ฒดํฌ ์‹œ ์ƒ‰์ƒ ๋ณ€๊ฒฝ ์ถ”๊ฐ€ * fix: ํ™•์ธ ๋ชจ๋‹ฌ ํŠธ๋ฆฌ๊ฑฐ ๊ด€๋ จ ๋ฌธ์ œ ํ•ด๊ฒฐ * feat: ๊ฒฝ๋กœ ID๋“ค ์ˆ˜์ • * fix: ๋นŒ๋“œ ์˜ค๋ฅ˜ ์ œ๊ฑฐ * Feat: ๋ฐฐ์ง€ SVG ์ถ”๊ฐ€ * Feat: ์•„์นด์ด๋ธŒ ๋””ํ…Œ์ผ Editable Title ์ปดํฌ๋„ŒํŠธ๋กœ title ๋ถ€๋ถ„ ๋ณ€๊ฒฝ * feat: ์œ ์ €๋ณ„ ์•„์นด์ด๋ธŒ ์กฐํšŒ ํŽ˜์ด์ง€๋„ค์ด์…˜ ์—ฐ๊ฒฐ * feat: ์•„์นด์ด๋ธŒ ์ƒ์„ฑ API ์—ฐ๊ฒฐ + ์ƒ์„ฑ ํ›„ ๋ฐ”๋กœ ๋””ํ…Œ์ผ ํŽ˜์ด์ง€๋กœ ์ด๋™ * feat: ์•„์นด์ด๋ธŒ ์ƒ์„ธ์กฐํšŒ API ์—ฐ๊ฒฐ * Feat: ๋นŒ๋“œ์˜ค๋ฅ˜ ์ œ๊ฑฐ * feat: MyArchivePage & VisitArchivePage์— ์‹ค์ œ API ์—ฐ๊ฒฐ * feat: ์•„์นด์ด๋ธŒ ๋””ํ…Œ์ผํŽ˜์ด์ง€์—์„œ ์‹ค์ œ ๋ฑƒ์ง€๋กœ ์—ฐ๊ฒฐ * feat: ์•„์นด์ด๋ธŒ ์ˆ˜์ • API ์—ฐ๊ฒฐ * feat: ๋ฐฐ๋„ˆ ์—…๋ฐ์ดํŠธ ์‹œ ์ฟผ๋ฆฌ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™”๋กœ ์ƒํƒœ ๋ฐ”๋กœ ๋ฐ”๋€Œ๋„๋ก ์ˆ˜์ • * feat: ๊ณต๊ฐœ ๊ธฐ์ค€ ์„ค์ • ์ˆ˜์ • API ์—ฐ๊ฒฐ * feat: ์•„์นด์ด๋ธŒ ์‚ญ์ œ API ์—ฐ๊ฒฐ * feat: ๋นŒ๋“œ์˜ค๋ฅ˜ ์ˆ˜์ • * feat: ์ „์—ญ ํ”ผ๋“œ ์กฐํšŒ API ์™„์„ฑ & ์‹ค์ œ ํ”ผ๋“œ Page์— ์ ์šฉ * Feat: ์•„์นด์ด๋ธŒ & ํ”ผ๋“œ์— ์ข‹์•„์š” API ์—ฐ๊ฒฐ * Feat: FeedPage ์ •๋ ฌ๋ฐฉ์‹์œผ๋กœ ์กฐํšŒ๋˜๋„๋ก ์—ฐ๊ฒฐ * feat: ๋งˆ์ดํŽ˜์ด์ง€ ์•„์นด์ด๋ธŒ ๊ด€๋ฆฌ๋„ ์‚ญ์ œ API ์—ฐ๊ฒฐ * feat: ๋นŒ๋“œ์˜ค๋ฅ˜ ์ˆ˜์ • * [Feat/#48] ๊ฒŒ์‹œ๊ธ€ ๊ด€๋ฆฌ api ์—ฐ๊ฒฐ (์ปค๋ฎค๋‹ˆํ‹ฐ) (#65) * style: ํ•™๊ต์•ˆ์‹ฌ ํฐํŠธ ์•ˆ๋  ์‹œ pretendard๋กœ * feat: ๊ฒŒ์‹œ๊ธ€ ์ข‹์•„์š” ํ† ๊ธ€ api * feat: ๊ฒŒ์‹œ๊ธ€ ์ƒ์„ฑ api * feat: ๊ฒŒ์‹œ๊ธ€ ์ƒ์„ธ ์กฐํšŒ api * feat: ๊ฒŒ์‹œ๊ธ€ ์ „์ฒด ํ”ผ๋“œ ์กฐํšŒ api * feat: onProgress ์ถ”๊ฐ€ * feat: ๊ธฐ์กด์— ์“ฐ๋˜ mediaItem ์ถ”๊ฐ€๋œ enum๋“ค ํ™œ์šฉํ•˜์—ฌ ๋ฆฌํŒฉํ† ๋ง * feat: ์ปค๋ฎค๋‹ˆํ‹ฐ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์กฐํšŒ ๋งคํผ * feat: disable prop์ถ”๊ฐ€ * feat: ๊ฒŒ์‹œ๊ธ€ ์ข‹์•„์š” api ์—ฐ๊ฒฐ * feat: mediatype์— ๋งž์ถ”์–ด ํ”„๋กญ ๋ฐ ๋ถ„๊ธฐ ์ˆ˜์ • * feat: value ๋Œ€๋ฌธ์ž๋กœ ์ˆ˜์ • * feat: ์ด๋ฏธ์ง€์นด๋“œ ๋ถ€๋ถ„ ๋ฏธ๋””์–ดํƒ€์ž… ์ˆ˜์ • * feat: ๊ธฐ์กด uploadfiles ํ™œ์šฉ ๋ฐ ์—…๋กœ๋“œ ๊ฐœ์ˆ˜ ์ œํ•œ ์ถ”๊ฐ€ ๋ฐ ๋™์˜์ƒ๋„ ๋Œ€ํ‘œ ์ฒดํฌ ๊ฐ€๋Šฅํ•˜๋„๋ก ์ˆ˜์ • * feat: mediatype ์œผ๋กœ ๋Œ€์ฒด * feat: ์ „์ฒด ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ ๋ฐ ํŽ˜์ด์ง€๋„ค์ด์…˜ * feat: ๋ฐ›์•„์˜จ ๊ฒŒ์‹œ๊ธ€ ์ƒ์„ธํŽ˜์ด์ง€ ๊ฐ’ ์ ์šฉ (content์ œ์™ธ) * feat: ์œ ํšจ ์กฐ๊ฑด ์ˆ˜์ • * [Feat/#61] ํ‹ฐ์ผ“๋ถ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๋ฐ ์ˆ˜์ • (#67) * feat: NaN ์—๋Ÿฌ ์ˆ˜์ • - id -> archiveId๋กœ ์ˆ˜์ • id ํƒ€์ž… number๋กœ ๋ณ€๊ฒฝ * chore: score, review ํƒ€์ž… ์ถ”๊ฐ€ * chore: ํ‹ฐ์ผ“ ์ œ๋ชฉ ๊ณ ์ • * style: ์Šค์ผˆ๋ ˆํ†ค UI ์ถ”๊ฐ€ - Editable Title ์ˆ˜์ • * feat: date ์˜ต์…”๋„ ์ถ”๊ฐ€ * [Feat/#68] ๋‹ค์ด์–ด๋ฆฌ API ์—ฐ๊ฒฐ ๋ฐ ์ƒ‰์ƒ ๋ณ€๊ฒฝ ์ถ”๊ฐ€ (#71) * feat: diary api ์ถ”๊ฐ€ - visibilty enum ์ถ”๊ฐ€ * rename: diary -> Diarya ์ž„์‹œ ์ˆ˜์ • * rename: diary -> Diary ์ˆ˜์ • * feat: ๋‹ค์ด์–ด๋ฆฌ ๋ถ ์กฐํšŒ api ์—ฐ๊ฒฐ - DiaryList๋กœ ๋”ฐ๋กœ ๋ถ„๋ฆฌ * feat: ๋‹ค์ด์–ด๋ฆฌ ์ถ”๊ฐ€ api ์—ฐ๊ฒฐ - DiaryWritePage ๋ฆฌํŽ™ํ† ๋ง * fix: ๋นŒ๋“œ ์˜ค๋ฅ˜ ์ˆ˜์ • * style: x ๋ฒ„ํŠผ ์‚ญ์ œ ์ถ”๊ฐ€ - edit ๋ชจ๋“œ์—์„œ๋งŒ ์ˆ˜์ • ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋ณ€๊ฒฝ * feat: ๋‹ค์ด์–ด๋ฆฌ ๋””ํ…Œ์ผ ํŽ˜์ด์ง€ api ์—ฐ๊ฒฐ - ์ผ๊ธฐ ์ƒ์„ธ ์กฐํšŒ api ์—ฐ๊ฒฐ - ์ผ๊ธฐ ์ˆ˜์ • api ์—ฐ๊ฒฐ - ์ผ๊ธฐ ์‚ญ์ œ api ์—ฐ๊ฒฐ * feat: ๋‹ค์ด์–ด๋ฆฌ ๋ถ ํŽ˜์ด์ง€ api ์—ฐ๊ฒฐ - ์ผ๊ธฐ ์‚ญ์ œ api ์—ฐ๊ฒฐ - ๋‹ค์ด์–ด๋ฆฌ ์ œ๋ชฉ ์ˆ˜์ • api ์—ฐ๊ฒฐ - editableTitle ์ ์šฉ * style: ๊ทธ๋ผ๋ฐ์ด์…˜ bg-black/20์œผ๋กœ ๋ณ€๊ฒฝ * chore: ํ•„์š” ์—†๋Š” ์ฝ”๋“œ ์ œ๊ฑฐ * style: UI ์ƒ‰์ƒ ๋ณ€๊ฒฝ ์ฝ”๋“œ ์ถ”๊ฐ€ - footer ์ปดํฌ๋„ŒํŠธํ™” - svg๋“ค ์™ธ๋ถ€ ์ƒ‰์ƒ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋ณ€๊ฒฝ - ์ž‘์„ฑ ํŽ˜์ด์ง€ ๋’ค์— ์ด๋ฏธ์ง€ ์ปดํฌ๋„ŒํŠธ ํ™” - ์ƒ‰์ƒ ๋ณ€๊ฒฝ์šฉ zustand ์ƒ์„ฑ - btn ์™ธ๋ถ€ ์ƒ‰์ƒ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋ณ€๊ฒฝ - diary ์ƒ‰์ƒ ๋””์ž์ธ ์‹œ์Šคํ…œ์— ๋งž๊ฒŒ ์ˆ˜์ • * [Feat/#64] ์ด๋ฒคํŠธ + ์Šคํ‹ฐ์ปค API ์—ฐ๊ฒฐ (#76) * feat: ์›”๋ณ„ ์ผ์ • ์กฐํšŒ API ์—ฐ๊ฒฐ * feat: ์›”๋ณ„ ์ผ์ • ๋“ฑ๋ก api ์—ฐ๊ฒฐ * feat: ์ด๋ฒคํŠธ ์ˆ˜์ • api ์—ฐ๊ฒฐ * feat: ์‹œ๊ฐ„ ๊ณ ์ •๋˜๊ฒŒ ์ˆ˜์ • * feat: feedDetailPage์— ์ด๋ฒคํŠธ API ์—ฐ๊ฒฐ * feat: ํ”ผ๋“œ๋Š” ํƒ€์ดํ‹€ ๋ชป๋ฐ”๊พธ๊ฒŒ ์ˆ˜์ • * feat: ์•„์นด์ด๋ธŒํŽ˜์ด์ง€์—์„œ ์ด๋ฆ„ ์ˆ˜์ • ๋ชปํ•˜๊ฒŒ ๋ณ€๊ฒฝ * feat: ์ด๋ฒคํŠธ ๋ผ๋ฒจ ์ƒ‰์ƒ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ถ”๊ฐ€ * feat: ์Šคํ‹ฐ์ปค API mutation์— ๋“ฑ๋ก * feat: ์Šคํ‹ฐ์ปค API ์—ฐ๊ฒฐ ์™„์„ฑ * fix: ์Šคํฌ์ธ  ๊ฒฐ๊ณผ์—์„œ NaN ๋ฌธ์ œ ํ•ด๊ฒฐ * fix: ๋จธ์ง€ ์˜ค๋ฅ˜ ์ˆ˜์ • * fix: ๋นŒ๋“œ์˜ค๋ฅ˜ ์ˆ˜์ • * feat: ์Šคํ‹ฐ์ปค ์„ ํƒ ์ฐฝ ์ˆ˜์ • * feat: ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ api ์—ฐ๊ฒฐ์™„๋ฃŒ (#77) * [Feat/#66] ๋Œ“๊ธ€ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ (#78) * feat: ๋Œ“๊ธ€ get api * feat: ๋Œ“๊ธ€ ์ƒ์„ฑ api * feat: ๋Œ“๊ธ€ ์‚ญ์ œ api * refactor: summary ์ถ”๊ฐ€๋กœ ์ปค๋ฎค๋‹ˆํ‹ฐ ์นด๋“œ์— ๋‚ด์šฉ ์š”์•ฝ ๋ณด์ด๊ฒŒ ์ˆ˜์ • * feat: commenModel ์ˆ˜์ • ๋ฐ isOwner๋ฅผ ํ™œ์šฉํ•œ ์ž๊ธฐ ๋Œ“๊ธ€ ํŒ๋ณ„ ๋ฐฉ๋ฒ• ์ˆ˜์ • * feat: ๋Œ“๊ธ€ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ, ์ƒ์„ฑ, ์‚ญ์ œ ์—ฐ๊ฒฐ * feat: post.summary ์ถ”๊ฐ€ * feat: ๋ชฉ๋ฐ์ดํ„ฐ ์‚ญ์ œ ๋ฐ currentUser ์ •์˜ * [Feat/#70] ํ™ˆ UI ์™„์„ฑ + ํ™ˆ์— ํ•„์š”ํ•œ API ์—ฐ๊ฒฐ (#79) * Feat: ํ™ˆ์—์„œ ํ•ซํ•œ ํ”ผ๋“œ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ตฌํ˜„ * feat: ํ™ˆ์—์„œ ์•„์นด์ด๋ธŒ ๋งŒ๋“ค๊ธฐ ์™„์„ฑ * feat: ๋จธ์ง€ ํ›„ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ * feat: ์•„์นด์ด๋ธŒ ๋งŒ๋“œ๋Š” ์นด๋“œ ์ด๋ฆ„ ๋ณ€๊ฒฝ * feat: ์ƒ˜ํ”Œ์•„์นด์ด๋ธŒ ์ˆ˜์ • * Feat/#75] ๊ฐค๋Ÿฌ๋ฆฌ api ์—ฐ๊ฒฐ (#80) * feat: ๊ฐค๋Ÿฌ๋ฆฌ ์ด๋ฏธ์ง€ ์‚ญ์ œ api * feat: ๊ฐค๋Ÿฌ๋ฆฌ ์ด๋ฏธ์ง€ ๋“ฑ๋ก api * feat: ๊ฐค๋Ÿฌ๋ฆฌ๋ถ ์ œ๋ชฉ ์ˆ˜์ • api * feat: ๊ฐค๋Ÿฌ๋ฆฌ ์กฐํšŒ api * feat: reload ์ „ ํ›„ ์Šค์ผˆ๋ ˆํ†ค UI * feat: ๊ฐค๋Ÿฌ๋ฆฌ ์กฐํšŒ/๋“ฑ๋ก/์‚ญ์ œ/์ œ๋ชฉ ์ˆ˜์ • ๋ฐ ํŽ˜์ด์ง€๋„ค์ด์…˜ ๋ฆฌํŒฉํ† ๋ง * style: ์ทจ์†Œ ์•„์ด์ฝ˜ ๋ณ€๊ฒฝ ๋ฐ ๋‹ค์ด์–ด๋ฆฌ ํŽ˜์ด์ง€ ๋ฒ„ํŠผ ์ˆœ์„œ ๋ณ€๊ฒฝ * fix: build ์˜ค๋ฅ˜ ์ˆ˜์ • (#82) - string โ†’ number ํƒ€์ž… ๋ณ€๊ฒฝ * [Feat/#83] ํ‹ฐ์ผ“ ๊ด€๋ฆฌ์ž ์„ค์ • ๋ฐ ๊ฐค๋Ÿฌ๋ฆฌ ๊ด€๋ฆฌ์ž ์˜ค๋ฅ˜ ์ˆ˜์ • (#84) * feat: useGetArchive ํ›… ์ถ”๊ฐ€ * feat: EditableTitle ์ˆ˜์ • on/off ๊ธฐ๋Šฅ ์ถ”๊ฐ€ * feat: ๊ด€๋ฆฌ์ž๋งŒ ํŽ˜์ด์ง€ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ • * feat: ์•„์นด์ด๋ธŒ ํ‹ฐ์ผ“ ์—ฐ๊ฒฐ * feat: FeedDetail ์ˆ˜์ • - TicketList ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ - mockData ํ˜ธ์ถœx * feat: FeedDetail ์ˆ˜์ • - DiaryList ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ - mockData ํ˜ธ์ถœx * fix: Diary ๊ด€๋ฆฌ์ž ๊ถŒํ•œ ๋ฌธ์ œ ์ˆ˜์ • * [Feat/#72] SSE ๊ตฌ๋… ์—ฐ๊ฒฐ + ์นœ๊ตฌ ๊ด€๋ จ API ์—ฐ๊ฒฐ (#81) * feat: friend api ์ถ”๊ฐ€ - FriendStatus enum ์ถ”๊ฐ€ - friendRequestType enum ์ถ”๊ฐ€ - query key ์ถ”๊ฐ€ - friend type ์ถ”๊ฐ€ * feat: api ์—ฐ๊ฒฐ ๋ฐ ๋ฌดํ•œ ์Šคํฌ๋กค ์ ์šฉ - useFriendsData ํ›… ์ƒ์„ฑ - ๋‚ด ์นœ๊ตฌ ๋ชฉ๋ก ์กฐํšŒ api ์—ฐ๊ฒฐ - ์นœ๊ตฌ ์š”์ฒญ ๋ชฉ๋ก ์กฐํšŒ api ์—ฐ๊ฒฐ - ์นœ๊ตฌ ์š”์ฒญ ์ˆ˜๋ฝํ•˜๊ธฐ api ์—ฐ๊ฒฐ - ์นœ๊ตฌ ์š”์ฒญ ๊ฑฐ์ ˆํ•˜๊ธฐ api ์—ฐ๊ฒฐ - ์นœ๊ตฌ ์š”์ฒญ ์ทจ์†Œํ•˜๊ธฐ api ์—ฐ๊ฒฐ - ์นœ๊ตฌ ๋Š๊ธฐ api ์—ฐ๊ฒฐ * chore: ๋ˆ„๋ฝ๋œ ํŒจํ‚ค์ง€ ์—…๋ฐ์ดํŠธ - date-fns ์ถ”๊ฐ€ * feat: user API ์ถ”๊ฐ€ - getMe, getUser API ํ•จ์ˆ˜ ์ถ”๊ฐ€ - useGetMe, useGetUser ํ›… ์ถ”๊ฐ€ - UserRole enum ์ถ”๊ฐ€ * feat: SSE ์—ฐ๊ฒฐ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ - useEventSource ํ›… ์ถ”๊ฐ€ (์ด๋ฒคํŠธ ํƒ€์ž…๋ณ„ ๊ตฌ๋… ์ง€์›) - useSseSubscribe ํ›… ์ถ”๊ฐ€ - ProtectedLayout์—์„œ SSE ์ „์—ญ ์—ฐ๊ฒฐ - SseEventType ์ถ”๊ฐ€ (FRIEND_DELETE ์ด๋ฒคํŠธ ์ถ”๊ฐ€ ํ•„์š”) * fix: friend API ์‘๋‹ต ํƒ€์ž… ์ˆ˜์ • - friends โ†’ content ํ•„๋“œ๋ช… ๋ณ€๊ฒฝ - ์„ฑ๊ณต ๋ฐ˜ํ™˜ ๊ฐ’ ์ถ”๊ฐ€ * feat: ์นœ๊ตฌ ๊ด€๋ฆฌ ํŽ˜์ด์ง€ ํƒญ URL ํŒŒ๋ผ๋ฏธํ„ฐ ์ ์šฉ - URL query parameter๋กœ ํƒญ ์ƒํƒœ ๊ด€๋ฆฌ - ํ˜„์žฌ ํ™œ์„ฑ ํƒญ๋งŒ ์ฟผ๋ฆฌ ํ˜ธ์ถœํ•˜๋„๋ก ๋ณ€๊ฒฝ * feat: ํ”„๋กœํ•„ ํŽ˜์ด์ง€ api ์—ฐ๊ฒฐ --------- Co-authored-by: jungmin Co-authored-by: jungmin <148514354+JungMINI-developer@users.noreply.github.com> Co-authored-by: ์ตœ๊ณ ์€ --- src/components/home/.gitkeep => GEMINI.md | 0 package.json | 1 + src/apis/axios.ts | 10 +- src/apis/mutations/archive/archive.ts | 36 ++ src/apis/mutations/auth/login.ts | 10 + src/apis/mutations/auth/logout.ts | 16 + src/apis/mutations/auth/resetPw.ts | 10 + src/apis/mutations/auth/signup.ts | 51 +++ src/apis/mutations/calendar/Calendar.ts | 32 ++ .../mutations/community/createComments.ts | 29 ++ src/apis/mutations/community/createPost.ts | 63 +++ src/apis/mutations/community/deleteComment.ts | 17 + src/apis/mutations/community/toggleLike.ts | 19 + src/apis/mutations/diary/deleteDiary.ts | 12 + src/apis/mutations/diary/patchDiary.ts | 31 ++ src/apis/mutations/diary/postDiary.ts | 13 + src/apis/mutations/diary/useDeleteDiary.ts | 24 ++ src/apis/mutations/diary/usePatchDiary.ts | 49 +++ src/apis/mutations/diary/usePostDiary.ts | 22 + src/apis/mutations/file/postFile.ts | 39 ++ src/apis/mutations/file/uploadPart.ts | 22 + src/apis/mutations/file/usePostFile.ts | 59 +++ src/apis/mutations/friend/deleteFriend.ts | 27 ++ src/apis/mutations/friend/postFriend.ts | 55 +++ src/apis/mutations/friend/useDeleteFriend.ts | 49 +++ src/apis/mutations/friend/usePostFriend.ts | 98 +++++ src/apis/mutations/gallery/deleteGallery.ts | 20 + src/apis/mutations/gallery/registerGallery.ts | 23 + .../mutations/gallery/updateGalleryTitle.ts | 19 + src/apis/mutations/ticket/deleteTicket.ts | 12 + src/apis/mutations/ticket/patchTicket.ts | 31 ++ src/apis/mutations/ticket/postTicket.ts | 13 + src/apis/mutations/ticket/useDeleteTicket.ts | 24 ++ src/apis/mutations/ticket/usePatchTicket.ts | 52 +++ src/apis/mutations/ticket/usePostTicket.ts | 24 ++ src/apis/queries/archive/getArchive.ts | 35 ++ src/apis/queries/archive/useGetArchive.ts | 17 + src/apis/queries/auth/user.ts | 13 + src/apis/queries/calendar/Calendar.ts | 22 + src/apis/queries/community/getComments.ts | 55 +++ src/apis/queries/community/getDetailPost.ts | 32 ++ src/apis/queries/community/getPost.ts | 101 +++++ src/apis/queries/diary/getDiary.ts | 30 ++ src/apis/queries/diary/useGetDiary.ts | 31 ++ src/apis/queries/friend/getFriend.ts | 45 ++ src/apis/queries/friend/useGetFriend.ts | 106 +++++ src/apis/queries/gallery/getGallery.ts | 58 +++ src/apis/queries/sse/subscribe.ts | 5 + src/apis/queries/sse/useSseSubscribe.ts | 63 +++ src/apis/queries/ticket/getTicket.ts | 30 ++ src/apis/queries/ticket/useGetTicket.ts | 33 ++ src/apis/queries/user/getUser.ts | 21 + src/apis/queries/user/useGetUser.ts | 21 + src/assets/icon/DiaryFooterImage.tsx | 18 + src/assets/icon/DiaryImageCard.tsx | 378 +++++++++++++++++ src/assets/icon/DiaryMemo.tsx | 83 ++++ src/assets/icon/Logo.tsx | 262 +++++------- src/assets/icon/badge/Fans.tsx | 13 + src/assets/icon/badge/Master.tsx | 71 ++++ src/assets/icon/badge/Newbie.tsx | 11 + src/assets/icon/badge/Stan.tsx | 66 +++ src/assets/icon/badge/Supporter.tsx | 29 ++ src/assets/icon/sticker/baseball.svg | 113 +++++ src/assets/icon/sticker/cake.svg | 20 + src/assets/icon/sticker/camera.svg | 17 + src/assets/icon/sticker/coffee.svg | 28 ++ src/assets/icon/sticker/display_board.svg | 22 + src/assets/icon/sticker/giftbox.svg | 11 + src/assets/icon/sticker/heart.svg | 83 ++++ src/assets/icon/sticker/light_stick.svg | 18 + src/assets/icon/sticker/money.svg | 12 + src/assets/icon/sticker/musical_note.svg | 9 + src/assets/icon/sticker/shining.svg | 8 + src/assets/icon/sticker/ticket.svg | 17 + src/assets/images/diaryBackground.png | Bin 0 -> 51425 bytes src/assets/images/diary_input.png | Bin 0 -> 191407 bytes src/assets/svgs/diaryFooterImage.svg | 3 + src/assets/svgs/diaryMemo.svg | 21 + src/assets/svgs/ticket.svg | 23 + src/components/MainNavbar.tsx | 54 ++- src/components/archive/ArchiveCard.tsx | 25 +- src/components/archive/ArchiveHeader.tsx | 54 ++- src/components/archive/ArchiveTitle.tsx | 20 +- src/components/archive/ButtonLike.tsx | 26 +- src/components/archive/Empty/EmptyArchive.tsx | 28 ++ src/components/archive/List/ArchiveList.tsx | 19 +- src/components/archive/List/DiaryList.tsx | 105 +++-- src/components/archive/List/TicketList.tsx | 87 ++-- src/components/archive/SettngModal.tsx | 62 ++- src/components/auth/signup/signupStep3.tsx | 51 +-- src/components/calendar/Calendar.css | 2 +- src/components/calendar/Calendar.tsx | 254 ++++++++--- src/components/calendar/CalendarTag.tsx | 30 +- src/components/calendar/modal/Event.tsx | 65 ++- .../calendar/modal/EventListModal.tsx | 56 +-- src/components/calendar/modal/EventModal.tsx | 114 ++++- src/components/calendar/modal/Sports.tsx | 83 +++- src/components/calendar/modal/Sticker.tsx | 113 ++++- .../calendar/modal/StickerOptionModal.tsx | 59 +++ src/components/comments/CommentItem.tsx | 22 +- src/components/comments/CommentSection.tsx | 397 ++++++++++++++---- src/components/common/Button/Btn.tsx | 26 +- src/components/common/Button/SelectBox.tsx | 7 +- src/components/common/Card/DiaryCard.tsx | 40 +- src/components/common/Card/ImgCard.tsx | 59 +-- src/components/common/ColorChange.tsx | 60 +-- src/components/common/EditableTitle.tsx | 15 +- src/components/common/icons/TicketSvg.tsx | 125 ++++++ src/components/community/Banner.tsx | 88 ++-- src/components/community/CommunityTab.tsx | 16 +- src/components/diary/DiaryFooter.tsx | 76 ++++ src/components/diary/DiaryImage.tsx | 102 +++++ src/components/diary/DiaryText.tsx | 68 +++ src/components/diary/ImageCard.tsx | 135 ++++++ src/components/feed/FeedCard.tsx | 2 - src/components/gallery/ImageWithSkeleton.tsx | 63 +++ src/components/home/HomeArchiveList.tsx | 34 ++ src/components/media/MediaCarousel.tsx | 2 +- src/components/media/MediaUploader.tsx | 302 +++++++++---- src/components/ticket/TicketBook.tsx | 89 ++-- src/components/ticket/TicketBookSkeleton.tsx | 33 ++ src/components/ticket/TicketCard.tsx | 29 +- src/components/ticket/TicketCardSkeleton.tsx | 50 +++ src/components/ticket/TicketForm.tsx | 115 +++-- src/components/ticket/TicketFormSkeleton.tsx | 75 ++++ src/constants/diaryColors.ts | 52 +++ src/constants/friendTabs.ts | 27 ++ src/constants/queryKeys.ts | 33 ++ src/data/.gitkeep | 0 src/data/color.ts | 10 + src/enums/.gitkeep | 0 src/enums/friendRequestType.ts | 4 + src/enums/friendStatus.ts | 6 + src/enums/friendTabId.ts | 5 + src/enums/mediaRole.ts | 4 + src/enums/mediaType.ts | 6 + src/enums/mimeType.ts | 21 + src/enums/paginationDirection.ts | 5 + src/enums/paginationSort.ts | 5 + src/enums/sort.ts | 6 + src/enums/sseConnectionStatus.ts | 6 + src/enums/sseEventType.ts | 6 + src/enums/sticker.ts | 14 + src/enums/uploadStatus.ts | 9 + src/enums/userRole.ts | 4 + src/enums/visibilty.ts | 4 + src/hooks/useEventSource.ts | 160 +++++++ src/hooks/useFileUpload.ts | 251 +++++++++++ src/hooks/useFriendsData.ts | 72 ++++ src/hooks/useSocialAuth.ts | 32 ++ src/hooks/useTickets.ts | 6 +- src/index.css | 25 +- src/layouts/AuthLayout.tsx | 21 + src/layouts/HomeLayout.tsx | 1 + src/layouts/ProtectedLayout.tsx | 22 +- src/mockData/archiveData.ts | 196 +-------- src/mockData/calendarData.ts | 71 +++- src/mockData/diaryData.ts | 68 ++- src/mockData/feedData.ts | 138 +++--- src/pages/Archive/Archive.tsx | 156 +++++-- src/pages/Archive/ArchiveDetail.tsx | 242 ++++++++--- src/pages/Archive/Diary/DiaryDetailPage.tsx | 352 ++++++++++++++++ src/pages/Archive/Diary/DiaryPage.tsx | 196 +++++++++ src/pages/Archive/Diary/DiaryWritePage.tsx | 224 ++++++++++ src/pages/Archive/Gallery/Gallery.tsx | 364 +++++++++++++--- src/pages/Archive/Repost/RepostingPage.tsx | 4 +- src/pages/Archive/Ticket/CreateTicketPage.tsx | 47 ++- src/pages/Archive/Ticket/EditTicketPage.tsx | 87 +++- src/pages/Archive/Ticket/TicketBookPage.tsx | 211 +++++----- src/pages/Auth/LoginPage.tsx | 106 +++-- src/pages/Auth/PasswordFind.tsx | 74 ++-- src/pages/Auth/SignupPage.tsx | 60 ++- src/pages/Auth/socialCallback.tsx | 36 ++ src/pages/Community/Community.tsx | 157 +++---- src/pages/Community/CommunityDetail.tsx | 178 +++++--- src/pages/Community/CommunityWrite.tsx | 122 +++++- src/pages/Feed/Feed.tsx | 58 ++- src/pages/Feed/FeedDetail.tsx | 97 ++--- src/pages/Home/Home.tsx | 142 ++++++- src/pages/MyPage/FriendsPage.tsx | 224 +++------- src/pages/MyPage/MyArchivePage.tsx | 142 +++++-- src/pages/MyPage/MyInfoPage.tsx | 93 ++-- src/pages/MyPage/MyPage.tsx | 7 +- src/pages/MyPage/VisitArchivePage.tsx | 111 +++-- src/pages/MyPage/VisitProfilePage.tsx | 134 +++--- src/router/router.tsx | 78 ++-- src/store/useAuthStore.ts | 68 +++ src/store/useCounterStore.ts | 15 - src/store/useDiaryColorStore.ts | 14 + src/store/useNotificationStore.ts | 95 +++++ src/styles/.gitkeep | 0 src/styles/theme.css | 4 + src/styles/ticket.css | 37 ++ src/types/archive.ts | 81 +++- src/types/auth/login.ts | 35 ++ src/types/auth/logout.ts | 7 + src/types/auth/password.ts | 8 + src/types/auth/signup.ts | 38 ++ src/types/calendar.ts | 63 ++- src/types/diary.ts | 72 ++++ src/types/error.ts | 9 + src/types/file.ts | 96 +++++ src/types/friend.ts | 49 +++ src/types/media.ts | 13 +- src/types/pagination.ts | 14 + src/types/sse.ts | 9 + src/types/ticket.ts | 96 ++++- src/types/user.ts | 26 ++ src/utils/categoryMapper.ts | 39 ++ src/utils/date.ts | 13 + tsconfig.app.json | 2 +- 211 files changed, 10178 insertions(+), 2120 deletions(-) rename src/components/home/.gitkeep => GEMINI.md (100%) create mode 100644 src/apis/mutations/archive/archive.ts create mode 100644 src/apis/mutations/auth/login.ts create mode 100644 src/apis/mutations/auth/logout.ts create mode 100644 src/apis/mutations/auth/resetPw.ts create mode 100644 src/apis/mutations/auth/signup.ts create mode 100644 src/apis/mutations/calendar/Calendar.ts create mode 100644 src/apis/mutations/community/createComments.ts create mode 100644 src/apis/mutations/community/createPost.ts create mode 100644 src/apis/mutations/community/deleteComment.ts create mode 100644 src/apis/mutations/community/toggleLike.ts create mode 100644 src/apis/mutations/diary/deleteDiary.ts create mode 100644 src/apis/mutations/diary/patchDiary.ts create mode 100644 src/apis/mutations/diary/postDiary.ts create mode 100644 src/apis/mutations/diary/useDeleteDiary.ts create mode 100644 src/apis/mutations/diary/usePatchDiary.ts create mode 100644 src/apis/mutations/diary/usePostDiary.ts create mode 100644 src/apis/mutations/file/postFile.ts create mode 100644 src/apis/mutations/file/uploadPart.ts create mode 100644 src/apis/mutations/file/usePostFile.ts create mode 100644 src/apis/mutations/friend/deleteFriend.ts create mode 100644 src/apis/mutations/friend/postFriend.ts create mode 100644 src/apis/mutations/friend/useDeleteFriend.ts create mode 100644 src/apis/mutations/friend/usePostFriend.ts create mode 100644 src/apis/mutations/gallery/deleteGallery.ts create mode 100644 src/apis/mutations/gallery/registerGallery.ts create mode 100644 src/apis/mutations/gallery/updateGalleryTitle.ts create mode 100644 src/apis/mutations/ticket/deleteTicket.ts create mode 100644 src/apis/mutations/ticket/patchTicket.ts create mode 100644 src/apis/mutations/ticket/postTicket.ts create mode 100644 src/apis/mutations/ticket/useDeleteTicket.ts create mode 100644 src/apis/mutations/ticket/usePatchTicket.ts create mode 100644 src/apis/mutations/ticket/usePostTicket.ts create mode 100644 src/apis/queries/archive/getArchive.ts create mode 100644 src/apis/queries/archive/useGetArchive.ts create mode 100644 src/apis/queries/auth/user.ts create mode 100644 src/apis/queries/calendar/Calendar.ts create mode 100644 src/apis/queries/community/getComments.ts create mode 100644 src/apis/queries/community/getDetailPost.ts create mode 100644 src/apis/queries/community/getPost.ts create mode 100644 src/apis/queries/diary/getDiary.ts create mode 100644 src/apis/queries/diary/useGetDiary.ts create mode 100644 src/apis/queries/friend/getFriend.ts create mode 100644 src/apis/queries/friend/useGetFriend.ts create mode 100644 src/apis/queries/gallery/getGallery.ts create mode 100644 src/apis/queries/sse/subscribe.ts create mode 100644 src/apis/queries/sse/useSseSubscribe.ts create mode 100644 src/apis/queries/ticket/getTicket.ts create mode 100644 src/apis/queries/ticket/useGetTicket.ts create mode 100644 src/apis/queries/user/getUser.ts create mode 100644 src/apis/queries/user/useGetUser.ts create mode 100644 src/assets/icon/DiaryFooterImage.tsx create mode 100644 src/assets/icon/DiaryImageCard.tsx create mode 100644 src/assets/icon/DiaryMemo.tsx create mode 100644 src/assets/icon/badge/Fans.tsx create mode 100644 src/assets/icon/badge/Master.tsx create mode 100644 src/assets/icon/badge/Newbie.tsx create mode 100644 src/assets/icon/badge/Stan.tsx create mode 100644 src/assets/icon/badge/Supporter.tsx create mode 100644 src/assets/icon/sticker/baseball.svg create mode 100644 src/assets/icon/sticker/cake.svg create mode 100644 src/assets/icon/sticker/camera.svg create mode 100644 src/assets/icon/sticker/coffee.svg create mode 100644 src/assets/icon/sticker/display_board.svg create mode 100644 src/assets/icon/sticker/giftbox.svg create mode 100644 src/assets/icon/sticker/heart.svg create mode 100644 src/assets/icon/sticker/light_stick.svg create mode 100644 src/assets/icon/sticker/money.svg create mode 100644 src/assets/icon/sticker/musical_note.svg create mode 100644 src/assets/icon/sticker/shining.svg create mode 100644 src/assets/icon/sticker/ticket.svg create mode 100644 src/assets/images/diaryBackground.png create mode 100644 src/assets/images/diary_input.png create mode 100644 src/assets/svgs/diaryFooterImage.svg create mode 100644 src/assets/svgs/diaryMemo.svg create mode 100644 src/assets/svgs/ticket.svg create mode 100644 src/components/calendar/modal/StickerOptionModal.tsx create mode 100644 src/components/common/icons/TicketSvg.tsx create mode 100644 src/components/diary/DiaryFooter.tsx create mode 100644 src/components/diary/DiaryImage.tsx create mode 100644 src/components/diary/DiaryText.tsx create mode 100644 src/components/diary/ImageCard.tsx create mode 100644 src/components/gallery/ImageWithSkeleton.tsx create mode 100644 src/components/home/HomeArchiveList.tsx create mode 100644 src/components/ticket/TicketBookSkeleton.tsx create mode 100644 src/components/ticket/TicketCardSkeleton.tsx create mode 100644 src/components/ticket/TicketFormSkeleton.tsx create mode 100644 src/constants/diaryColors.ts create mode 100644 src/constants/friendTabs.ts create mode 100644 src/constants/queryKeys.ts delete mode 100644 src/data/.gitkeep create mode 100644 src/data/color.ts delete mode 100644 src/enums/.gitkeep create mode 100644 src/enums/friendRequestType.ts create mode 100644 src/enums/friendStatus.ts create mode 100644 src/enums/friendTabId.ts create mode 100644 src/enums/mediaRole.ts create mode 100644 src/enums/mediaType.ts create mode 100644 src/enums/mimeType.ts create mode 100644 src/enums/paginationDirection.ts create mode 100644 src/enums/paginationSort.ts create mode 100644 src/enums/sort.ts create mode 100644 src/enums/sseConnectionStatus.ts create mode 100644 src/enums/sseEventType.ts create mode 100644 src/enums/sticker.ts create mode 100644 src/enums/uploadStatus.ts create mode 100644 src/enums/userRole.ts create mode 100644 src/enums/visibilty.ts create mode 100644 src/hooks/useEventSource.ts create mode 100644 src/hooks/useFileUpload.ts create mode 100644 src/hooks/useFriendsData.ts create mode 100644 src/hooks/useSocialAuth.ts create mode 100644 src/layouts/AuthLayout.tsx create mode 100644 src/pages/Archive/Diary/DiaryDetailPage.tsx create mode 100644 src/pages/Archive/Diary/DiaryPage.tsx create mode 100644 src/pages/Archive/Diary/DiaryWritePage.tsx create mode 100644 src/pages/Auth/socialCallback.tsx create mode 100644 src/store/useAuthStore.ts delete mode 100644 src/store/useCounterStore.ts create mode 100644 src/store/useDiaryColorStore.ts create mode 100644 src/store/useNotificationStore.ts delete mode 100644 src/styles/.gitkeep create mode 100644 src/styles/theme.css create mode 100644 src/styles/ticket.css create mode 100644 src/types/auth/login.ts create mode 100644 src/types/auth/logout.ts create mode 100644 src/types/auth/password.ts create mode 100644 src/types/diary.ts create mode 100644 src/types/error.ts create mode 100644 src/types/file.ts create mode 100644 src/types/friend.ts create mode 100644 src/types/pagination.ts create mode 100644 src/types/sse.ts create mode 100644 src/utils/categoryMapper.ts create mode 100644 src/utils/date.ts diff --git a/src/components/home/.gitkeep b/GEMINI.md similarity index 100% rename from src/components/home/.gitkeep rename to GEMINI.md diff --git a/package.json b/package.json index 87064ec..2e2ad48 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "@tanstack/react-query-devtools": "^5.90.2", "axios": "^1.13.2", "clsx": "^2.1.1", + "date-fns": "^4.1.0", "dayjs": "^1.11.19", "lucide-react": "^0.561.0", "react": "^19.1.1", diff --git a/src/apis/axios.ts b/src/apis/axios.ts index 42e97a1..3702acd 100644 --- a/src/apis/axios.ts +++ b/src/apis/axios.ts @@ -1,7 +1,7 @@ import axios, { AxiosError } from "axios"; // API Base URL -const BASE_URL = import.meta.env.VITE_API_BASE_URL; +const BASE_URL = import.meta.env.VITE_API_BASE; // Axios ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ export const axiosInstance = axios.create({ @@ -17,10 +17,10 @@ export const axiosInstance = axios.create({ axiosInstance.interceptors.response.use( (response) => response, (error: AxiosError) => { - // 401 ์—๋Ÿฌ ์‹œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ - if (error.response?.status === 401) { - window.location.href = "/login"; - } + // 401 ์—๋Ÿฌ ์‹œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ => ํ•„์š”ํ•œ ๊ณณ์—์„œ ๊ฐœ๋ณ„ ์ฒ˜๋ฆฌ + // if (error.response?.status === 401) { + // window.location.href = "/login"; + // } // 403 ์—๋Ÿฌ ์ฒ˜๋ฆฌ (๊ถŒํ•œ ์—†์Œ) if (error.response?.status === 403) { diff --git a/src/apis/mutations/archive/archive.ts b/src/apis/mutations/archive/archive.ts new file mode 100644 index 0000000..7ca091b --- /dev/null +++ b/src/apis/mutations/archive/archive.ts @@ -0,0 +1,36 @@ +import axiosInstance from "@/apis/axios"; +import type { ArchiveLikeResponse, ArchiveResponse, CreateArchiveRequest, UpdateArchiveRequest } from "@/types/archive"; + +export const CreateArchive = async (data: CreateArchiveRequest): Promise => { + const response = await axiosInstance.post( + "/api/v1/archives", + data + ); + return response.data; +}; + +export const UpdateArchive = async( + archiveId: number, + data: UpdateArchiveRequest +): Promise => { + const response = await axiosInstance.patch( + `/api/v1/archives/${archiveId}`, + data + ); + return response.data; +}; + +export const DeleteArchive = async( + archiveId: number +): Promise => { + await axiosInstance.delete(`/api/v1/archives/${archiveId}`); +}; + +export const LikeArchive = async( + archiveId: number +): Promise => { + const response = await axiosInstance.post( + `/api/v1/archives/${archiveId}/like` + ); + return response.data; +}; diff --git a/src/apis/mutations/auth/login.ts b/src/apis/mutations/auth/login.ts new file mode 100644 index 0000000..0874316 --- /dev/null +++ b/src/apis/mutations/auth/login.ts @@ -0,0 +1,10 @@ +import axiosInstance from "@/apis/axios"; +import type { LoginRequest, LoginResponse } from "@/types/auth/login"; + +export const login = async (data: LoginRequest): Promise => { + const response = await axiosInstance.post( + "/api/v1/auth/login", + data + ); + return response.data; +}; diff --git a/src/apis/mutations/auth/logout.ts b/src/apis/mutations/auth/logout.ts new file mode 100644 index 0000000..5624b8d --- /dev/null +++ b/src/apis/mutations/auth/logout.ts @@ -0,0 +1,16 @@ +import axiosInstance from "@/apis/axios"; +import type { LogoutResponse, WithdrawResponse } from "@/types/auth/logout"; + +export const logout = async () => { + const response = await axiosInstance.post( + "/api/v1/auth/logout" + ); + return response.data; +}; + +export const withdraw = async () => { + const response = await axiosInstance.delete( + "/api/v1/auth/delete" + ); + return response.data; +}; diff --git a/src/apis/mutations/auth/resetPw.ts b/src/apis/mutations/auth/resetPw.ts new file mode 100644 index 0000000..61f7b51 --- /dev/null +++ b/src/apis/mutations/auth/resetPw.ts @@ -0,0 +1,10 @@ +import axiosInstance from "@/apis/axios"; +import type { ResetPasswordRequest, ResetPasswordResponse } from "@/types/auth/password"; + +export const resetPassword = async (data: ResetPasswordRequest): Promise => { + const response = await axiosInstance.post( + "/api/v1/auth/reset-pw", + data + ); + return response.data; +}; \ No newline at end of file diff --git a/src/apis/mutations/auth/signup.ts b/src/apis/mutations/auth/signup.ts new file mode 100644 index 0000000..cb77176 --- /dev/null +++ b/src/apis/mutations/auth/signup.ts @@ -0,0 +1,51 @@ +import { axiosInstance } from "@/apis/axios"; +import type { + SendVerificationCodeRequest, + SendVerificationCodeResponse, + SignupRequest, + SignupResponse, + VerifyEmailCodeRequest, + VerifyEmailCodeResponse, +} from "@/types/auth/signup"; + +/** + * ํšŒ์›๊ฐ€์ž… API + * POST /api/v1/auth/register + */ +export const registerUser = async ( + data: SignupRequest +): Promise => { + const response = await axiosInstance.post( + "/api/v1/auth/register", // โœ… ์ง์ ‘ ๊ฒฝ๋กœ ์ง€์ • + data + ); + return response.data; +}; + +// ์ด๋ฉ”์ผ ์ธ์ฆ๋ฒˆํ˜ธ ๋ฐœ์†ก API +export const sendVerificationCode = async ( + data: SendVerificationCodeRequest +): Promise => { + const response = await axiosInstance.post( + "/api/v1/auth/email/send", // โœ… ์‹ค์ œ ์—”๋“œํฌ์ธํŠธ๋กœ ๋ณ€๊ฒฝ + null, + { + params: { + // โœ… query parameter๋กœ ์ „๋‹ฌ + email: data.email, + }, + } + ); + return response.data; +}; + +//์ด๋ฉ”์ผ ์ธ์ฆ ๋ฒˆํ˜ธ ๊ฒ€์ฆ API +export const verifyEmailCode = async ( + data: VerifyEmailCodeRequest +): Promise => { + const response = await axiosInstance.post( + "/api/v1/auth/email/verify", + data + ); + return response.data; +}; diff --git a/src/apis/mutations/calendar/Calendar.ts b/src/apis/mutations/calendar/Calendar.ts new file mode 100644 index 0000000..ee85a98 --- /dev/null +++ b/src/apis/mutations/calendar/Calendar.ts @@ -0,0 +1,32 @@ +import axiosInstance from "@/apis/axios"; +import type { CreateEventRequest, CreateStickerRequest, EventResponse, StickerResponse, UpdateEventRequest } from "@/types/calendar"; + +export const PostCalendar = async (archiveId: number, data: CreateEventRequest): Promise => { + const response = await axiosInstance.post(`/api/v1/events/${archiveId}`, data); + return response.data; +} + +export const PatchCalendar = async (eventId: number, data: UpdateEventRequest): Promise => { + const response = await axiosInstance.patch(`/api/v1/events/${eventId}`, data); + return response.data; +} + +export const DeleteCalendar = async (eventId: number): Promise => { + await axiosInstance.delete(`/api/v1/events/${eventId}`); +} + +export const PostSticker = async (archiveId: number, data: CreateStickerRequest): Promise => { + const response = await axiosInstance.post(`/api/v1/stickers/${archiveId}`, data); + return response.data; +} + +export const UpdateSticker = async (stickerId: number, data: CreateStickerRequest): Promise => { + const response = await axiosInstance.patch(`/api/v1/stickers/${stickerId}`, data); + return response.data; +} + +export const DeleteSticker = async (stickerId: number): Promise => { + await axiosInstance.delete(`/api/v1/stickers/${stickerId}`); +} + + diff --git a/src/apis/mutations/community/createComments.ts b/src/apis/mutations/community/createComments.ts new file mode 100644 index 0000000..2f17ad2 --- /dev/null +++ b/src/apis/mutations/community/createComments.ts @@ -0,0 +1,29 @@ +import axiosInstance from "@/apis/axios"; +import type { AxiosResponse } from "axios"; + +export type CreateCommentRequest = { + postId: number | string; + content: string; + parentId?: number | null; // null์ด๋ฉด ์›๋Œ“๊ธ€ +}; + +export type CreateCommentResponseDto = { + commentId: number | string; + content: string; + userId?: number | string; + nickname?: string; + createdAt?: string; + parentId?: number | string | null; +}; + +export async function createCommentApi( + payload: CreateCommentRequest +): Promise { + const res: AxiosResponse = await axiosInstance.post( + "/api/v1/comments", + payload + ); + return res.data; +} + +export default createCommentApi; diff --git a/src/apis/mutations/community/createPost.ts b/src/apis/mutations/community/createPost.ts new file mode 100644 index 0000000..2bc67f8 --- /dev/null +++ b/src/apis/mutations/community/createPost.ts @@ -0,0 +1,63 @@ +import axiosInstance from "@/apis/axios"; + +import type { AxiosError } from "axios"; +import { MediaRole } from "@/enums/mediaRole"; + +export type CreatePostFile = { + fileId: number | string; + mediaRole: MediaRole | string; + sequence?: number; +}; + +export type CreatePostPayload = { + title: string; + content: string; + category: string; + files?: CreatePostFile[]; +}; + +export type CreatePostResponse = { + id: number; + title: string; + content: string; + category: string; + files?: any[]; +}; + +export const createCommunityPost = async ( + payload: CreatePostPayload +): Promise => { + try { + const res = await axiosInstance.post( + "/api/v1/posts", + payload + ); + return res.data; + } catch (err) { + const error = err as AxiosError; + + if (error.response) { + // ์„œ๋ฒ„์—์„œ ์˜จ ์‘๋‹ต์ด ์žˆ๋Š” ๊ฒฝ์šฐ + const status = error.response.status; + const message = + (error.response.data as any)?.message || + (error.response.data as any)?.error || + "๊ฒŒ์‹œ๊ธ€ ์ƒ์„ฑ ์ค‘ ์„œ๋ฒ„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค."; + // ๊ฐ„๋‹จํ•œ ๋ถ„๊ธฐ + if (status === 400) { + throw new Error(message); + } + if (status === 401) { + throw new Error("์ธ์ฆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ ํ›„ ๋‹ค์‹œ ์‹œ๋„ํ•ด ์ฃผ์„ธ์š”."); + } + if (status === 403) { + throw new Error("๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค."); + } + throw new Error(message); + } + // ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜ ๋“ฑ + throw new Error(error.message || "๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค."); + } +}; + +export default createCommunityPost; diff --git a/src/apis/mutations/community/deleteComment.ts b/src/apis/mutations/community/deleteComment.ts new file mode 100644 index 0000000..89605b9 --- /dev/null +++ b/src/apis/mutations/community/deleteComment.ts @@ -0,0 +1,17 @@ +import axiosInstance from "@/apis/axios"; +import type { AxiosResponse } from "axios"; + +export type DeleteCommentResponse = { + success?: boolean; +}; + +export async function deleteCommentApi( + commentId: number | string +): Promise { + const res: AxiosResponse = await axiosInstance.delete( + `/api/v1/comments/${commentId}` + ); + return res.data; +} + +export default deleteCommentApi; diff --git a/src/apis/mutations/community/toggleLike.ts b/src/apis/mutations/community/toggleLike.ts new file mode 100644 index 0000000..aeece70 --- /dev/null +++ b/src/apis/mutations/community/toggleLike.ts @@ -0,0 +1,19 @@ +import axiosInstance from "@/apis/axios"; + +export type ToggleLikeResponse = { + postId: number | string; + likeCount: number; + liked: boolean; + isLiked?: boolean; +}; + +export const togglePostLike = async ( + postId: string | number +): Promise => { + const res = await axiosInstance.post( + `/api/v1/posts/${postId}/like` + ); + return res.data; +}; + +export default togglePostLike; diff --git a/src/apis/mutations/diary/deleteDiary.ts b/src/apis/mutations/diary/deleteDiary.ts new file mode 100644 index 0000000..c53bb06 --- /dev/null +++ b/src/apis/mutations/diary/deleteDiary.ts @@ -0,0 +1,12 @@ +import axiosInstance from "@/apis/axios"; +import type { DeleteDiaryRequest, DeleteDiaryResponse } from "@/types/diary"; + +export const deleteDiary = async ( + data: DeleteDiaryRequest +): Promise => { + const { diaryId } = data; + const response = await axiosInstance.delete( + `/api/v1/diary/${diaryId}` + ); + return response.data; +}; diff --git a/src/apis/mutations/diary/patchDiary.ts b/src/apis/mutations/diary/patchDiary.ts new file mode 100644 index 0000000..c73670e --- /dev/null +++ b/src/apis/mutations/diary/patchDiary.ts @@ -0,0 +1,31 @@ +import axiosInstance from "@/apis/axios"; +import type { + UpdateDiaryBookRequest, + UpdateDiaryBookResponse, + UpdateDiaryRequest, + UpdateDiaryResponse, +} from "@/types/diary"; + +export const updateDiary = async ( + data: UpdateDiaryRequest +): Promise => { + const { diaryId, ...body } = data; + const response = await axiosInstance.patch( + `/api/v1/diary/${diaryId}`, + body + ); + return response.data; +}; + +export const updateDiaryBook = async ( + data: UpdateDiaryBookRequest +): Promise => { + const { archiveId, title } = data; + const response = await axiosInstance.patch( + `/api/v1/diary/book/${archiveId}`, + { + title, + } + ); + return response.data; +}; diff --git a/src/apis/mutations/diary/postDiary.ts b/src/apis/mutations/diary/postDiary.ts new file mode 100644 index 0000000..14b0e8d --- /dev/null +++ b/src/apis/mutations/diary/postDiary.ts @@ -0,0 +1,13 @@ +import axiosInstance from "@/apis/axios"; +import type { AddDiaryRequest, AddDiaryResponse } from "@/types/diary"; + +export const addDiary = async ( + data: AddDiaryRequest +): Promise => { + const { archiveId, ...body } = data; + const response = await axiosInstance.post( + `/api/v1/diary/${archiveId}`, + body + ); + return response.data; +}; diff --git a/src/apis/mutations/diary/useDeleteDiary.ts b/src/apis/mutations/diary/useDeleteDiary.ts new file mode 100644 index 0000000..dcb3d7f --- /dev/null +++ b/src/apis/mutations/diary/useDeleteDiary.ts @@ -0,0 +1,24 @@ +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { deleteDiary } from "@/apis/mutations/diary/deleteDiary"; +import { queryKeys } from "@/constants/queryKeys"; +import type { ApiError, ApiErrorBody } from "@/types/error"; +import type { DeleteDiaryRequest, DeleteDiaryResponse } from "@/types/diary"; + +export const useDeleteDiary = () => { + const queryClient = useQueryClient(); + + return useMutation< + DeleteDiaryResponse, + ApiError, + DeleteDiaryRequest + >({ + mutationFn: (data) => deleteDiary(data), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: queryKeys.diary.all }); + queryClient.invalidateQueries({ queryKey: queryKeys.diaryBook.all }); + }, + onError: (error) => { + console.log(error); + }, + }); +}; diff --git a/src/apis/mutations/diary/usePatchDiary.ts b/src/apis/mutations/diary/usePatchDiary.ts new file mode 100644 index 0000000..fd2994c --- /dev/null +++ b/src/apis/mutations/diary/usePatchDiary.ts @@ -0,0 +1,49 @@ +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { + updateDiary, + updateDiaryBook, +} from "@/apis/mutations/diary/patchDiary"; +import { queryKeys } from "@/constants/queryKeys"; +import type { ApiError, ApiErrorBody } from "@/types/error"; +import type { + UpdateDiaryBookRequest, + UpdateDiaryBookResponse, + UpdateDiaryRequest, + UpdateDiaryResponse, +} from "@/types/diary"; + +export const useUpdateDiary = () => { + const queryClient = useQueryClient(); + + return useMutation< + UpdateDiaryResponse, + ApiError, + UpdateDiaryRequest + >({ + mutationFn: (data) => updateDiary(data), + onSuccess: (data, variables) => { + queryClient.invalidateQueries({ queryKey: queryKeys.diaryBook.all }); + queryClient.setQueryData(queryKeys.diary.detail(variables.diaryId), data); + }, + onError: (error) => { + console.log(error); + }, + }); +}; + +export const useUpdateDiaryBook = () => { + const queryClient = useQueryClient(); + return useMutation< + UpdateDiaryBookResponse, + ApiError, + UpdateDiaryBookRequest + >({ + mutationFn: (data) => updateDiaryBook(data), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: queryKeys.diaryBook.all }); + }, + onError: (error) => { + console.log(error); + }, + }); +}; diff --git a/src/apis/mutations/diary/usePostDiary.ts b/src/apis/mutations/diary/usePostDiary.ts new file mode 100644 index 0000000..23d1620 --- /dev/null +++ b/src/apis/mutations/diary/usePostDiary.ts @@ -0,0 +1,22 @@ +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { addDiary } from "@/apis/mutations/diary/postDiary"; +import { queryKeys } from "@/constants/queryKeys"; +import type { ApiError, ApiErrorBody } from "@/types/error"; +import type { AddDiaryRequest, AddDiaryResponse } from "@/types/diary"; + +export const useAddDiary = () => { + const queryClient = useQueryClient(); + + return useMutation, AddDiaryRequest>( + { + mutationFn: (data) => addDiary(data), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: queryKeys.diary.all }); + queryClient.invalidateQueries({ queryKey: queryKeys.diaryBook.all }); + }, + onError: (error) => { + console.log(error); + }, + } + ); +}; diff --git a/src/apis/mutations/file/postFile.ts b/src/apis/mutations/file/postFile.ts new file mode 100644 index 0000000..2397733 --- /dev/null +++ b/src/apis/mutations/file/postFile.ts @@ -0,0 +1,39 @@ +import axiosInstance from "@/apis/axios"; +import type { + FileInitiateResponse, + FileInitiateRequest, + FileCompleteRequest, + FileCompleteResponse, + FileAbortRequest, + FileAbortResponse, +} from "@/types/file"; + +export const initialte = async ( + data: FileInitiateRequest +): Promise => { + const response = await axiosInstance.post( + "/api/v1/files/multipart/initiate", + data + ); + return response.data; +}; + +export const complete = async ( + data: FileCompleteRequest +): Promise => { + const response = await axiosInstance.post( + "/api/v1/files/multipart/complete", + data + ); + return response.data; +}; + +export const abort = async ( + data: FileAbortRequest +): Promise => { + const response = await axiosInstance.post( + "/api/v1/files/multipart/abort", + data + ); + return response.data; +}; diff --git a/src/apis/mutations/file/uploadPart.ts b/src/apis/mutations/file/uploadPart.ts new file mode 100644 index 0000000..aff0566 --- /dev/null +++ b/src/apis/mutations/file/uploadPart.ts @@ -0,0 +1,22 @@ +import axios from "axios"; +import type { UploadPartRequest, UploadPartResponse } from "@/types/file"; + +export const uploadPart = async ({ + presignedUrl, + chunk, + onProgress, +}: UploadPartRequest): Promise => { + const response = await axios.put(presignedUrl, chunk, { + onUploadProgress: (event) => { + if (event.loaded && onProgress) { + onProgress(event.loaded); + } + }, + }); + + const etag = response.headers["etag"]; + if (etag) { + return { etag: etag.replace(/"/g, "") }; + } + throw new Error("ETag not found in response"); +}; diff --git a/src/apis/mutations/file/usePostFile.ts b/src/apis/mutations/file/usePostFile.ts new file mode 100644 index 0000000..bf6c4fd --- /dev/null +++ b/src/apis/mutations/file/usePostFile.ts @@ -0,0 +1,59 @@ +import { useMutation } from "@tanstack/react-query"; +import { initialte, complete, abort } from "@/apis/mutations/file/postFile"; +import type { ApiError, ApiErrorBody } from "@/types/error"; +import type { + FileInitiateRequest, + FileInitiateResponse, + FileCompleteRequest, + FileCompleteResponse, + FileAbortRequest, + FileAbortResponse, +} from "@/types/file"; + +export const useUploadFileInitiate = () => { + return useMutation< + FileInitiateResponse, + ApiError, + FileInitiateRequest + >({ + mutationFn: (data) => initialte(data), + onSuccess: () => { + // ์ฟผ๋ฆฌ ๋ฌดํšจํ™” + }, + onError: (error) => { + console.log(error); + }, + }); +}; + +export const useUploadFileComplete = () => { + return useMutation< + FileCompleteResponse, + ApiError, + FileCompleteRequest + >({ + mutationFn: (data) => complete(data), + onSuccess: () => { + // ์ฟผ๋ฆฌ ๋ฌดํšจํ™” + }, + onError: (error) => { + console.log(error); + }, + }); +}; + +export const useUploadFileAbort = () => { + return useMutation< + FileAbortResponse, + ApiError, + FileAbortRequest + >({ + mutationFn: (data) => abort(data), + onSuccess: () => { + // ์ฟผ๋ฆฌ ๋ฌดํšจํ™” + }, + onError: (error) => { + console.log(error); + }, + }); +}; diff --git a/src/apis/mutations/friend/deleteFriend.ts b/src/apis/mutations/friend/deleteFriend.ts new file mode 100644 index 0000000..670a0f7 --- /dev/null +++ b/src/apis/mutations/friend/deleteFriend.ts @@ -0,0 +1,27 @@ +import axiosInstance from "@/apis/axios"; +import type { + DeleteSendFriendRequest, + DeleteSendFriendResponse, + DeleteCancelFriendRequest, + DeleteCancelFriendResponse, +} from "@/types/friend"; + +export const deleteSendFriend = async ( + data: DeleteSendFriendRequest +): Promise => { + const { friendId } = data; + const response = await axiosInstance.delete( + `/api/v1/friends/request/${friendId}` + ); + return response.data; +}; + +export const deleteCancelFriend = async ( + data: DeleteCancelFriendRequest +): Promise => { + const { friendId } = data; + const response = await axiosInstance.delete( + `/api/v1/friends/${friendId}/cancel` + ); + return response.data; +}; diff --git a/src/apis/mutations/friend/postFriend.ts b/src/apis/mutations/friend/postFriend.ts new file mode 100644 index 0000000..5489342 --- /dev/null +++ b/src/apis/mutations/friend/postFriend.ts @@ -0,0 +1,55 @@ +import axiosInstance from "@/apis/axios"; +import type { + PostAcceptFriendRequest, + PostAcceptFriendResponse, + PostRecoverFriendRequest, + PostRecoverFriendResponse, + PostRejectFriendRequest, + PostRejectFriendResponse, + PostSendFriendRequest, + PostSendFriendResponse, +} from "@/types/friend"; + +export const postRejectFriend = async ( + data: PostRejectFriendRequest +): Promise => { + const { friendId, ...body } = data; + const response = await axiosInstance.post( + `/api/v1/friends/${friendId}/reject`, + body + ); + return response.data; +}; + +export const postRecoverFriend = async ( + data: PostRecoverFriendRequest +): Promise => { + const { friendId, ...body } = data; + const response = await axiosInstance.post( + `/api/v1/friends/${friendId}/recover`, + body + ); + return response.data; +}; + +export const postAcceptFriend = async ( + data: PostAcceptFriendRequest +): Promise => { + const { friendId, ...body } = data; + const response = await axiosInstance.post( + `/api/v1/friends/${friendId}/accept`, + body + ); + return response.data; +}; + +export const postSendFriend = async ( + data: PostSendFriendRequest +): Promise => { + const { friendId, ...body } = data; + const response = await axiosInstance.post( + `/api/v1/friends/request/${friendId}`, + body + ); + return response.data; +}; diff --git a/src/apis/mutations/friend/useDeleteFriend.ts b/src/apis/mutations/friend/useDeleteFriend.ts new file mode 100644 index 0000000..6c33821 --- /dev/null +++ b/src/apis/mutations/friend/useDeleteFriend.ts @@ -0,0 +1,49 @@ +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { + deleteSendFriend, + deleteCancelFriend, +} from "@/apis/mutations/friend/deleteFriend"; +import { queryKeys } from "@/constants/queryKeys"; +import type { ApiError, ApiErrorBody } from "@/types/error"; +import type { + DeleteSendFriendRequest, + DeleteSendFriendResponse, + DeleteCancelFriendRequest, + DeleteCancelFriendResponse, +} from "@/types/friend"; + +export const useDeleteSendFriend = () => { + const queryClient = useQueryClient(); + + return useMutation< + DeleteSendFriendResponse, + ApiError, + DeleteSendFriendRequest + >({ + mutationFn: (data) => deleteSendFriend(data), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: queryKeys.friend.all }); + }, + onError: (error) => { + console.log(error); + }, + }); +}; + +export const useDeleteCancelFriend = () => { + const queryClient = useQueryClient(); + + return useMutation< + DeleteCancelFriendResponse, + ApiError, + DeleteCancelFriendRequest + >({ + mutationFn: (data) => deleteCancelFriend(data), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: queryKeys.friend.all }); + }, + onError: (error) => { + console.log(error); + }, + }); +}; diff --git a/src/apis/mutations/friend/usePostFriend.ts b/src/apis/mutations/friend/usePostFriend.ts new file mode 100644 index 0000000..233ab44 --- /dev/null +++ b/src/apis/mutations/friend/usePostFriend.ts @@ -0,0 +1,98 @@ +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { + postRejectFriend, + postRecoverFriend, + postAcceptFriend, + postSendFriend, +} from "@/apis/mutations/friend/postFriend"; +import { queryKeys } from "@/constants/queryKeys"; +import type { ApiError, ApiErrorBody } from "@/types/error"; +import type { + PostRejectFriendRequest, + PostRejectFriendResponse, + PostRecoverFriendRequest, + PostRecoverFriendResponse, + PostAcceptFriendRequest, + PostAcceptFriendResponse, + PostSendFriendRequest, + PostSendFriendResponse, +} from "@/types/friend"; + +export const usePostRejectFriend = () => { + const queryClient = useQueryClient(); + + return useMutation< + PostRejectFriendResponse, + ApiError, + PostRejectFriendRequest + >({ + mutationFn: (data) => postRejectFriend(data), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: queryKeys.friend.all }); + }, + onError: (error) => { + console.log(error); + }, + }); +}; + +export const usePostRecoverFriend = () => { + const queryClient = useQueryClient(); + + return useMutation< + PostRecoverFriendResponse, + ApiError, + PostRecoverFriendRequest + >({ + mutationFn: (data) => postRecoverFriend(data), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: queryKeys.friend.all }); + }, + onError: (error) => { + console.log(error); + }, + }); +}; + +export const usePostAcceptFriend = () => { + const queryClient = useQueryClient(); + + return useMutation< + PostAcceptFriendResponse, + ApiError, + PostAcceptFriendRequest + >({ + mutationFn: (data) => postAcceptFriend(data), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: queryKeys.friend.all }); + }, + onError: (error) => { + console.log(error); + }, + }); +}; + +type UsePostSendFriendOptions = { + onSuccess?: () => void; + onError?: (error: ApiError) => void; +}; + +export const usePostSendFriend = (options: UsePostSendFriendOptions = {}) => { + const queryClient = useQueryClient(); + + return useMutation< + PostSendFriendResponse, + ApiError, + PostSendFriendRequest + >({ + mutationFn: (data) => postSendFriend(data), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: queryKeys.friend.all }); + options.onSuccess?.(); + }, + onError: (error) => { + console.error("์นœ๊ตฌ ์š”์ฒญ ์‹คํŒจ:", error); + options.onError?.(error); + }, + }); +}; diff --git a/src/apis/mutations/gallery/deleteGallery.ts b/src/apis/mutations/gallery/deleteGallery.ts new file mode 100644 index 0000000..374dcbe --- /dev/null +++ b/src/apis/mutations/gallery/deleteGallery.ts @@ -0,0 +1,20 @@ +import axiosInstance from "@/apis/axios"; + +export type DeleteGalleryRequest = { + galleryIds: Array; +}; + +export type DeleteGalleryResponse = void; + +export async function deleteGalleryApi( + archiveId: string | number, + payload: DeleteGalleryRequest +): Promise { + const url = `/api/v1/gallery/${archiveId}`; + const res = await axiosInstance.delete(url, { + data: payload, + }); + return res.data; +} + +export default deleteGalleryApi; diff --git a/src/apis/mutations/gallery/registerGallery.ts b/src/apis/mutations/gallery/registerGallery.ts new file mode 100644 index 0000000..9bf34d9 --- /dev/null +++ b/src/apis/mutations/gallery/registerGallery.ts @@ -0,0 +1,23 @@ +import axiosInstance from "@/apis/axios"; + +export type RegisterGalleryRequest = { + fileIds: number[]; +}; + +export type RegisterGalleryResponse = { + createdCount?: number; + archiveId?: number; +}; + +export async function registerGalleryApi( + archiveId: string | number, + payload: RegisterGalleryRequest +): Promise { + const res = await axiosInstance.post( + `/api/v1/gallery/${archiveId}`, + payload + ); + return res.data; +} + +export default registerGalleryApi; diff --git a/src/apis/mutations/gallery/updateGalleryTitle.ts b/src/apis/mutations/gallery/updateGalleryTitle.ts new file mode 100644 index 0000000..735c189 --- /dev/null +++ b/src/apis/mutations/gallery/updateGalleryTitle.ts @@ -0,0 +1,19 @@ +import axiosInstance from "@/apis/axios"; + +export type UpdateGalleryTitlePayload = { + title: string; +}; + +export async function updateGalleryTitleApi( + archiveId: string | number, + payload: UpdateGalleryTitlePayload +) { + const id = String(archiveId); + const url = `/api/v1/gallery/${id}`; + const res = await axiosInstance.patch(url, payload, { + headers: { "Content-Type": "application/json", Accept: "application/json" }, + }); + return res.data; +} + +export default updateGalleryTitleApi; diff --git a/src/apis/mutations/ticket/deleteTicket.ts b/src/apis/mutations/ticket/deleteTicket.ts new file mode 100644 index 0000000..9966b2d --- /dev/null +++ b/src/apis/mutations/ticket/deleteTicket.ts @@ -0,0 +1,12 @@ +import axiosInstance from "@/apis/axios"; +import type { DeleteTicketRequest, DeleteTicketResponse } from "@/types/ticket"; + +export const deleteTicket = async ( + data: DeleteTicketRequest +): Promise => { + const { ticketId } = data; + const response = await axiosInstance.delete( + `/api/v1/tickets/${ticketId}` + ); + return response.data; +}; diff --git a/src/apis/mutations/ticket/patchTicket.ts b/src/apis/mutations/ticket/patchTicket.ts new file mode 100644 index 0000000..50496ec --- /dev/null +++ b/src/apis/mutations/ticket/patchTicket.ts @@ -0,0 +1,31 @@ +import axiosInstance from "@/apis/axios"; +import type { + UpdateTicketBookRequest, + UpdateTicketBookResponse, + UpdateTicketRequest, + UpdateTicketResponse, +} from "@/types/ticket"; + +export const updateTicket = async ( + data: UpdateTicketRequest +): Promise => { + const { ticketId, ...body } = data; + const response = await axiosInstance.patch( + `/api/v1/tickets/${ticketId}`, + body + ); + return response.data; +}; + +export const updateTicketBook = async ( + data: UpdateTicketBookRequest +): Promise => { + const { archiveId, title } = data; + const response = await axiosInstance.patch( + `/api/v1/tickets/book/${archiveId}`, + { + title, + } + ); + return response.data; +}; diff --git a/src/apis/mutations/ticket/postTicket.ts b/src/apis/mutations/ticket/postTicket.ts new file mode 100644 index 0000000..0320fb1 --- /dev/null +++ b/src/apis/mutations/ticket/postTicket.ts @@ -0,0 +1,13 @@ +import axiosInstance from "@/apis/axios"; +import type { AddTicketRequest, AddTicketResponse } from "@/types/ticket"; + +export const addTicket = async ( + data: AddTicketRequest +): Promise => { + const { archiveId, ...body } = data; + const response = await axiosInstance.post( + `/api/v1/tickets/${archiveId}`, + body + ); + return response.data; +}; diff --git a/src/apis/mutations/ticket/useDeleteTicket.ts b/src/apis/mutations/ticket/useDeleteTicket.ts new file mode 100644 index 0000000..e9b3f9b --- /dev/null +++ b/src/apis/mutations/ticket/useDeleteTicket.ts @@ -0,0 +1,24 @@ +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { deleteTicket } from "@/apis/mutations/ticket/deleteTicket"; +import { queryKeys } from "@/constants/queryKeys"; +import type { ApiError, ApiErrorBody } from "@/types/error"; +import type { DeleteTicketRequest, DeleteTicketResponse } from "@/types/ticket"; + +export const useDeleteTicket = () => { + const queryClient = useQueryClient(); + + return useMutation< + DeleteTicketResponse, + ApiError, + DeleteTicketRequest + >({ + mutationFn: (data) => deleteTicket(data), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: queryKeys.ticket.all }); + queryClient.invalidateQueries({ queryKey: queryKeys.ticketBook.all }); + }, + onError: (error) => { + console.log(error); + }, + }); +}; diff --git a/src/apis/mutations/ticket/usePatchTicket.ts b/src/apis/mutations/ticket/usePatchTicket.ts new file mode 100644 index 0000000..3d009b8 --- /dev/null +++ b/src/apis/mutations/ticket/usePatchTicket.ts @@ -0,0 +1,52 @@ +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { + updateTicket, + updateTicketBook, +} from "@/apis/mutations/ticket/patchTicket"; +import { queryKeys } from "@/constants/queryKeys"; +import type { ApiError, ApiErrorBody } from "@/types/error"; +import type { + UpdateTicketBookRequest, + UpdateTicketBookResponse, + UpdateTicketRequest, + UpdateTicketResponse, +} from "@/types/ticket"; + +export const useUpdateTicket = () => { + const queryClient = useQueryClient(); + + return useMutation< + UpdateTicketResponse, + ApiError, + UpdateTicketRequest + >({ + mutationFn: (data) => updateTicket(data), + onSuccess: (data, variables) => { + queryClient.invalidateQueries({ queryKey: queryKeys.ticketBook.all }); + queryClient.setQueryData( + queryKeys.ticket.detail(variables.ticketId), + data + ); + }, + onError: (error) => { + console.log(error); + }, + }); +}; + +export const useUpdateTicketBook = () => { + const queryClient = useQueryClient(); + return useMutation< + UpdateTicketBookResponse, + ApiError, + UpdateTicketBookRequest + >({ + mutationFn: (data) => updateTicketBook(data), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: queryKeys.ticketBook.all }); + }, + onError: (error) => { + console.log(error); + }, + }); +}; diff --git a/src/apis/mutations/ticket/usePostTicket.ts b/src/apis/mutations/ticket/usePostTicket.ts new file mode 100644 index 0000000..941ad96 --- /dev/null +++ b/src/apis/mutations/ticket/usePostTicket.ts @@ -0,0 +1,24 @@ +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { addTicket } from "@/apis/mutations/ticket/postTicket"; +import { queryKeys } from "@/constants/queryKeys"; +import type { ApiError, ApiErrorBody } from "@/types/error"; +import type { AddTicketRequest, AddTicketResponse } from "@/types/ticket"; + +export const useAddTicket = () => { + const queryClient = useQueryClient(); + + return useMutation< + AddTicketResponse, + ApiError, + AddTicketRequest + >({ + mutationFn: (data) => addTicket(data), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: queryKeys.ticket.all }); + queryClient.invalidateQueries({ queryKey: queryKeys.ticketBook.all }); + }, + onError: (error) => { + console.log(error); + }, + }); +}; diff --git a/src/apis/queries/archive/getArchive.ts b/src/apis/queries/archive/getArchive.ts new file mode 100644 index 0000000..0183b01 --- /dev/null +++ b/src/apis/queries/archive/getArchive.ts @@ -0,0 +1,35 @@ +import axiosInstance from "@/apis/axios"; +import { Sort } from "@/enums/sort"; +import type { ArchiveResponse, GetArchiveRequest, GetArchiveResponse, } from "@/types/archive"; + +// ์‚ฌ์šฉ์ž์˜ ์•„์นด์ด๋ธŒ ๋ชฉ๋ก ์กฐํšŒ +export const GetUserArchive = async (userId: number, params: GetArchiveRequest): Promise => { + const response = await axiosInstance.get(`/api/v1/archives/users/${userId}`, { + params: { + page: params?.page ?? 0, // default 0 + size: params?.size ?? 10, // default 10 + sort: params?.sort ?? Sort.CREATED_AT, // default "createdAt" + direction: params?.direction ?? "DESC", // default "DESC" + }, + }); + return response.data; +}; + +// ์•„์นด์ด๋ธŒ ์ƒ์„ธ ์กฐํšŒ +export const GetArchiveDetail = async (archiveId: number): Promise => { + const response = await axiosInstance.get(`/api/v1/archives/${archiveId}`); + return response.data; +} + +// ์ „์—ญ ์•„์นด์ด๋ธŒ ํ”ผ๋“œ ์กฐํšŒ -> ๊ณต๊ฐœ๋œ ์•„์นด์ด๋ธŒ ์กฐํšŒ (ํ”ผ๋“œ ํŽ˜์ด์ง€์—์„œ ์‚ฌ์šฉ) +export const GetArchiveFeed = async (params: GetArchiveRequest): Promise => { + const response = await axiosInstance.get(`/api/v1/archives/feed`, { + params: { + page: params?.page ?? 0, // default 0 + size: params?.size ?? 10, // default 10 + sort: params?.sort ?? Sort.CREATED_AT, // default "createdAt" + direction: params?.direction ?? "DESC", // default "DESC" + }, + }); + return response.data; +} \ No newline at end of file diff --git a/src/apis/queries/archive/useGetArchive.ts b/src/apis/queries/archive/useGetArchive.ts new file mode 100644 index 0000000..eaf3b6b --- /dev/null +++ b/src/apis/queries/archive/useGetArchive.ts @@ -0,0 +1,17 @@ +import { useQuery } from "@tanstack/react-query"; +import { GetArchiveDetail } from "@/apis/queries/archive/getArchive"; +import { queryKeys } from "@/constants/queryKeys"; +import type { ArchiveResponse } from "@/types/archive"; + +type UseGetArchiveParams = { + archiveId: number; +}; + +export const useGetArchive = (params: UseGetArchiveParams) => { + return useQuery({ + queryKey: queryKeys.archive.detail(params.archiveId), + queryFn: () => GetArchiveDetail(params.archiveId), + enabled: !!params.archiveId, + retry: false, + }); +}; diff --git a/src/apis/queries/auth/user.ts b/src/apis/queries/auth/user.ts new file mode 100644 index 0000000..8dbedbe --- /dev/null +++ b/src/apis/queries/auth/user.ts @@ -0,0 +1,13 @@ +import { axiosInstance } from "@/apis/axios"; +import type { SocialLoginGetMeResponse } from "@/types/auth/login"; + +/** + * ํ˜„์žฌ ๋กœ๊ทธ์ธ๋œ ์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒ + * GET /api/v1/auth/me + */ +export const socialLoginGetMe = async (): Promise => { + const response = await axiosInstance.get( + "/api/v1/auth/social/me" + ); + return response.data; +}; diff --git a/src/apis/queries/calendar/Calendar.ts b/src/apis/queries/calendar/Calendar.ts new file mode 100644 index 0000000..4dfd0c3 --- /dev/null +++ b/src/apis/queries/calendar/Calendar.ts @@ -0,0 +1,22 @@ +import axiosInstance from "@/apis/axios"; +import type { EventResponse, StickerResponse } from "@/types/calendar"; + +export const getMonthlyEvents = async (archiveId: number, year: number, month: number): Promise => { + const response = await axiosInstance.get(`/api/v1/events/monthly/${archiveId}`, { + params: { + year, + month, + }, + }); + return response.data; +}; + +export const getMonthlyStickers = async (archiveId: number, year: number, month: number): Promise => { + const response = await axiosInstance.get(`/api/v1/stickers/monthly/${archiveId}`, { + params: { + year, + month, + }, + }); + return response.data; +}; \ No newline at end of file diff --git a/src/apis/queries/community/getComments.ts b/src/apis/queries/community/getComments.ts new file mode 100644 index 0000000..088b883 --- /dev/null +++ b/src/apis/queries/community/getComments.ts @@ -0,0 +1,55 @@ +import axiosInstance from "@/apis/axios"; +import type { AxiosResponse } from "axios"; + +export type ServerCommentDto = { + commentId: number; + content: string; + userId?: number | string; + nickname?: string; + createdAt?: string; + deleted?: boolean; + children?: any; +}; + +export type GetCommentsResponse = { + content: ServerCommentDto[]; + hasNext?: boolean; + totalCount?: number; +}; + +export type GetCommentsOptions = { + page?: number; // 0-based ๊ฐ€๋Šฅ (์„œ๋ฒ„ ์ŠคํŽ™์— ๋งž์ถฐ ํ˜ธ์ถœ) + size?: number; + sort?: string; + lastCommentId?: number | string; +}; + +export async function fetchPostComments( + postId: string | number, + options: GetCommentsOptions = {} +): Promise { + if (!postId) throw new Error("postId is required"); + + const { page = 0, size = 20, sort, lastCommentId } = options; + + const params: Record = { + page, + size, + }; + if (sort) params.sort = sort; + if (lastCommentId !== undefined && lastCommentId !== null) { + params.lastCommentId = lastCommentId; + } + + try { + const res: AxiosResponse = await axiosInstance.get( + `/api/v1/posts/${postId}/comments`, + { params } + ); + return res.data; + } catch (err) { + throw err; + } +} + +export default fetchPostComments; diff --git a/src/apis/queries/community/getDetailPost.ts b/src/apis/queries/community/getDetailPost.ts new file mode 100644 index 0000000..ca69a70 --- /dev/null +++ b/src/apis/queries/community/getDetailPost.ts @@ -0,0 +1,32 @@ +import axiosInstance from "@/apis/axios"; + +export type PostFileDto = { + fileId: number; + filename?: string; + cdnUrl?: string; + fileSize?: number; + mediaType?: "IMAGE" | "VIDEO" | string; + mediaRole?: string; + sequence?: number; +}; + +export type PostDetailDto = { + id: number | string; + title: string; + content: string; + category: string; + createdAt?: string; + lastModifiedAt?: string; + files?: PostFileDto[]; + likeCount?: number; + isLiked?: boolean; +}; + +export const fetchPostDetail = async ( + postId: string | number +): Promise => { + const res = await axiosInstance.get(`/api/v1/posts/${postId}`); + return res.data; +}; + +export default fetchPostDetail; diff --git a/src/apis/queries/community/getPost.ts b/src/apis/queries/community/getPost.ts new file mode 100644 index 0000000..cb7b94a --- /dev/null +++ b/src/apis/queries/community/getPost.ts @@ -0,0 +1,101 @@ +import axiosInstance from "@/apis/axios"; +import type { AxiosResponse } from "axios"; +import type { DefaultPaginationResponse } from "@/types/pagination"; + +export type PostItem = { + postId: number; + title: string; + category: string; + summary?: string | null; + thumbnailUrl?: string | null; + writerNickname?: string; + likeCount?: number; + viewCount?: number; + hotScore?: number; + createdAt?: string; + lastModifiedAt?: string; +}; + +export type GetPostsResponse = { + title?: string; + content: PostItem[]; + page: DefaultPaginationResponse; +}; + +type GetPostsOptions = { + page?: number; + size?: number; + category?: string; + sortBy?: "newest" | "popular" | "like" | "hotScore"; + direction?: "ASC" | "DESC"; +}; + +/* UI ์ •๋ ฌ๊ฐ’ -> ์„œ๋ฒ„ sort/direction ๋งคํ•‘ */ +function mapSortOption(sortBy?: string) { + switch (sortBy) { + case "popular": + return { sort: "viewCount", direction: "DESC" }; + case "like": + return { sort: "likeCount", direction: "DESC" }; + case "hotScore": + return { sort: "hotScore", direction: "DESC" }; + case "newest": + default: + return { sort: "createdAt", direction: "DESC" }; + } +} + +/* UI ์นดํ…Œ๊ณ ๋ฆฌ ํ‚ค -> ์„œ๋ฒ„ ์นดํ…Œ๊ณ ๋ฆฌ ํ‚ค ๋งคํ•‘ */ +export function mapCategoryToServer(category?: string) { + if (!category || category === "all") return undefined; + const map: Record = { + idol: "IDOL", + actor: "ACTOR", + musician: "MUSICIAN", + sport: "SPORT", + artist: "ARTIST", + animation: "ANIMATION", + etc: "ETC", + }; + return map[category] ?? category.toUpperCase(); +} + +/* API ํ˜ธ์ถœ ํ•จ์ˆ˜ */ +export async function getPosts( + options: GetPostsOptions = {} +): Promise { + const { + page = 1, + size = 10, + category, + sortBy = "newest", + direction, + } = options; + + const serverPage = Math.max(0, (page ?? 1) - 1); + const mapped = mapSortOption(sortBy); + const sort = mapped.sort; + const dir = direction ?? mapped.direction; + + const params: Record = { + page: serverPage, + size, + sort, + direction: dir, + }; + + const serverCategory = mapCategoryToServer(category); + if (serverCategory !== undefined && serverCategory !== null) { + params.category = serverCategory; + } + + try { + const res: AxiosResponse = await axiosInstance.get( + "/api/v1/posts", + { params } + ); + return res.data; + } catch (err) { + throw err; + } +} diff --git a/src/apis/queries/diary/getDiary.ts b/src/apis/queries/diary/getDiary.ts new file mode 100644 index 0000000..721f616 --- /dev/null +++ b/src/apis/queries/diary/getDiary.ts @@ -0,0 +1,30 @@ +import axiosInstance from "@/apis/axios"; +import type { + GetDiaryBookRequest, + GetDiaryBookResponse, + GetDiaryRequest, + GetDiaryResponse, +} from "@/types/diary"; + +export const getDiary = async ( + data: GetDiaryRequest +): Promise => { + const { diaryId } = data; + const response = await axiosInstance.get( + `/api/v1/diary/${diaryId}` + ); + return response.data; +}; + +export const getDiaryBook = async ( + data: GetDiaryBookRequest +): Promise => { + const { archiveId, page, size } = data; + const response = await axiosInstance.get( + `/api/v1/diary/book/${archiveId}`, + { + params: { page, size }, + } + ); + return response.data; +}; diff --git a/src/apis/queries/diary/useGetDiary.ts b/src/apis/queries/diary/useGetDiary.ts new file mode 100644 index 0000000..65a836f --- /dev/null +++ b/src/apis/queries/diary/useGetDiary.ts @@ -0,0 +1,31 @@ +import { useQuery } from "@tanstack/react-query"; +import { getDiary, getDiaryBook } from "@/apis/queries/diary/getDiary"; +import { queryKeys } from "@/constants/queryKeys"; +import type { + GetDiaryRequest, + GetDiaryResponse, + GetDiaryBookRequest, + GetDiaryBookResponse, +} from "@/types/diary"; + +export const useGetDiary = (params: GetDiaryRequest) => { + return useQuery({ + queryKey: queryKeys.diary.detail(params.diaryId), + queryFn: () => getDiary(params), + enabled: !!params.diaryId, + retry: false, + }); +}; + +export const useGetDiaryBook = (params: GetDiaryBookRequest) => { + return useQuery({ + queryKey: [ + ...queryKeys.diaryBook.detail(params.archiveId), + params.page, + params.size, + ], + queryFn: () => getDiaryBook(params), + enabled: !!params.archiveId, + retry: false, + }); +}; diff --git a/src/apis/queries/friend/getFriend.ts b/src/apis/queries/friend/getFriend.ts new file mode 100644 index 0000000..c78a09e --- /dev/null +++ b/src/apis/queries/friend/getFriend.ts @@ -0,0 +1,45 @@ +import axiosInstance from "@/apis/axios"; +import type { + GetFriendListRequest, + GetFriendListResponse, + GetSendFriendListRequest, + GetSendFriendListResponse, + GetStatusFriendRequest, + GetStatusFriendResponse, +} from "@/types/friend"; + +export const getFriendList = async ( + data: GetFriendListRequest +): Promise => { + const { lastFriendId, lastAcceptedAt, size } = data; + const response = await axiosInstance.get( + `/api/v1/friends`, + { + params: { lastFriendId, lastAcceptedAt, size }, + } + ); + return response.data; +}; + +export const getStatusFriend = async ( + data: GetStatusFriendRequest +): Promise => { + const { friendId } = data; + const response = await axiosInstance.get( + `/api/v1/friends/${friendId}/status` + ); + return response.data; +}; + +export const getSendFriendList = async ( + data: GetSendFriendListRequest +): Promise => { + const { type, lastId, lastCreatedAt, size } = data; + const response = await axiosInstance.get( + `/api/v1/friends/requests`, + { + params: { type, lastId, lastCreatedAt, size }, + } + ); + return response.data; +}; diff --git a/src/apis/queries/friend/useGetFriend.ts b/src/apis/queries/friend/useGetFriend.ts new file mode 100644 index 0000000..15e348d --- /dev/null +++ b/src/apis/queries/friend/useGetFriend.ts @@ -0,0 +1,106 @@ +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { + getFriendList, + getSendFriendList, + getStatusFriend, +} from "@/apis/queries/friend/getFriend"; +import { queryKeys } from "@/constants/queryKeys"; +import type { FriendRequestType } from "@/enums/friendRequestType"; +import type { + GetFriendListRequest, + GetFriendListResponse, + GetSendFriendListRequest, + GetSendFriendListResponse, + GetStatusFriendRequest, + GetStatusFriendResponse, +} from "@/types/friend"; + +export const useGetFriendList = (params: GetFriendListRequest) => { + return useQuery({ + queryKey: queryKeys.friend.list(), + queryFn: () => getFriendList(params), + retry: false, + }); +}; + +export const useGetStatusFriend = ( + params: GetStatusFriendRequest & { refetchInterval?: number } +) => { + const { refetchInterval, ...queryParams } = params; + return useQuery({ + queryKey: queryKeys.friend.status(queryParams.friendId), + queryFn: () => getStatusFriend(queryParams), + enabled: !!queryParams.friendId, + retry: false, + refetchInterval, + }); +}; + +export const useGetSendFriendList = (params: GetSendFriendListRequest) => { + return useQuery({ + queryKey: queryKeys.friend.sendList(params.type), + queryFn: () => getSendFriendList(params), + retry: false, + }); +}; + +export const useGetFriendListInfinite = (params: { + size?: number; + refetchInterval?: number; + enabled?: boolean; +}) => { + const { refetchInterval, enabled = true, ...queryParams } = params; + return useInfiniteQuery({ + queryKey: ["friend", "list", "infinite"], + queryFn: ({ pageParam }) => { + const { lastFriendId, lastAcceptedAt } = pageParam as { + lastFriendId?: number; + lastAcceptedAt?: string; + }; + return getFriendList({ ...queryParams, lastFriendId, lastAcceptedAt }); + }, + initialPageParam: {}, + getNextPageParam: (lastPage) => { + if (!lastPage.hasNext || lastPage.content.length === 0) return undefined; + const lastFriend = lastPage.content[lastPage.content.length - 1]; + return { + lastFriendId: lastFriend.userId, + lastAcceptedAt: lastFriend.acceptedAt, + }; + }, + retry: false, + refetchInterval, + enabled, + }); +}; + +export const useGetSendFriendListInfinite = (params: { + type: FriendRequestType; + size?: number; + refetchInterval?: number; + enabled?: boolean; +}) => { + const { refetchInterval, enabled = true, ...queryParams } = params; + return useInfiniteQuery({ + queryKey: ["friend", "sendList", "infinite", queryParams.type], + queryFn: ({ pageParam }) => { + const { lastId, lastCreatedAt } = pageParam as { + lastId?: number; + lastCreatedAt?: string; + }; + return getSendFriendList({ ...queryParams, lastId, lastCreatedAt }); + }, + initialPageParam: {}, + getNextPageParam: (lastPage) => { + if (!lastPage.hasNext || lastPage.content.length === 0) return undefined; + const lastItem = lastPage.content[lastPage.content.length - 1]; + return { + lastId: lastItem.requestId, + lastCreatedAt: lastItem.createdAt, + }; + }, + retry: false, + refetchInterval, + enabled, + }); +}; diff --git a/src/apis/queries/gallery/getGallery.ts b/src/apis/queries/gallery/getGallery.ts new file mode 100644 index 0000000..79a10db --- /dev/null +++ b/src/apis/queries/gallery/getGallery.ts @@ -0,0 +1,58 @@ +import axiosInstance from "@/apis/axios"; +import type { DefaultPaginationResponse } from "@/types/pagination"; + +export type GalleryItemDto = { + id: number | string; + thumbnailUrl?: string | null; + originalUrl?: string; + fileName?: string; + createdAt?: string; + lastModifiedAt?: string; +}; + +export type GalleryListResponse = { + title?: string; + content: GalleryItemDto[]; + page: DefaultPaginationResponse; +}; + +export type FetchGalleryParams = { + archiveId: string | number; + page?: number; // 0-based + size?: number; + sort?: string; + direction?: "ASC" | "DESC"; +}; + +const DEFAULTS = { + page: 0, + size: 9, + sort: "createdAt", + direction: "DESC", +}; + +export async function fetchGallery( + params: FetchGalleryParams, + signal?: AbortSignal +): Promise { + const { + archiveId, + page = DEFAULTS.page, + size = DEFAULTS.size, + sort = DEFAULTS.sort, + direction = DEFAULTS.direction, + } = params; + + const url = `/api/v1/gallery/${archiveId}?page=${page}&size=${size}&sort=${encodeURIComponent( + sort + )}&direction=${encodeURIComponent(direction)}`; + + const res = await axiosInstance.get(url, { + headers: { Accept: "application/json" }, + signal, + }); + + return res.data; +} + +export default fetchGallery; diff --git a/src/apis/queries/sse/subscribe.ts b/src/apis/queries/sse/subscribe.ts new file mode 100644 index 0000000..2578f85 --- /dev/null +++ b/src/apis/queries/sse/subscribe.ts @@ -0,0 +1,5 @@ +const BASE_URL = import.meta.env.VITE_API_BASE; + +export const SSE_ENDPOINTS = { + SUBSCRIBE: `${BASE_URL}/api/v1/notifications/subscribe`, +} as const; diff --git a/src/apis/queries/sse/useSseSubscribe.ts b/src/apis/queries/sse/useSseSubscribe.ts new file mode 100644 index 0000000..67b7243 --- /dev/null +++ b/src/apis/queries/sse/useSseSubscribe.ts @@ -0,0 +1,63 @@ +import { useRef, useEffect } from "react"; +import { useQueryClient } from "@tanstack/react-query"; +import { useEventSource } from "@/hooks/useEventSource"; +import { useNotificationStore } from "@/store/useNotificationStore"; +import { SseConnectionStatus } from "@/enums/sseConnectionStatus"; +import { SseEventType } from "@/enums/sseEventType"; +import { queryKeys } from "@/constants/queryKeys"; +import { SSE_ENDPOINTS } from "@/apis/queries/sse/subscribe"; +import type { SseNotification } from "@/types/sse"; + +type UseSseSubscribeOptions = { + enabled?: boolean; + onMessage?: (data: SseNotification) => void; + onError?: (error: Event) => void; + onOpen?: () => void; + reconnectOnError?: boolean; + reconnectInterval?: number; +}; + +export const useSseSubscribe = (options: UseSseSubscribeOptions = {}) => { + const { onMessage, ...restOptions } = options; + const queryClient = useQueryClient(); + const onMessageRef = useRef(onMessage); + + const { addNotification, setConnectionStatus } = useNotificationStore(); + + useEffect(() => { + onMessageRef.current = onMessage; + }); + + const handleMessage = (data: SseNotification) => { + // 1. Store์— ์•Œ๋ฆผ ์ถ”๊ฐ€ + addNotification(data); + + // 2. Friend query invalidation + console.log("[SSE] ์ฟผ๋ฆฌ ์ดˆ๊ธฐํ™”:", data.type); + queryClient.invalidateQueries({ queryKey: queryKeys.friend.all }); + + // 3. ์‚ฌ์šฉ์ž ์ฝœ๋ฐฑ ์‹คํ–‰ + onMessageRef.current?.(data); + }; + + const result = useEventSource({ + url: SSE_ENDPOINTS.SUBSCRIBE, + onMessage: handleMessage, + onOpen: restOptions.onOpen, + onError: restOptions.onError, + enabled: restOptions.enabled, + reconnectOnError: restOptions.reconnectOnError, + reconnectInterval: restOptions.reconnectInterval, + // TODO: ๋ฐฑ์—”๋“œ์—์„œ FRIEND_DELETE ์ด๋ฒคํŠธ ์ถ”๊ฐ€ ์‹œ SseEventType.FRIEND_DELETE ์ถ”๊ฐ€ + eventTypes: [SseEventType.FRIEND_REQUEST, SseEventType.FRIEND_ACCEPT], + }); + + // ์—ฐ๊ฒฐ ์ƒํƒœ ๋™๊ธฐํ™” + useEffect(() => { + setConnectionStatus(result.status); + }, [result.status, setConnectionStatus]); + + return result; +}; + +export { SseConnectionStatus }; diff --git a/src/apis/queries/ticket/getTicket.ts b/src/apis/queries/ticket/getTicket.ts new file mode 100644 index 0000000..deb0c00 --- /dev/null +++ b/src/apis/queries/ticket/getTicket.ts @@ -0,0 +1,30 @@ +import axiosInstance from "@/apis/axios"; +import type { + GetTicketBookRequest, + GetTicketBookResponse, + GetTicketRequest, + GetTicketResponse, +} from "@/types/ticket"; + +export const getTicket = async ( + data: GetTicketRequest +): Promise => { + const { ticketId } = data; + const response = await axiosInstance.get( + `/api/v1/tickets/${ticketId}` + ); + return response.data; +}; + +export const getTicketBook = async ( + data: GetTicketBookRequest +): Promise => { + const { archiveId, page, size, sort, direction } = data; + const response = await axiosInstance.get( + `/api/v1/tickets/book/${archiveId}`, + { + params: { page, size, sort, direction }, + } + ); + return response.data; +}; diff --git a/src/apis/queries/ticket/useGetTicket.ts b/src/apis/queries/ticket/useGetTicket.ts new file mode 100644 index 0000000..89bd2fa --- /dev/null +++ b/src/apis/queries/ticket/useGetTicket.ts @@ -0,0 +1,33 @@ +import { useQuery } from "@tanstack/react-query"; +import { getTicket, getTicketBook } from "@/apis/queries/ticket/getTicket"; +import { queryKeys } from "@/constants/queryKeys"; +import type { + GetTicketRequest, + GetTicketResponse, + GetTicketBookRequest, + GetTicketBookResponse, +} from "@/types/ticket"; + +export const useGetTicket = (params: GetTicketRequest) => { + return useQuery({ + queryKey: queryKeys.ticket.detail(params.ticketId), + queryFn: () => getTicket(params), + enabled: !!params.ticketId, + retry: false, + }); +}; + +export const useGetTicketBook = (params: GetTicketBookRequest) => { + return useQuery({ + queryKey: [ + ...queryKeys.ticketBook.detail(params.archiveId), + params.page, + params.size, + params.sort, + params.direction, + ], + queryFn: () => getTicketBook(params), + enabled: !!params.archiveId, + retry: false, + }); +}; diff --git a/src/apis/queries/user/getUser.ts b/src/apis/queries/user/getUser.ts new file mode 100644 index 0000000..3909ae5 --- /dev/null +++ b/src/apis/queries/user/getUser.ts @@ -0,0 +1,21 @@ +import axiosInstance from "@/apis/axios"; +import type { + GetMeResponse, + GetUserRequest, + GetUserResponse, +} from "@/types/user"; + +export const getMe = async (): Promise => { + const response = await axiosInstance.get(`/api/v1/users/me`); + return response.data; +}; + +export const getUser = async ( + data: GetUserRequest +): Promise => { + const { userId } = data; + const response = await axiosInstance.get( + `/api/v1/users/${userId}` + ); + return response.data; +}; diff --git a/src/apis/queries/user/useGetUser.ts b/src/apis/queries/user/useGetUser.ts new file mode 100644 index 0000000..35a0153 --- /dev/null +++ b/src/apis/queries/user/useGetUser.ts @@ -0,0 +1,21 @@ +import { useQuery } from "@tanstack/react-query"; +import { queryKeys } from "@/constants/queryKeys"; +import type { GetMeResponse, GetUserRequest, GetUserResponse } from "@/types/user"; +import { getMe, getUser } from "./getUser"; + +export const useGetMe = () => { + return useQuery({ + queryKey: queryKeys.user.me(), + queryFn: getMe, + retry: false, + }); +}; + +export const useGetUser = (params: GetUserRequest) => { + return useQuery({ + queryKey: queryKeys.user.detail(params.userId), + queryFn: () => getUser(params), + enabled: !!params.userId, + retry: false, + }); +}; diff --git a/src/assets/icon/DiaryFooterImage.tsx b/src/assets/icon/DiaryFooterImage.tsx new file mode 100644 index 0000000..fecfc2d --- /dev/null +++ b/src/assets/icon/DiaryFooterImage.tsx @@ -0,0 +1,18 @@ +const DiaryFooterImage = () => { + return ( + + + + ); +}; + +export default DiaryFooterImage; diff --git a/src/assets/icon/DiaryImageCard.tsx b/src/assets/icon/DiaryImageCard.tsx new file mode 100644 index 0000000..3c32845 --- /dev/null +++ b/src/assets/icon/DiaryImageCard.tsx @@ -0,0 +1,378 @@ +type Props = { + className?: string; + size?: number | string; + ariaLabel?: string; + ariaHidden?: boolean; + onClick?: () => void; + color?: string; +}; + +const DiaryImageCard = ({ + className, + size, + ariaLabel, + ariaHidden = true, + onClick, + color = "#99CCFF", +}: Props) => { + const style = + typeof size === "number" + ? { width: size, height: size } + : { width: size, height: size }; + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default DiaryImageCard; diff --git a/src/assets/icon/DiaryMemo.tsx b/src/assets/icon/DiaryMemo.tsx new file mode 100644 index 0000000..da067b0 --- /dev/null +++ b/src/assets/icon/DiaryMemo.tsx @@ -0,0 +1,83 @@ +import { getDiaryMemoColor } from "@/constants/diaryColors"; + +type DiaryMemoProps = { + color?: string; + className?: string; +}; + +const DiaryMemo = ({ color = "#D5E8F9", className = "" }: DiaryMemoProps) => { + const fillColor = getDiaryMemoColor(color); + + return ( + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default DiaryMemo; diff --git a/src/assets/icon/Logo.tsx b/src/assets/icon/Logo.tsx index 02d2003..35d5ec7 100644 --- a/src/assets/icon/Logo.tsx +++ b/src/assets/icon/Logo.tsx @@ -2,188 +2,118 @@ const Logo = () => { return ( - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - + + - + - - - ); diff --git a/src/assets/icon/badge/Fans.tsx b/src/assets/icon/badge/Fans.tsx new file mode 100644 index 0000000..cd431a7 --- /dev/null +++ b/src/assets/icon/badge/Fans.tsx @@ -0,0 +1,13 @@ +const FansBadge = () => { + return ( + + + + + + + + ) +} + +export default FansBadge; \ No newline at end of file diff --git a/src/assets/icon/badge/Master.tsx b/src/assets/icon/badge/Master.tsx new file mode 100644 index 0000000..752b183 --- /dev/null +++ b/src/assets/icon/badge/Master.tsx @@ -0,0 +1,71 @@ +const MasterBadge = () => { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} +export default MasterBadge \ No newline at end of file diff --git a/src/assets/icon/badge/Newbie.tsx b/src/assets/icon/badge/Newbie.tsx new file mode 100644 index 0000000..a344cbc --- /dev/null +++ b/src/assets/icon/badge/Newbie.tsx @@ -0,0 +1,11 @@ +const NewbieBadge = () => { + return ( + + + + + + ) +} + +export default NewbieBadge; \ No newline at end of file diff --git a/src/assets/icon/badge/Stan.tsx b/src/assets/icon/badge/Stan.tsx new file mode 100644 index 0000000..2ae8eaa --- /dev/null +++ b/src/assets/icon/badge/Stan.tsx @@ -0,0 +1,66 @@ +const StanBadge = () => { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} + +export default StanBadge; \ No newline at end of file diff --git a/src/assets/icon/badge/Supporter.tsx b/src/assets/icon/badge/Supporter.tsx new file mode 100644 index 0000000..1e1c3ee --- /dev/null +++ b/src/assets/icon/badge/Supporter.tsx @@ -0,0 +1,29 @@ +const SupporterBadge = () => { + return ( + + + + + + + + + + + + + + + + + + + + + + + + ) +} + +export default SupporterBadge; \ No newline at end of file diff --git a/src/assets/icon/sticker/baseball.svg b/src/assets/icon/sticker/baseball.svg new file mode 100644 index 0000000..0fb0170 --- /dev/null +++ b/src/assets/icon/sticker/baseball.svg @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icon/sticker/cake.svg b/src/assets/icon/sticker/cake.svg new file mode 100644 index 0000000..0ff6087 --- /dev/null +++ b/src/assets/icon/sticker/cake.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icon/sticker/camera.svg b/src/assets/icon/sticker/camera.svg new file mode 100644 index 0000000..257bac0 --- /dev/null +++ b/src/assets/icon/sticker/camera.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/assets/icon/sticker/coffee.svg b/src/assets/icon/sticker/coffee.svg new file mode 100644 index 0000000..70da5f5 --- /dev/null +++ b/src/assets/icon/sticker/coffee.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icon/sticker/display_board.svg b/src/assets/icon/sticker/display_board.svg new file mode 100644 index 0000000..ce60151 --- /dev/null +++ b/src/assets/icon/sticker/display_board.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icon/sticker/giftbox.svg b/src/assets/icon/sticker/giftbox.svg new file mode 100644 index 0000000..d71bd2e --- /dev/null +++ b/src/assets/icon/sticker/giftbox.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/icon/sticker/heart.svg b/src/assets/icon/sticker/heart.svg new file mode 100644 index 0000000..3c55cd7 --- /dev/null +++ b/src/assets/icon/sticker/heart.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icon/sticker/light_stick.svg b/src/assets/icon/sticker/light_stick.svg new file mode 100644 index 0000000..9bdc8d2 --- /dev/null +++ b/src/assets/icon/sticker/light_stick.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icon/sticker/money.svg b/src/assets/icon/sticker/money.svg new file mode 100644 index 0000000..f77fc3f --- /dev/null +++ b/src/assets/icon/sticker/money.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/assets/icon/sticker/musical_note.svg b/src/assets/icon/sticker/musical_note.svg new file mode 100644 index 0000000..1c2968c --- /dev/null +++ b/src/assets/icon/sticker/musical_note.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/icon/sticker/shining.svg b/src/assets/icon/sticker/shining.svg new file mode 100644 index 0000000..4a7cc81 --- /dev/null +++ b/src/assets/icon/sticker/shining.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/icon/sticker/ticket.svg b/src/assets/icon/sticker/ticket.svg new file mode 100644 index 0000000..6887423 --- /dev/null +++ b/src/assets/icon/sticker/ticket.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/diaryBackground.png b/src/assets/images/diaryBackground.png new file mode 100644 index 0000000000000000000000000000000000000000..76e11e5b279495effb9ee54c7f069cf16a985b9f GIT binary patch literal 51425 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

k<#7R(s_#`*i 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 z�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 I3FF}Z1JzJ~asU7T literal 0 HcmV?d00001 diff --git a/src/assets/svgs/diaryFooterImage.svg b/src/assets/svgs/diaryFooterImage.svg new file mode 100644 index 0000000..190ce79 --- /dev/null +++ b/src/assets/svgs/diaryFooterImage.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/svgs/diaryMemo.svg b/src/assets/svgs/diaryMemo.svg new file mode 100644 index 0000000..b438366 --- /dev/null +++ b/src/assets/svgs/diaryMemo.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgs/ticket.svg b/src/assets/svgs/ticket.svg new file mode 100644 index 0000000..07f8292 --- /dev/null +++ b/src/assets/svgs/ticket.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/MainNavbar.tsx b/src/components/MainNavbar.tsx index 3ac3ec5..f3d7b14 100644 --- a/src/components/MainNavbar.tsx +++ b/src/components/MainNavbar.tsx @@ -1,17 +1,27 @@ import Logo from "@/assets/icon/Logo"; import { NavLink } from "react-router-dom"; +import { useAuthStore } from "@/store/useAuthStore"; +import { useDiaryColorStore } from "@/store/useDiaryColorStore"; const MainNavbar = () => { + const isAuthenticated = useAuthStore((state) => state.isAuthenticated); + const color = useDiaryColorStore((state) => state.color); + const linkClass = ({ isActive }: { isActive: boolean }) => isActive ? "text-color-lowest" : "text-color-lowest opacity-[0.5]"; return ( // ํ™ˆ, ์•„์นด์ด๋ธŒ, ์ปค๋ฎค๋‹ˆํ‹ฐ, ํ”ผ๋“œ ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ” -

+
{/* ์™ผ์ชฝ ๊ทธ๋ฃน */}
    - + + +
  • Home @@ -34,23 +44,31 @@ const MainNavbar = () => {
- {/* ์˜ค๋ฅธ์ชฝ ๋‹จ๋…(My Page) */} + + {/* ์˜ค๋ฅธ์ชฝ - ๋กœ๊ทธ์ธ ์ƒํƒœ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ํ‘œ์‹œ */}
-
- - ๋กœ๊ทธ์ธ - -
-
- - ํšŒ์›๊ฐ€์ž… - -
-
- - My page - -
+ {isAuthenticated ? ( + // ๋กœ๊ทธ์ธ O: ๋งˆ์ดํŽ˜์ด์ง€๋งŒ ํ‘œ์‹œ +
+ + My page + +
+ ) : ( + // ๋กœ๊ทธ์ธ X: ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž… ํ‘œ์‹œ + <> +
+ + ๋กœ๊ทธ์ธ + +
+
+ + ํšŒ์›๊ฐ€์ž… + +
+ + )}
); diff --git a/src/components/archive/ArchiveCard.tsx b/src/components/archive/ArchiveCard.tsx index 5bcaf38..5fcd01c 100644 --- a/src/components/archive/ArchiveCard.tsx +++ b/src/components/archive/ArchiveCard.tsx @@ -2,18 +2,19 @@ import { useEffect, useState } from "react"; import vectorIcon from "@/assets/icon/VectorGray.svg"; import { twMerge } from "tailwind-merge"; import CheckboxIcon from "@/assets/icon/CheckboxIcon"; +import { PlusIcon } from "lucide-react"; type Props = { archiveId?: number; userId?: number; title?: string; - bannerUrl?: string; + // bannerUrl?: string; image?: string; - viewCount?: number; - likeCount?: number; onClick?: () => void; + //ํŽธ์ง‘ & ์„ ํƒ ๊ด€๋ จ isEditMode?: boolean; checked?: boolean; + isCreateMode?: boolean; onToggleCheck?: (id: string, checked: boolean) => void; }; @@ -21,11 +22,12 @@ const ArchiveCard = ({ archiveId, userId, title, - bannerUrl, + // bannerUrl, image, onClick, isEditMode = false, checked = false, + isCreateMode = false, onToggleCheck, }: Props) => { const [imageLoaded, setImageLoaded] = useState(false); @@ -64,7 +66,6 @@ const ArchiveCard = ({
@@ -82,8 +83,13 @@ const ArchiveCard = ({ )} + {isCreateMode && ( +
+ +
+ )} {/* 1) ์ด๋ฏธ์ง€๊ฐ€ ์žˆ๊ณ , ๋กœ๋”ฉ ์„ฑ๊ณต */} - {hasImage && imageLoaded && !imageError && ( + {!isCreateMode && hasImage && imageLoaded && !imageError && ( <> ๋กœ๋”ฉ์ค‘...

} + {!isCreateMode && isLoading &&

๋กœ๋”ฉ์ค‘...

} {/* 3) ์ด๋ฏธ์ง€๊ฐ€ ์—†๊ฑฐ๋‚˜ ๋กœ๋”ฉ ์‹คํŒจ */} - {showFallbackIcon && !isLoading && ( + {!isCreateMode && showFallbackIcon && !isLoading && (
)} {/* 4) ์ด๋ฏธ์ง€๊ฐ€ ์žˆ๊ณ , ๋กœ๋”ฉ ์„ฑ๊ณต ํ›„ ์ˆจ๊น€ ์ฒ˜๋ฆฌ */} - {hasImage && ( + {!isCreateMode && hasImage && ( preload )}
-

{title ? title : "์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ์•„์นด์ด๋ธŒ ํŒŒ์ผ๋ช…"} diff --git a/src/components/archive/ArchiveHeader.tsx b/src/components/archive/ArchiveHeader.tsx index 84ced90..1de411b 100644 --- a/src/components/archive/ArchiveHeader.tsx +++ b/src/components/archive/ArchiveHeader.tsx @@ -3,6 +3,15 @@ import UserIcon from "@/assets/icon/S.svg"; import { Ellipsis } from "lucide-react"; import SettngModal from "./SettngModal"; import { useEffect, useRef, useState } from "react"; +import EditableTitle from "../common/EditableTitle"; +// ArchiveHeader.tsx์˜ import ๋ถ€๋ถ„ ์ˆ˜์ • +import FansBadge from "@/assets/icon/badge/Fans.tsx"; +import NewbieBadge from "@/assets/icon/badge/Newbie.tsx"; +import StanBadge from "@/assets/icon/badge/Stan.tsx"; +import SupporterBadge from "@/assets/icon/badge/Supporter.tsx"; +import MasterBadge from "@/assets/icon/badge/Master.tsx"; +import type { Visibility } from "@/types/archive"; + interface ArchiveHeaderProps { title?: string; @@ -10,6 +19,11 @@ interface ArchiveHeaderProps { badge?: string; createdAt?: string; isMenu?: boolean; + visibility?: Visibility; + isFeed?: boolean; + onTitleSave?: (title: string) => void; + onVisibilitySave?: (visibility: Visibility) => void; + onDeleteArchive?: () => void; } const ArchiveHeader = ({ @@ -18,6 +32,11 @@ const ArchiveHeader = ({ badge, createdAt, isMenu = false, + visibility, + isFeed = false, + onTitleSave, + onVisibilitySave, + onDeleteArchive, }: ArchiveHeaderProps) => { const [isMenuOpen, setIsMenuOpen] = useState(false); const modalRef = useRef(null); @@ -49,11 +68,28 @@ const ArchiveHeader = ({ setIsMenuOpen((prev) => !prev); console.log("๋ฉ”๋‰ด ๋ฒ„ํŠผ ํด๋ฆญ"); }; + const handleCloseModal = () => { + setIsMenuOpen(false); + }; + return (

-

{title}

+ {/*

{title || "์•„์นด์ด๋ธŒ๋ช… (์‚ฌ์šฉ์ž ์ง€์ •)"}

*/} + {isFeed ? ( +

{title || "์•„์นด์ด๋ธŒ๋ช… (์‚ฌ์šฉ์ž ์ง€์ •)"}

+ ) : ( + { + console.log("title", next); + onTitleSave?.(next); // ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ „๋‹ฌ๋ฐ›์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ + }} + placeholder="์•„์นด์ด๋ธŒ๋ช…" + maxLength={50} + /> + )} {isMenu && (
)}
@@ -88,9 +129,14 @@ const ArchiveHeader = ({ {/* ๋ฐฐ์ง€ */}
-
+ {/*
{badge} -
+
*/} + {badge === "NEWBIE" && } {/* ์‹ ์ž… */} + {badge === "FANS" && } {/* ํŒฌ */} + {badge === "SUPPORTER" && } {/* ํ›„์›์ž */} + {badge === "STAN" && } {/* ์Šคํƒ  */} + {badge === "MASTER" && } {/* ๋งˆ์Šคํ„ฐ */} {/* ๋””๋ฐ์ด ๋ถ€๋ถ„ */}
void; isMore?: boolean; + isEditable?: boolean; } -const ArchiveTitle = ({ title, onClick, isMore = true }: ArchiveTitleProps) => { +const ArchiveTitle = ({ title, onClick, isMore = true, isEditable = false }: ArchiveTitleProps) => { return (
{/* ๋•์งˆ์ผ๊ธฐ ํ—ค๋”๋ถ€๋ถ„ */} -
-

{title}

+
+ {isEditable ? ( + { + console.log("title", next); + }} + placeholder={title ?? ""} + maxLength={50} + className="flex-1" + /> + ) : (

{title}

)} + {isMore && ( )} diff --git a/src/components/calendar/modal/EventModal.tsx b/src/components/calendar/modal/EventModal.tsx index 05e65bb..25efd8a 100644 --- a/src/components/calendar/modal/EventModal.tsx +++ b/src/components/calendar/modal/EventModal.tsx @@ -2,25 +2,131 @@ import { useEffect } from "react"; import Event from "./Event"; import Sports from "./Sports"; import Sticker from "./Sticker"; -import type { LabelData } from "@/types/calendar"; +import type { CreateEventRequest, LabelData, StickerResponse, UpdateEventRequest } from "@/types/calendar"; +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { PatchCalendar, PostCalendar, PostSticker, UpdateSticker } from "@/apis/mutations/calendar/Calendar"; +import type { StickerType } from "@/enums/sticker"; type ModalType = true | false | null; interface EventModalProps { + /** ์•„์นด์ด๋ธŒ ID */ + archiveId?: number; open: boolean; onClose: () => void; type: ModalType; startDate: Date | null; editData?: LabelData | null; + editStickerData?: StickerResponse | null; // โœ… ์Šคํ‹ฐ์ปค ์ˆ˜์ • ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ } const EventModal = ({ + archiveId, open, onClose, type, startDate, editData, + editStickerData, }: EventModalProps) => { + const queryClient = useQueryClient(); + const isEditMode = !!editData && editData.id != null; + const isStickerEditMode = !!editStickerData && editStickerData.id != null; // โœ… ์Šคํ‹ฐ์ปค ์ˆ˜์ • ๋ชจ๋“œ + + // โœ… ์ผ์ • ์ƒ์„ฑ mutation + const createEventMutation = useMutation({ + mutationFn: (body: CreateEventRequest) => PostCalendar(archiveId as number, body), + onSuccess: () => { + // TODO: ์›”๋ณ„ ์ผ์ • refetch ํ•„์š”ํ•˜๋ฉด ์—ฌ๊ธฐ์„œ invalidateQueries + queryClient.invalidateQueries({ queryKey: ["monthlyEvents", archiveId] }); + onClose(); + }, + onError: (error) => { + console.error("์ผ์ • ์ƒ์„ฑ ์‹คํŒจ:", error); + alert("์ผ์ • ์ƒ์„ฑ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹œ๋„ํ•ด์ฃผ์„ธ์š”."); + }, + }); + + // โœ… ์ผ์ • ์ˆ˜์ • mutation + const updateEventMutation = useMutation({ + mutationFn: (body: UpdateEventRequest) => PatchCalendar(editData?.id as number, body), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ["monthlyEvents", archiveId] }); + onClose(); + }, + onError: (error) => { + console.error("์ผ์ • ์ˆ˜์ • ์‹คํŒจ:", error); + alert("์ผ์ • ์ˆ˜์ •์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹œ๋„ํ•ด์ฃผ์„ธ์š”."); + }, + }); + // โœ… ์Šคํ‹ฐ์ปค ์ƒ์„ฑ mutation ์ถ”๊ฐ€ + const createStickerMutation = useMutation({ + mutationFn: (body: { date: string; stickerType: StickerType }) => + PostSticker(archiveId as number, body), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ["monthlyStickers", archiveId] }); + onClose(); + }, + onError: (error) => { + console.error("์Šคํ‹ฐ์ปค ์ƒ์„ฑ ์‹คํŒจ:", error); + alert("์Šคํ‹ฐ์ปค ์ƒ์„ฑ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹œ๋„ํ•ด์ฃผ์„ธ์š”."); + }, + }); + // โœ… ์Šคํ‹ฐ์ปค ์ˆ˜์ • mutation ์ถ”๊ฐ€ + const updateStickerMutation = useMutation({ + mutationFn: (body: { date: string; stickerType: StickerType }) => + UpdateSticker(editStickerData?.id as number, body), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ["monthlyEvents", archiveId] }); + onClose(); + }, + onError: (error) => { + console.error("์Šคํ‹ฐ์ปค ์ˆ˜์ • ์‹คํŒจ:", error); + alert("์Šคํ‹ฐ์ปค ์ˆ˜์ •์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹œ๋„ํ•ด์ฃผ์„ธ์š”."); + }, + }); + + // โœ… ์ž์‹์—์„œ ๋ณด๋‚ด์ฃผ๋Š” ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ + ์—ฌ๊ธฐ์„œ isSportType๋งŒ ์„ธํŒ… + const handleSubmit = (base: Omit) => { + const payload = { + ...base, + isSportType: type === true, + }; + + if (isEditMode) { + // ์ˆ˜์ • ๋ชจ๋‹ฌ์ผ ๋•Œ + updateEventMutation.mutate(payload); + } else { + // ์ƒˆ๋กœ ๋“ฑ๋กํ•  ๋•Œ + createEventMutation.mutate(payload); + } + }; + // โœ… ์Šคํ‹ฐ์ปค ์ œ์ถœ ํ•ธ๋“ค๋Ÿฌ - ์ƒ์„ฑ/์ˆ˜์ • ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ + const handleStickerSubmit = (stickerType: StickerType) => { + if (!startDate && !editStickerData) { + alert("๋‚ ์งœ๋ฅผ ์„ ํƒํ•ด์ฃผ์„ธ์š”."); + return; + } + + // ๋‚ ์งœ๋ฅผ YYYY-MM-DD ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ + const dateToUse = editStickerData ? new Date(editStickerData.date) : startDate!; + const year = dateToUse.getFullYear(); + const month = String(dateToUse.getMonth() + 1).padStart(2, "0"); + const day = String(dateToUse.getDate()).padStart(2, "0"); + const date = `${year}-${month}-${day}`; + + const body = { date, stickerType }; + + if (isStickerEditMode) { + // ์Šคํ‹ฐ์ปค ์ˆ˜์ • + updateStickerMutation.mutate(body); + } else { + // ์Šคํ‹ฐ์ปค ์ƒ์„ฑ + createStickerMutation.mutate(body); + } + }; + + // ESC๋กœ ๋‹ซ๊ธฐ useEffect(() => { if (!open) return; @@ -58,12 +164,12 @@ const EventModal = ({ onMouseDown={(e) => e.stopPropagation()} > {type === false && ( - + )} {type === true && ( - + )} - {type === null && } + {type === null && }
); diff --git a/src/components/calendar/modal/Sports.tsx b/src/components/calendar/modal/Sports.tsx index c4fbbc1..cf61773 100644 --- a/src/components/calendar/modal/Sports.tsx +++ b/src/components/calendar/modal/Sports.tsx @@ -4,12 +4,14 @@ import CalendarTag from "../CalendarTag"; import ColorChange from "@/components/common/ColorChange"; import { BtnBasic } from "@/components/common/Button/Btn"; import { useState } from "react"; -import type { ColorData, DateData, LabelData } from "@/types/calendar"; +import type { CreateEventRequest, DateData, LabelData } from "@/types/calendar"; +import EditableTitle from "@/components/common/EditableTitle"; type SportsProps = { onClose: () => void; startDate: Date | null; editData?: LabelData | null; + onSubmit: (base: Omit) => void; }; type ScoreData = { @@ -19,18 +21,19 @@ type ScoreData = { score2: number; }; -const Sports = ({ onClose, startDate, editData }: SportsProps) => { +const Sports = ({ onClose, startDate, editData, onSubmit }: SportsProps) => { const isEditMode = !!editData; + const [eventTitle, setEventTitle] = useState(editData?.title || ""); // โœ… editData๊ฐ€ ์žˆ์œผ๋ฉด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋กœ ์ดˆ๊ธฐํ™” const [dateData, setDateData] = useState({ startDate: editData ? new Date(editData.date) : startDate, - endDate: null, + endDate: editData ? new Date(editData.date) : null, isAllDay: editData ? !editData.hasTime : false, }); const [tags, setTags] = useState(editData?.hashtags || []); - const [color, setColor] = useState(editData?.color || null); + const [color, setColor] = useState(editData?.color || "#82BEF5"); // ๊ธฐ๋ณธ ํŒŒ๋ž€์ƒ‰ const [scoreData, setScoreData] = useState({ teamName: editData?.sportInfo?.team1 || "", score: editData?.sportInfo?.score1 || 0, @@ -38,25 +41,55 @@ const Sports = ({ onClose, startDate, editData }: SportsProps) => { score2: editData?.sportInfo?.score2 || 0, }); - // ์‹ค์ œ API ์—ฐ๊ฒฐ ๋กœ์ง ์ถ”๊ฐ€ const handleConfirm = () => { - console.log("========== ์Šคํฌ์ธ  ๊ฒฐ๊ณผ ์ •๋ณด =========="); - console.log("๋ชจ๋“œ:", isEditMode ? "์ˆ˜์ •" : "๋“ฑ๋ก"); - console.log("์ผ์ • ์‹œ์ž‘:", dateData.startDate); - console.log("์ผ์ • ์ข…๋ฃŒ:", dateData.endDate); - console.log("ํ•˜๋ฃจ ์ข…์ผ:", dateData.isAllDay); - console.log("ํƒœ๊ทธ:", tags); - console.log("์ƒ‰์ƒ:", color); - console.log("๊ฒฝ๊ธฐ๊ฒฐ๊ณผ:", scoreData); - console.log("================================"); - onClose(); + if (!dateData.startDate) { + alert("์‹œ์ž‘ ๋‚ ์งœ๋ฅผ ์„ ํƒํ•ด์ฃผ์„ธ์š”."); + return; + } + + // โœ… ๋กœ์ปฌ ๊ธฐ์ค€ ๋‚ ์งœ ๋ฌธ์ž์—ด + const year = dateData.startDate.getFullYear(); + const month = String(dateData.startDate.getMonth() + 1).padStart(2, "0"); + const day = String(dateData.startDate.getDate()).padStart(2, "0"); + const date = `${year}-${month}-${day}`; + + // โœ… ๋กœ์ปฌ ๊ธฐ์ค€ ์‹œ๊ฐ„ ๋ฌธ์ž์—ด (ํ•˜๋ฃจ์ข…์ผ์ด ์•„๋‹ˆ๋ฉด) + let time: string | undefined; + if (!dateData.isAllDay) { + const hours = String(dateData.startDate.getHours()).padStart(2, "0"); + const minutes = String(dateData.startDate.getMinutes()).padStart(2, "0"); + time = `${hours}:${minutes}`; + } + + const body: Omit = { + title: eventTitle || "์Šคํฌ์ธ  ๊ฒฐ๊ณผ ๊ธฐ๋ก", + date, + time, + hasTime: !dateData.isAllDay, + color, + hashtags: tags, + sportInfo: { + team1: scoreData.teamName, + team2: scoreData.teamName2, + score1: scoreData.score, + score2: scoreData.score2, + }, + }; + + onSubmit(body); }; return (
{/* ์ผ์ • ์ด๋ฆ„ */}
-

์Šคํฌ์ธ  ๊ฒฐ๊ณผ ๊ธฐ๋ก

+ {/*

์Šคํฌ์ธ  ๊ฒฐ๊ณผ ๊ธฐ๋ก

*/} + setEventTitle(next)} + placeholder="์Šคํฌ์ธ  ๊ฒฐ๊ณผ ๊ธฐ๋ก" + maxLength={50} + /> { setTags(data.tags)} /> {/* ์ƒ‰์ƒ์„ค์ • */} setColor(data || null)} + initialColor={{ color }} + onColorChange={(data) => setColor(data?.color || color)} /> {/* ๊ฒฝ๊ธฐ๊ฒฐ๊ณผ */}
@@ -98,7 +131,10 @@ const Sports = ({ onClose, startDate, editData }: SportsProps) => { placeholder="์Šค์ฝ”์–ด" value={scoreData.score} onChange={(e) => - setScoreData({ ...scoreData, score: parseInt(e.target.value) }) + setScoreData({ + ...scoreData, + score: parseInt(e.target.value, 10) || 0 + }) } /> {/* : */} @@ -110,7 +146,10 @@ const Sports = ({ onClose, startDate, editData }: SportsProps) => { placeholder="์Šค์ฝ”์–ด" value={scoreData.score2} onChange={(e) => - setScoreData({ ...scoreData, score2: parseInt(e.target.value) }) + setScoreData({ + ...scoreData, + score2: parseInt(e.target.value, 10) || 0 + }) } /> {/* ํŒ€์ด๋ฆ„ */} @@ -127,7 +166,9 @@ const Sports = ({ onClose, startDate, editData }: SportsProps) => {
{/* ํ™•์ธ๋ฒ„ํŠผ */}
- ํ™•์ธ + + {isEditMode ? "์ˆ˜์ •" : "ํ™•์ธ"} +
); diff --git a/src/components/calendar/modal/Sticker.tsx b/src/components/calendar/modal/Sticker.tsx index 884565e..f9a82bc 100644 --- a/src/components/calendar/modal/Sticker.tsx +++ b/src/components/calendar/modal/Sticker.tsx @@ -1,24 +1,123 @@ +import { StickerType } from "@/enums/sticker"; import { X } from "lucide-react"; +import { useState } from "react"; +import { BtnBasic } from "@/components/common/Button/Btn"; + +import ShiningSticker from "@/assets/icon/sticker/shining.svg"; +import HeartSticker from "@/assets/icon/sticker/heart.svg"; +import GiftboxSticker from "@/assets/icon/sticker/giftbox.svg"; +import CakeSticker from "@/assets/icon/sticker/cake.svg"; +import CoffeeSticker from "@/assets/icon/sticker/coffee.svg"; +import CameraSticker from "@/assets/icon/sticker/camera.svg"; +import LightStickSticker from "@/assets/icon/sticker/light_stick.svg"; +import TicketSticker from "@/assets/icon/sticker/ticket.svg"; +import MusicalNoteSticker from "@/assets/icon/sticker/musical_note.svg"; +import MoneySticker from "@/assets/icon/sticker/money.svg"; +import DisplayBoardSticker from "@/assets/icon/sticker/display_board.svg"; +import BaseballSticker from "@/assets/icon/sticker/baseball.svg"; type StickerProps = { onClose: () => void; + date?: Date | null; + onSubmit?: (stickerType: StickerType) => void; + initialSticker?: StickerType | null; + }; -const Sticker = ({ onClose }: StickerProps) => { +const Sticker = ({ onClose, date, onSubmit, initialSticker }: StickerProps) => { + const [selectedSticker, setSelectedSticker] = useState( + initialSticker || null + ); + + const getStickerImage = (type: StickerType): string => { + const stickerMap: Record = { + [StickerType.SHINING]: ShiningSticker, + [StickerType.LIGHT_STICK]: LightStickSticker, + [StickerType.HEART]: HeartSticker, + [StickerType.GIFTBOX]: GiftboxSticker, + [StickerType.CAKE]: CakeSticker, + [StickerType.COFFEE]: CoffeeSticker, + [StickerType.CAMERA]: CameraSticker, + [StickerType.TICKET]: TicketSticker, + [StickerType.MUSICAL_NOTE]: MusicalNoteSticker, + [StickerType.MONEY]: MoneySticker, + [StickerType.DISPLAY_BOARD]: DisplayBoardSticker, + [StickerType.BASEBALL]: BaseballSticker, + }; + return stickerMap[type]; + }; + + const handleConfirm = () => { + if (!selectedSticker) { + alert("์Šคํ‹ฐ์ปค๋ฅผ ์„ ํƒํ•ด์ฃผ์„ธ์š”."); + return; + } + onSubmit?.(selectedSticker); + }; + + // ๋‚ ์งœ ํฌ๋งทํŒ… + const formatDate = (d: Date) => { + return d.getDate(); + }; + return ( -
- {/* ์ผ์ • ์ด๋ฆ„ */} +
+ {/* ํ—ค๋” */}
-

์Šคํ‹ฐ์ปค

+
+

์Šคํ‹ฐ์ปค

+ {date && ( +
+ | + + {formatDate(date)} + +
+ )} +
-

์ถ”ํ›„ ์ถ”๊ฐ€ ์˜ˆ์ •

- {/* ์ผ์ • ๊ธฐ๊ฐ„ */} + + {/* ์Šคํ‹ฐ์ปค ์„ ํƒ ๊ทธ๋ฆฌ๋“œ */} +
+ {Object.values(StickerType).map((stickerType) => ( + + ))} +
+ + {/* ํ™•์ธ ๋ฒ„ํŠผ */} +
+ + ํ™•์ธ + +
); }; -export default Sticker; +export default Sticker; \ No newline at end of file diff --git a/src/components/calendar/modal/StickerOptionModal.tsx b/src/components/calendar/modal/StickerOptionModal.tsx new file mode 100644 index 0000000..7e0bfae --- /dev/null +++ b/src/components/calendar/modal/StickerOptionModal.tsx @@ -0,0 +1,59 @@ +import { Sticker, Trash2 } from "lucide-react"; + +interface StickerOptionModalProps { + open: boolean; + onClose: () => void; + onEdit: () => void; + onDelete: () => void; +} + +const StickerOptionModal = ({ + open, + onClose, + onEdit, + onDelete, +}: StickerOptionModalProps) => { + if (!open) return null; + + return ( +
+
+ {/* ํ—ค๋” */} +
+

์Šคํ‹ฐ์ปค ์ˆ˜์ •

+
+ + {/* ์˜ต์…˜ */} +
+ {/* ํŽธ์ง‘ํ•˜๊ธฐ */} + + + {/* ์‚ญ์ œํ•˜๊ธฐ */} + +
+
+
+ ); +}; + +export default StickerOptionModal; \ No newline at end of file diff --git a/src/components/comments/CommentItem.tsx b/src/components/comments/CommentItem.tsx index f291ffb..5835f03 100644 --- a/src/components/comments/CommentItem.tsx +++ b/src/components/comments/CommentItem.tsx @@ -11,11 +11,13 @@ import type { User } from "@/types/user"; export type CommentModel = { id: string; - authorId: string; + authorId: string | number; authorName: string; text: string; createdAt: string; - replies?: CommentModel[]; // ๋‹ต๊ธ€ ๋ฆฌ์ŠคํŠธ (์›๋Œ“๊ธ€์˜ ํ•˜์œ„) + replies?: CommentModel[]; + serverId?: string | number; + isOwner?: boolean; }; type Props = { @@ -36,7 +38,17 @@ export default function CommentItem({ const [replyOpen, setReplyOpen] = useState(false); const [replyText, setReplyText] = useState(""); - const isAuthor = currentUserId && currentUserId === comment.authorId; + const isAuthor = + typeof comment.isOwner === "boolean" + ? comment.isOwner + : currentUserId != null && + String(comment.authorId) === String(currentUserId); + + const isReplyAuthor = (r: CommentModel) => { + return typeof r.isOwner === "boolean" + ? r.isOwner + : currentUserId != null && String(r.authorId) === String(currentUserId); + }; return (
@@ -96,7 +108,7 @@ export default function CommentItem({ {replyOpen && comment.replies && comment.replies.length > 0 && (
{comment.replies.map((r) => { - const isReplyAuthor = currentUserId && currentUserId === r.authorId; + const replyIsAuthor = isReplyAuthor(r); return (
@@ -123,7 +135,7 @@ export default function CommentItem({
- {isReplyAuthor && ( + {replyIsAuthor && ( Promise; // ์„œ๋ฒ„ ์—ฐ๋™ ์‹œ + onSubmitComment?: (text: string) => Promise; onDeleteCommentApi?: (id: string) => Promise; + initialLikeCount?: number; + initialIsLiked?: boolean; }; export default function CommentSection({ + postId, initialComments = [], currentUserId = null, currentUser, - onSubmitComment, - onDeleteCommentApi, + initialLikeCount = 0, + initialIsLiked = false, }: Props) { - // ๋กœ์ปฌ ์ƒํƒœ(UI ํ™•์ธ์šฉ) const [comments, setComments] = useState(initialComments); const [open, setOpen] = useState(true); // ๋Œ“๊ธ€ ์„น์…˜ ๊ธฐ๋ณธ ์—ด๋ฆผ const [input, setInput] = useState(""); - const currentUserNickname = currentUser?.nickname ?? "์‚ฌ์šฉ์ž"; + // ๋Œ“๊ธ€ ํŽ˜์ด์ง• / ๋กœ๋”ฉ ์ƒํƒœ + const [, setSubmittingComment] = useState(false); + const [, setSubmittingReplyFor] = useState(null); + const [, setDeletingCommentId] = useState(null); + const [, setLoadingComments] = useState(false); + const [, setCommentsPage] = useState(0); + + // ์ข‹์•„์š” ๊ด€๋ จ ์ƒํƒœ + const [likeCount, setLikeCount] = useState(initialLikeCount); + const [isLiked, setIsLiked] = useState(initialIsLiked); + const [pendingLike, setPendingLike] = useState(false); + + // ์ข‹์•„์š” ํ† ๊ธ€ ํ•ธ๋“ค๋Ÿฌ (๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ + ์‹คํŒจ ๋กค๋ฐฑ) + const handleToggleLike = async () => { + if (!postId) { + console.warn("postId๊ฐ€ ์—†์–ด ์ข‹์•„์š”๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."); + return; + } + if (pendingLike) return; + setPendingLike(true); + + const prevLiked = isLiked; + const prevCount = likeCount; + + // ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ + setIsLiked(!prevLiked); + setLikeCount(prevLiked ? Math.max(0, prevCount - 1) : prevCount + 1); + + try { + const res = await togglePostLike(postId); + if (res?.likeCount !== undefined) setLikeCount(res.likeCount); + if (typeof res?.liked === "boolean") setIsLiked(res.liked); + if (typeof res?.isLiked === "boolean") setIsLiked(res.isLiked); + } catch (err: any) { + // ๋กค๋ฐฑ + setIsLiked(prevLiked); + setLikeCount(prevCount); + + console.error("์ข‹์•„์š” ์š”์ฒญ ์‹คํŒจ:", err); + if (err?.response?.status === 401) { + alert("๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ ํ›„ ๋‹ค์‹œ ์‹œ๋„ํ•ด ์ฃผ์„ธ์š”."); + } else { + alert( + "์ข‹์•„์š” ์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž ์‹œ ํ›„ ๋‹ค์‹œ ์‹œ๋„ํ•ด ์ฃผ์„ธ์š”." + ); + } + } finally { + setPendingLike(false); + } + }; + + // ์„œ๋ฒ„ DTO -> CommentModelLocal ์žฌ๊ท€ ๋ณ€ํ™˜ + const mapServerCommentToModel = (s: ServerCommentDto): CommentModelLocal => { + const id = String( + (s as any).commentId ?? + (s as any).id ?? + `c-${Math.random().toString(36).slice(2, 9)}` + ); + const authorId = String((s as any).userId ?? (s as any).authorId ?? ""); + const authorName = (s as any).nickname ?? (s as any).authorName ?? "์ต๋ช…"; + const text = (s as any).content ?? (s as any).text ?? ""; + const rawCreatedAt = (s as any).createdAt ?? new Date().toISOString(); + const createdAt = formatDateYMD(rawCreatedAt); + const childrenRaw = (s as any).children ?? []; + let replies: CommentModelLocal[] | undefined = undefined; + + if (Array.isArray(childrenRaw)) { + replies = childrenRaw.map((r: any) => ({ + id: String( + r.commentId ?? r.id ?? `c-${Math.random().toString(36).slice(2, 9)}` + ), + authorId: String(r.userId ?? r.authorId ?? ""), + authorName: r.nickname ?? r.authorName ?? "์ต๋ช…", + text: r.content ?? r.text ?? "", + createdAt: formatDateYMD(r.createdAt ?? new Date().toISOString()), + isOwner: typeof r.isOwner === "boolean" ? r.isOwner : undefined, + replies: Array.isArray(r.children) + ? r.children.map((rr: any) => ({ + id: String( + rr.commentId ?? + rr.id ?? + `c-${Math.random().toString(36).slice(2, 9)}` + ), + authorId: String(rr.userId ?? rr.authorId ?? ""), + authorName: rr.nickname ?? rr.authorName ?? "์ต๋ช…", + text: rr.content ?? rr.text ?? "", + createdAt: formatDateYMD( + rr.createdAt ?? new Date().toISOString() + ), + })) + : undefined, + })); + } else if (typeof childrenRaw === "string") { + try { + const parsed = JSON.parse(childrenRaw); + if (Array.isArray(parsed)) { + replies = parsed.map((r: any) => ({ + id: String( + r.commentId ?? + r.id ?? + `c-${Math.random().toString(36).slice(2, 9)}` + ), + authorId: String(r.userId ?? r.authorId ?? ""), + authorName: r.nickname ?? r.authorName ?? "์ต๋ช…", + text: r.content ?? r.text ?? "", + createdAt: formatDateYMD(r.createdAt ?? new Date().toISOString()), + isOwner: typeof r.isOwner === "boolean" ? r.isOwner : undefined, + })); + } + } catch { + replies = undefined; + } + } + + return { + id, + authorId, + authorName, + text, + createdAt, + replies, + deleted: !!(s as any).deleted, + serverId: Number(s.commentId), + isOwner: + typeof (s as any).isOwner === "boolean" + ? (s as any).isOwner + : undefined, + }; + }; + + // ๋Œ“๊ธ€ ๋กœ๋“œ ํ•จ์ˆ˜ (page ๊ธฐ๋ฐ˜) + const loadComments = useCallback( + async ( + opts: { + page?: number; + size?: number; + lastCommentId?: string | number; + } = {} + ) => { + if (!postId) return; + setLoadingComments(true); + + try { + const page = opts.page ?? 0; + const size = opts.size ?? 20; + const res = await fetchPostComments(postId, { + page, + size, + lastCommentId: opts.lastCommentId, + }); + const mapped = (res.content ?? []).map(mapServerCommentToModel); + + if (page === 0) { + setComments(mapped); + } else { + setComments((prev) => [...prev, ...mapped]); + } + + setCommentsPage(page); + } catch (err: any) { + console.error("๋Œ“๊ธ€ ๋กœ๋“œ ์‹คํŒจ:", err); + } finally { + setLoadingComments(false); + } + }, + [postId] + ); + + // postId ๋ณ€๊ฒฝ ์‹œ ์ดˆ๊ธฐ ๋กœ๋“œ + useEffect(() => { + setComments(initialComments); + setCommentsPage(0); + + if (postId) { + loadComments({ page: 0, size: 20 }); + } + }, [postId]); // eslint-disable-line react-hooks/exhaustive-deps // ๋Œ“๊ธ€ ๊ฐœ์ˆ˜ (์›๋Œ“๊ธ€ + ๋‹ต๊ธ€ ๋ชจ๋‘ ํ•ฉ์‚ฐ) const commentCount = useMemo(() => { @@ -39,91 +235,129 @@ export default function CommentSection({ return c; }, [comments]); - const addCommentLocal = (text: string) => { - const newComment: CommentModel = { - id: `temp-${Date.now()}`, - authorId: currentUserId ?? "me", - authorName: currentUserNickname, - text, - createdAt: formatDateYMD(new Date()), - replies: [], - }; - setComments((s) => [...s, newComment]); - }; + function formatDateYMD(input: Date | string | number): string { + if (!input && input !== 0) return ""; - const formatDateYMD = (d: Date) => - `${d.getFullYear()}.${String(d.getMonth() + 1).padStart(2, "0")}.${String( - d.getDate() - ).padStart(2, "0")}`; - - const addReplyLocal = (parentId: string, text: string) => { - setComments((prev) => - prev.map((c) => { - if (c.id === parentId) { - const r = { - id: `temp-${Date.now()}`, - authorId: currentUserId ?? "me", - authorName: currentUserNickname, - text, - createdAt: formatDateYMD(new Date()), - }; - return { ...c, replies: [...(c.replies ?? []), r] }; - } - return c; - }) - ); - }; + // 1) Date ์ธ์Šคํ„ด์Šค๋ฉด ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ + let d: Date; + if (input instanceof Date) { + d = input; + } else { + // 2) ๋ฌธ์ž์—ด/์ˆซ์ž์ผ ๊ฒฝ์šฐ ์•ˆ์ „ํ•˜๊ฒŒ ํŒŒ์‹ฑ + const s = String(input); + + // ์ผ๋ถ€ ํ™˜๊ฒฝ์—์„œ ๋งˆ์ดํฌ๋กœ์ดˆ(6์ž๋ฆฌ) ๋•Œ๋ฌธ์— Date ํŒŒ์‹ฑ ์‹คํŒจ ๊ฐ€๋Šฅ -> 3์ž๋ฆฌ(๋ฐ€๋ฆฌ์ดˆ)๋กœ ์ค„์—ฌ๋ด„ + // ex: "2026-01-29T20:31:28.240313+09:00" -> "2026-01-29T20:31:28.240+09:00" + const cleaned = s.replace(/(\.\d{3})\d+([+-]\d{2}:\d{2})?$/, "$1$2"); + + d = new Date(cleaned); + if (Number.isNaN(d.getTime())) { + // ๋งˆ์ง€๋ง‰ ์‹œ๋„: ํƒ€์ž„์กด ์ •๋ณด ์ œ๊ฑฐ ํ›„ ํŒŒ์‹ฑ(๋กœ์ปฌ ์‹œ๊ฐ„์œผ๋กœ ํ•ด์„) + const noTz = cleaned.replace(/([+-]\d{2}:\d{2}|Z)$/, ""); + d = new Date(noTz); + } + } + + if (!(d instanceof Date) || Number.isNaN(d.getTime())) return ""; + + const y = d.getFullYear(); + const m = String(d.getMonth() + 1).padStart(2, "0"); + const dd = String(d.getDate()).padStart(2, "0"); + + return `${y}.${m}.${dd}`; + } const handleSubmitComment = async () => { - if (!input.trim()) return; - if (onSubmitComment) { - // optional: call API and use returned comment - const res = await onSubmitComment(input.trim()); - if (res) setComments((s) => [res, ...s]); - } else { - addCommentLocal(input.trim()); + if (!input.trim() || !postId) return; + const content = input.trim(); + setSubmittingComment(true); + + try { + // parentId null => ์›๋Œ“๊ธ€ + await createCommentApi({ postId, content, parentId: null }); + await loadComments({ page: 0, size: 20 }); + setInput(""); + } catch (err: any) { + console.error("์›๋Œ“๊ธ€ ๋“ฑ๋ก ์‹คํŒจ:", err); + alert( + err?.response?.data?.message ?? "๋Œ“๊ธ€ ๋“ฑ๋ก ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค." + ); + } finally { + setSubmittingComment(false); } - setInput(""); }; - const handleAddReply = async (parentId: string, text: string) => { - // API integration optional; here local append - if (onSubmitComment) { - // implement server reply submit - } else { - addReplyLocal(parentId, text); + // ๋‹ต๊ธ€ ๋“ฑ๋ก + const handleAddReply = async (parentLocalId: string, text: string) => { + if (!text.trim() || !postId) return; + const trimmed = text.trim(); + + // ๋ถ€๋ชจ serverId ํ™•๋ณด + const parent = comments.find((c) => c.id === parentLocalId); + const parentServerIdRaw = parent?.serverId ?? parentLocalId; + const maybeNum = Number(parentServerIdRaw); + if (Number.isNaN(maybeNum)) { + alert("๋ถ€๋ชจ ๋Œ“๊ธ€ ID๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."); + return; + } + const parentIdForApi = maybeNum; + + setSubmittingReplyFor(String(parentIdForApi)); + try { + await createCommentApi({ + postId, + content: trimmed, + parentId: parentIdForApi, + }); + // ์„ฑ๊ณต ์‹œ ์ „์ฒด ๋ชฉ๋ก ์žฌ๋กœ๋”ฉ + await loadComments({ page: 0, size: 20 }); + } catch (err: any) { + console.error("๋‹ต๊ธ€ ๋“ฑ๋ก ์‹คํŒจ:", err); + alert( + err?.response?.data?.message ?? "๋‹ต๊ธ€ ๋“ฑ๋ก ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค." + ); + } finally { + setSubmittingReplyFor(null); } }; + // ์‚ญ์ œ const deleteImmediate = async ( id: string, isReply: boolean, parentId?: string ) => { - // optimistic UI: ๋กœ์ปฌ์—์„œ ๋จผ์ € ์‚ญ์ œ - const prev = comments; - - if (isReply && parentId) { - setComments((prevComments) => - prevComments.map((c) => - c.id === parentId - ? { ...c, replies: (c.replies ?? []).filter((r) => r.id !== id) } - : c - ) - ); - } else { - setComments((prevComments) => prevComments.filter((c) => c.id !== id)); + const target = comments.find((c) => c.id === id); + const serverId = + target?.serverId ?? + (Number(id) && !Number.isNaN(Number(id)) ? Number(id) : undefined); + if (!serverId) { + if (isReply && parentId) { + setComments((prev) => + prev.map((c) => + c.id === parentId + ? { ...c, replies: (c.replies ?? []).filter((r) => r.id !== id) } + : c + ) + ); + } else { + setComments((prev) => prev.filter((c) => c.id !== id)); + } + return; } - // API ํ˜ธ์ถœ: ์‹คํŒจ ์‹œ ๋กค๋ฐฑ - if (onDeleteCommentApi) { - try { - await onDeleteCommentApi(id); - } catch (err) { - // ๋กค๋ฐฑ ๋ฐ ์‚ฌ์šฉ์ž ์•Œ๋ฆผ - setComments(prev); - console.error("์‚ญ์ œ ์‹คํŒจ:", err); - } + setDeletingCommentId(serverId); + try { + await deleteCommentApi(serverId); + // ์„ฑ๊ณตํ•˜๋ฉด ์ „์ฒด ์žฌ๋กœ๋”ฉ์œผ๋กœ ์ผ๊ด€์„ฑ ๋ณด์žฅ + await loadComments({ page: 0, size: 20 }); + } catch (err: any) { + console.error("๋Œ“๊ธ€ ์‚ญ์ œ ์‹คํŒจ:", err); + alert(err?.response?.data?.message ?? "๋Œ“๊ธ€ ์‚ญ์ œ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค."); + // ์‹คํŒจ ์‹œ ๋ชฉ๋ก ์žฌ๋™๊ธฐํ™”๋กœ ์ƒํƒœ ๋ณต์› + await loadComments({ page: 0, size: 20 }); + } finally { + setDeletingCommentId(null); } }; @@ -132,9 +366,10 @@ export default function CommentSection({
{ - console.log("์ข‹์•„์š” ํด๋ฆญ"); - }} + onClick={handleToggleLike} + liked={isLiked} + likeCount={likeCount} + // disabled={pendingLike} />
@@ -185,9 +420,9 @@ export default function CommentSection({ )}
-
+
{ + const [isHovered, setIsHovered] = useState(false); + const base = - "w-[180px] h-[48px] px-[30px] py-[10px] rounded-[8px] cursor-pointer typo-body3-semibold transition-colors transition-colors"; + "w-[180px] h-[48px] px-[30px] py-[10px] rounded-[8px] cursor-pointer typo-body3-semibold transition-colors"; const enabledGray = "bg-surface-container-20 text-color-highest"; const enabledBlue = "bg-brand-blue-400 text-color-lowest"; const hoverActiveGray = "hover:bg-surface-container-30 hover:text-color-highest active:bg-surface-container-40 active:text-color-highest"; const hoverActiveBlue = - "hover:bg-brand-blue-300 hover:text-color-lowest active:bg-brand-blue-200 active:text-color-lowest"; + "hover:bg-brand-blue-300 hover:text-color-lowest active:bg-brand-blue-200 active:text-color-lowest"; const disabledCls = "bg-surface-container-30 text-color-highest cursor-not-allowed"; + + const customStyle = + color && !disabled + ? { backgroundColor: isHovered && hoverColor ? hoverColor : color } + : undefined; + return ( )} - {mediaType === "image" ? ( + {isVideo ? ( <> - {img && ( - img { + controls + playsInline + // autoPlay muted + className="w-full h-full object-cover absolute inset-0" + onLoadedData={() => { + // ๋กœ๋”ฉ๋˜๋ฉด ์•„์ด์ฝ˜ ์ˆจ๊ธฐ๋ ค๋ฉด ์ƒํƒœ ๋ณ€๊ฒฝ ๋กœ์ง ์ถ”๊ฐ€ ๊ฐ€๋Šฅ setImageLoaded(true); setImageError(false); }} @@ -95,26 +97,23 @@ const ImgCard = ({ setImageLoaded(false); }} /> - )} - {/* ๋ฒกํ„ฐ ์•„์ด์ฝ˜: ์ด๋ฏธ์ง€๊ฐ€ ์—†๊ฑฐ๋‚˜ ๋กœ๋“œ ์‹คํŒจํ–ˆ๊ฑฐ๋‚˜ ๋กœ๋”ฉ ์ค‘์ผ ๋•Œ๋งŒ ํ‘œ์‹œ */} - {showIcon && ( + ) : (
icon
)} ) : ( - // video <> - {img ? ( -
); diff --git a/src/components/common/ColorChange.tsx b/src/components/common/ColorChange.tsx index aa0b983..a1674bf 100644 --- a/src/components/common/ColorChange.tsx +++ b/src/components/common/ColorChange.tsx @@ -1,54 +1,54 @@ import type { ColorData } from "@/types/calendar"; import { useState } from "react"; - -type Color = { - name: string; - color: string; -}; +import { twMerge } from "tailwind-merge"; +import { DIARY_COLORS } from "@/constants/diaryColors"; type ColorChangeProps = { - initialColor?: ColorData | null; // โœ… ์ถ”๊ฐ€ - onColorChange?: (color: Color | null) => void; + initialColor?: ColorData | null; + onColorChange?: (color: ColorData | null) => void; + className?: string; }; -const ColorChange = ({ initialColor, onColorChange }: ColorChangeProps) => { - const colors: Color[] = [ - { name: "pink", color: "#FFDFE7" }, - { name: "red", color: "#FFABAB" }, - { name: "orange", color: "#FFDEBF" }, - { name: "yellow", color: "#FFEEBB" }, - { name: "green", color: "#CEEBCC" }, - { name: "blue", color: "#82BEF5" }, - { name: "purple", color: "#DFDFFF" }, - { name: "gray", color: "#DFDCDC" }, - ]; +const ColorChange = ({ + initialColor, + onColorChange, + className, +}: ColorChangeProps) => { + // โœ… ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ์„ ํƒ๋œ ์ƒ‰์ƒ ์„ค์ • - const [selectedColor, setSelectedColor] = useState(() => { + const [selectedColor, setSelectedColor] = useState(() => { if (initialColor) { - return colors.find((c) => c.color === initialColor.color) || null; + return DIARY_COLORS.find((c) => c.color === initialColor.color) || null; } return null; }); - const handleColorChange = (color: Color) => { + const handleColorChange = (color: ColorData) => { setSelectedColor(color); - onColorChange?.(color); // โœ… ๋ถ€๋ชจ์—๊ฒŒ ์•Œ๋ฆผ + onColorChange?.(color); // ๋ถ€๋ชจ์—๊ฒŒ ์•Œ๋ฆผ }; return (
-

์ƒ‰์ƒ ์„ค์ •

+ {/* className์„ ๋ถ€๋ชจ div์— ์ ์šฉํ•˜๊ณ , span์—๋„ ํฐํŠธ ํด๋ž˜์Šค ์ ์šฉ */} +

+ ์ƒ‰์ƒ ์„ค์ • +

{/* ์ƒ‰์ƒ ์นฉ */}
- {colors.map((color) => ( + {DIARY_COLORS.map((color) => (
{ handleColorChange(color); diff --git a/src/components/common/EditableTitle.tsx b/src/components/common/EditableTitle.tsx index e3ee879..1ec5774 100644 --- a/src/components/common/EditableTitle.tsx +++ b/src/components/common/EditableTitle.tsx @@ -1,5 +1,6 @@ import React, { useEffect, useRef, useState } from "react"; import { twMerge } from "tailwind-merge"; +import clsx from "clsx"; type Props = { value: string; @@ -8,6 +9,7 @@ type Props = { maxLength?: number; className?: string; autoFocus?: boolean; + editable?: boolean; }; export default function EditableTitle({ @@ -16,6 +18,7 @@ export default function EditableTitle({ placeholder = "ํ‹ฐ์ผ“๋ถ๋ช… (ํด๋ฆญํ•˜์—ฌ ์ˆ˜์ •)", maxLength = 60, className, + editable = true, }: Props) { const [editing, setEditing] = useState(false); const [text, setText] = useState(value ?? ""); @@ -36,6 +39,7 @@ export default function EditableTitle({ }, [editing]); const startEdit = () => { + if (!editable) return; setDraft(text); setEditing(true); }; @@ -66,7 +70,7 @@ export default function EditableTitle({ }; return ( -
+
{editing ? ( ) : (