From f16ca9dbb548d254d5526b2d64ebd0a1f0137679 Mon Sep 17 00:00:00 2001 From: GulSam00 Date: Thu, 7 May 2026 13:42:14 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feat=20:=20=ED=8C=A8=EC=B9=98=EB=85=B8?= =?UTF-8?q?=ED=8A=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?(#228)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/src/app/info/page.tsx | 8 ++- apps/web/src/app/info/patch-notes/page.tsx | 59 ++++++++++++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 apps/web/src/app/info/patch-notes/page.tsx diff --git a/apps/web/src/app/info/page.tsx b/apps/web/src/app/info/page.tsx index afd42c9c..52fdb8a3 100644 --- a/apps/web/src/app/info/page.tsx +++ b/apps/web/src/app/info/page.tsx @@ -1,6 +1,6 @@ 'use client'; -import { CircleDollarSign, Flag, Folder, Star } from 'lucide-react'; +import { CircleDollarSign, Flag, Folder, ScrollText, Star } from 'lucide-react'; import { useRouter } from 'next/navigation'; import CountUp from '@/components/reactBits/CountUp'; @@ -28,6 +28,12 @@ const menuItems = [ description: '내가 신고한 곡 오류를 확인하고 삭제합니다', icon: , }, + { + id: 'patch-notes', + title: '패치노트', + description: '앱 업데이트 내역을 확인합니다', + icon: , + }, ]; export default function LibraryPage() { diff --git a/apps/web/src/app/info/patch-notes/page.tsx b/apps/web/src/app/info/patch-notes/page.tsx new file mode 100644 index 00000000..36dc3b16 --- /dev/null +++ b/apps/web/src/app/info/patch-notes/page.tsx @@ -0,0 +1,59 @@ +'use client'; + +import { ArrowLeft } from 'lucide-react'; +import { useRouter } from 'next/navigation'; + +import { Button } from '@/components/ui/button'; +import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; +import { ScrollArea } from '@/components/ui/scroll-area'; +import changelog from '../../../../public/changelog.json'; + +type ChangelogEntry = { title: string; message: string[] }; + +const entries = Object.entries(changelog as Record).reverse(); + +export default function PatchNotesPage() { + const router = useRouter(); + + return ( +
+
+ +

패치노트

+
+ + +
+ {entries.map(([version, entry]) => ( + + + {entry.title} + + +
    + {entry.message.map((line, idx) => { + const isSub = line.startsWith('-'); + return ( +
  • + {isSub ? line : `• ${line}`} +
  • + ); + })} +
+
+
+ ))} +
+
+
+ ); +} From 8f4b0c7854fdd264489d011fc116568b042d6187 Mon Sep 17 00:00:00 2001 From: GulSam00 Date: Fri, 15 May 2026 01:39:02 +0900 Subject: [PATCH 2/4] =?UTF-8?q?feat=20:=20=ED=8C=A8=EC=B9=98=EB=85=B8?= =?UTF-8?q?=ED=8A=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=EB=A5=BC=20/patch-notes?= =?UTF-8?q?=20=EB=A1=9C=20=EC=9D=B4=EB=8F=99=ED=95=98=EA=B3=A0=20=ED=83=80?= =?UTF-8?q?=EC=9E=84=EB=9D=BC=EC=9D=B8=20UI=20=EC=A0=81=EC=9A=A9=20(#228)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/public/changelog.json | 18 +++++ apps/web/src/Sidebar.tsx | 18 ++++- apps/web/src/app/info/page.tsx | 8 +-- apps/web/src/app/info/patch-notes/page.tsx | 59 ---------------- apps/web/src/app/patch-notes/page.tsx | 78 ++++++++++++++++++++++ apps/web/src/auth.tsx | 1 + 6 files changed, 114 insertions(+), 68 deletions(-) delete mode 100644 apps/web/src/app/info/patch-notes/page.tsx create mode 100644 apps/web/src/app/patch-notes/page.tsx diff --git a/apps/web/public/changelog.json b/apps/web/public/changelog.json index 7fd3ba7a..9606aa82 100644 --- a/apps/web/public/changelog.json +++ b/apps/web/public/changelog.json @@ -1,6 +1,7 @@ { "1.1.0": { "title": "버전 1.1.0", + "date": "2025-05-12", "message": [ "기존 노래방 데이터를 새로운 데이터로 교체하였습니다.", "- TJ 노래방의 38519개의 곡 데이터 업데이트!", @@ -9,6 +10,7 @@ }, "1.2.0": { "title": "버전 1.2.0", + "date": "2025-05-11", "message": [ "인기곡 페이지를 추가했습니다.", "- 전체, 연도별, 월별 부른 곡의 통계와 즐겨찾기 한 곡의 통계를 확인할 수 있습니다.", @@ -17,6 +19,7 @@ }, "1.3.0": { "title": "버전 1.3.0", + "date": "2025-05-23", "message": [ "저장 기능을 추가했습니다.", "로그인 하지 않고도 인기곡 페이지를 조회할 수 있습니다.", @@ -27,6 +30,7 @@ "1.4.0": { "title": "버전 1.4.0", + "date": "2025-05-24", "message": [ "스크롤 디자인 높이를 조정했습니다.", "부를곡 페이지에서 재생목록을 통해 노래를 추가할 수 있습니다.", @@ -35,6 +39,7 @@ }, "1.5.0": { "title": "버전 1.5.0", + "date": "2025-06-08", "message": [ "검색 페이지에서 무한 스크롤 기능이 추가되었습니다.", "검색 페이지에서 검색 기록 기능이 추가되었습니다.", @@ -43,6 +48,7 @@ }, "1.6.0": { "title": "버전 1.6.0", + "date": "2025-06-18", "message": [ "회원 탈퇴 기능이 추가되었습니다.", "화면 높이를 조정했습니다.", @@ -51,6 +57,7 @@ }, "1.7.0": { "title": "버전 1.7.0", + "date": "2025-08-23", "message": [ "화면 UX를 개선했습니다. 세부적인 디자인을 조정했습니다.", "로그인 상태에서 전체 검색 시 오류가 나는 현상을 수정했습니다." @@ -58,22 +65,27 @@ }, "1.8.0": { "title": "버전 1.8.0", + "date": "2025-09-15", "message": ["노래방에 최근 추가된 곡을 확인할 수 있는 페이지를 추가했습니다."] }, "1.8.1": { "title": "버전 1.8.1", + "date": "2025-12-12", "message": ["UI를 개선했습니다."] }, "1.9.0": { "title": "버전 1.9.0", + "date": "2026-01-04", "message": ["챗봇 기능이 추가되었습니다."] }, "1.9.1": { "title": "버전 1.9.1", + "date": "2026-01-12", "message": ["로그인 인증 이슈를 해결했습니다."] }, "2.0.0": { "title": "버전 2.0.0", + "date": "2026-01-26", "message": [ "출석 체크 기능을 추가했습니다.", "유저 별 포인트 기능을 추가했습니다.", @@ -83,6 +95,7 @@ }, "2.0.1": { "title": "버전 2.0.1", + "date": "2026-02-03", "message": [ "로컬 스토리지 저장 기능을 개선했습니다.", "검색 카드 디자인 및 기능을 개선했습니다." @@ -90,6 +103,7 @@ }, "2.1.0": { "title": "버전 2.1.0", + "date": "2026-02-08", "message": [ "비로그인 (Guest) 유저로 부를 곡 기능을 사용할 수 있습니다.", "하단 네비게이션 바에 애니메이션 효과를 추가하여 UX를 개선했습니다." @@ -97,6 +111,7 @@ }, "2.2.0": { "title": "버전 2.2.0", + "date": "2026-02-20", "message": [ "일본 가수를 한글로 검색할 수 있습니다. 초성으로도 가능합니다.", "유명 일본 가수를 한눈에 조회할 수 있습니다." @@ -104,6 +119,7 @@ }, "2.3.0": { "title": "버전 2.3.0", + "date": "2026-03-02", "message": [ "인기곡 페이지의 UI를 개선했습니다. 이제 인기곡 페이지에서 곡을 추천할 수 있습니다.", "로그인 시 제공되는 코인을 30개로 변경했습니다." @@ -111,10 +127,12 @@ }, "2.4.0": { "title": "버전 2.4.0", + "date": "2026-04-06", "message": ["네온 나이트 다크 테마를 추가했습니다.", "전체적인 UI를 개선했습니다."] }, "2.5.0": { "title": "버전 2.5.0", + "date": "2026-04-19", "message": ["일본 가수, 곡의 한글 번역을 추가했습니다."] } } diff --git a/apps/web/src/Sidebar.tsx b/apps/web/src/Sidebar.tsx index b6461c4a..b7104f09 100644 --- a/apps/web/src/Sidebar.tsx +++ b/apps/web/src/Sidebar.tsx @@ -1,6 +1,6 @@ 'use client'; -import { Check, LogOut, Menu, Pencil, User, X } from 'lucide-react'; +import { Check, LogOut, Menu, Pencil, ScrollText, User, X } from 'lucide-react'; import Image from 'next/image'; import { useRouter } from 'next/navigation'; import { useState } from 'react'; @@ -57,6 +57,11 @@ export default function Sidebar() { setIsOpenSidebar(false); }; + const handleOpenPatchNotes = () => { + router.push('/patch-notes'); + setIsOpenSidebar(false); + }; + const handleLogin = () => { router.push('/login'); setIsOpenSidebar(false); @@ -129,7 +134,16 @@ export default function Sidebar() { -
+
+ +
diff --git a/apps/web/src/app/info/page.tsx b/apps/web/src/app/info/page.tsx index 52fdb8a3..afd42c9c 100644 --- a/apps/web/src/app/info/page.tsx +++ b/apps/web/src/app/info/page.tsx @@ -1,6 +1,6 @@ 'use client'; -import { CircleDollarSign, Flag, Folder, ScrollText, Star } from 'lucide-react'; +import { CircleDollarSign, Flag, Folder, Star } from 'lucide-react'; import { useRouter } from 'next/navigation'; import CountUp from '@/components/reactBits/CountUp'; @@ -28,12 +28,6 @@ const menuItems = [ description: '내가 신고한 곡 오류를 확인하고 삭제합니다', icon: , }, - { - id: 'patch-notes', - title: '패치노트', - description: '앱 업데이트 내역을 확인합니다', - icon: , - }, ]; export default function LibraryPage() { diff --git a/apps/web/src/app/info/patch-notes/page.tsx b/apps/web/src/app/info/patch-notes/page.tsx deleted file mode 100644 index 36dc3b16..00000000 --- a/apps/web/src/app/info/patch-notes/page.tsx +++ /dev/null @@ -1,59 +0,0 @@ -'use client'; - -import { ArrowLeft } from 'lucide-react'; -import { useRouter } from 'next/navigation'; - -import { Button } from '@/components/ui/button'; -import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; -import { ScrollArea } from '@/components/ui/scroll-area'; -import changelog from '../../../../public/changelog.json'; - -type ChangelogEntry = { title: string; message: string[] }; - -const entries = Object.entries(changelog as Record).reverse(); - -export default function PatchNotesPage() { - const router = useRouter(); - - return ( -
-
- -

패치노트

-
- - -
- {entries.map(([version, entry]) => ( - - - {entry.title} - - -
    - {entry.message.map((line, idx) => { - const isSub = line.startsWith('-'); - return ( -
  • - {isSub ? line : `• ${line}`} -
  • - ); - })} -
-
-
- ))} -
-
-
- ); -} diff --git a/apps/web/src/app/patch-notes/page.tsx b/apps/web/src/app/patch-notes/page.tsx new file mode 100644 index 00000000..151d606a --- /dev/null +++ b/apps/web/src/app/patch-notes/page.tsx @@ -0,0 +1,78 @@ +'use client'; + +import { ArrowLeft } from 'lucide-react'; +import { useRouter } from 'next/navigation'; + +import { Button } from '@/components/ui/button'; +import { ScrollArea } from '@/components/ui/scroll-area'; + +import changelog from '../../../public/changelog.json'; + +type ChangelogEntry = { title: string; date?: string; message: string[] }; + +const entries = Object.entries(changelog as Record).reverse(); + +export default function PatchNotesPage() { + const router = useRouter(); + + return ( +
+
+ +

패치노트

+
+ + +
    + + + {entries.map(([version, entry]) => ( +
  1. +
    + {entry.date ?? ''} +
    + +
    + + +
    + +
    +
    버전 {version}
    +
      + {entry.message.map((line, idx) => { + const isSub = line.startsWith('-'); + return ( +
    • + {isSub ? line : `• ${line}`} +
    • + ); + })} +
    +
    +
  2. + ))} +
+
+
+ ); +} diff --git a/apps/web/src/auth.tsx b/apps/web/src/auth.tsx index ec511c06..bf07ce0b 100644 --- a/apps/web/src/auth.tsx +++ b/apps/web/src/auth.tsx @@ -13,6 +13,7 @@ const ALLOW_PATHS = [ '/recent', '/tosing', '/update-password', + '/patch-notes', ]; export default function AuthProvider({ children }: { children: React.ReactNode }) { From c3c7dac5b50d9d0e2f7418d9eddd4d0b80406452 Mon Sep 17 00:00:00 2001 From: GulSam00 Date: Fri, 15 May 2026 01:39:08 +0900 Subject: [PATCH 3/4] =?UTF-8?q?refactor=20:=20SearchHistory=20=EC=9D=98=20?= =?UTF-8?q?hydration=20=EB=B6=84=EA=B8=B0=20=EB=A1=9C=EC=A7=81=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=20=EB=B0=8F=20=EB=B9=88=20=EC=83=81=ED=83=9C=20?= =?UTF-8?q?=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=B6=94=EA=B0=80=20(#228)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/src/app/search/SearchHistory.tsx | 61 ++++++++++------------- 1 file changed, 27 insertions(+), 34 deletions(-) diff --git a/apps/web/src/app/search/SearchHistory.tsx b/apps/web/src/app/search/SearchHistory.tsx index 5e3091de..d1f6dbf3 100644 --- a/apps/web/src/app/search/SearchHistory.tsx +++ b/apps/web/src/app/search/SearchHistory.tsx @@ -9,13 +9,6 @@ interface SearchHistoryProps { export default function SearchHistory({ onHistoryClick }: SearchHistoryProps) { const { searchHistory, removeFromHistory } = useSearchHistoryStore(); - const [isHydrated, setIsHydrated] = useState(false); - - useEffect(() => { - if (searchHistory.length > 0) { - setIsHydrated(true); - } - }, [searchHistory]); return (
@@ -23,34 +16,34 @@ export default function SearchHistory({ onHistoryClick }: SearchHistoryProps) {

최근 검색어

- {!isHydrated ? ( -
- -
- ) : ( -
- {searchHistory.slice(0, 10).map((term, index) => ( -
+ {searchHistory.length === 0 && ( +
+ 최근 검색어가 없습니다. +
+ )} + {searchHistory.slice(0, 10).map((term, index) => ( +
+ onHistoryClick(term)} > - onHistoryClick(term)} - > - {term} - - removeFromHistory(term)} - title="검색 기록 삭제" - > - - -
- ))} -
- )} + {term} + + removeFromHistory(term)} + title="검색 기록 삭제" + > + + +
+ ))} + ); } From 1f5047dda19b9fcbff6dc92a88d3cd32afb23b62 Mon Sep 17 00:00:00 2001 From: GulSam00 Date: Fri, 15 May 2026 01:39:12 +0900 Subject: [PATCH 4/4] =?UTF-8?q?chore=20:=20claude=20settings=20=EC=97=90?= =?UTF-8?q?=20bypassPermissions=20=EA=B8=B0=EB=B3=B8=20=EB=AA=A8=EB=93=9C?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=20(#228)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/settings.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.claude/settings.json b/.claude/settings.json index 0ef714b9..a373c0b8 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -1,4 +1,9 @@ { + "permissions": { + "permissions": { + "defaultMode": "bypassPermissions" + } + }, "hooks": { "SessionStart": [ {