+
-
-
-
-
-
- 노래방 통계 콘텐츠가 여기에 표시됩니다
-
-
-
-
+
+
);
diff --git a/apps/web/app/popular/page.tsx b/apps/web/app/popular/page.tsx
index 1e63896..6b5e755 100644
--- a/apps/web/app/popular/page.tsx
+++ b/apps/web/app/popular/page.tsx
@@ -1,67 +1,27 @@
-import RankingList from './RankingList';
+import { Construction } from 'lucide-react';
-// 샘플 데이터
-const WEEKLY_HOT_SONGS = [
- { rank: 1, title: 'Love Lee', artist: 'AKMU', num_tj: '97531', num_ky: '84612' },
- { rank: 2, title: 'Perfect Night', artist: '르세라핌', num_tj: '97485', num_ky: '84599' },
- { rank: 3, title: 'Drama', artist: 'aespa', num_tj: '97462', num_ky: '84587' },
- { rank: 4, title: 'Smoke', artist: '다이나믹 듀오', num_tj: '97421', num_ky: '84563' },
- { rank: 5, title: 'Seven (feat. Latto)', artist: '정국', num_tj: '97380', num_ky: '84542' },
- { rank: 6, title: 'Super Shy', artist: 'NewJeans', num_tj: '97325', num_ky: '84521' },
- { rank: 7, title: '헤어지자 말해요', artist: '박재정', num_tj: '97289', num_ky: '84503' },
- { rank: 8, title: 'ETA', artist: 'NewJeans', num_tj: '97245', num_ky: '84487' },
- { rank: 9, title: 'Hype Boy', artist: 'NewJeans', num_tj: '97201', num_ky: '84462' },
- { rank: 10, title: '사랑은 늘 도망가', artist: '임영웅', num_tj: '97156', num_ky: '84441' },
-];
-
-const MONTHLY_HOT_SONGS = [
- { rank: 1, title: '사랑은 늘 도망가', artist: '임영웅', num_tj: '97156', num_ky: '84441' },
- { rank: 2, title: '모든 날, 모든 순간', artist: '폴킴', num_tj: '96842', num_ky: '84321' },
- { rank: 3, title: '다시 만날 수 있을까', artist: '임영웅', num_tj: '96789', num_ky: '84298' },
- { rank: 4, title: "That's Hilarious", artist: 'Charlie Puth', num_tj: '96745', num_ky: '84276' },
- { rank: 5, title: 'LOVE DIVE', artist: 'IVE', num_tj: '96701', num_ky: '84254' },
- { rank: 6, title: '취중고백', artist: '김민석', num_tj: '96654', num_ky: '84231' },
- {
- rank: 7,
- title: 'That That',
- artist: '싸이 (Prod. & Feat. SUGA of BTS)',
- num_tj: '96612',
- num_ky: '84209',
- },
- { rank: 8, title: 'TOMBOY', artist: '(여자)아이들', num_tj: '96578', num_ky: '84187' },
- { rank: 9, title: '사랑인가 봐', artist: '멜로망스', num_tj: '96534', num_ky: '84165' },
- {
- rank: 10,
- title: 'GANADARA',
- artist: '박재범 (Feat. 아이유)',
- num_tj: '96498',
- num_ky: '84143',
- },
-];
-
-const TROT_HOT_SONGS = [
- { rank: 1, title: '이제 나만 믿어요', artist: '임영웅', num_tj: '96321', num_ky: '84098' },
- { rank: 2, title: '별빛 같은 나의 사랑아', artist: '임영웅', num_tj: '96287', num_ky: '84076' },
- { rank: 3, title: '보금자리', artist: '임영웅', num_tj: '96254', num_ky: '84054' },
- { rank: 4, title: '사랑은 늘 도망가', artist: '임영웅', num_tj: '97156', num_ky: '84441' },
- { rank: 5, title: '찐이야', artist: '영탁', num_tj: '96187', num_ky: '84032' },
- { rank: 6, title: '다시 만날 수 있을까', artist: '임영웅', num_tj: '96789', num_ky: '84298' },
- { rank: 7, title: '막걸리 한잔', artist: '임영웅', num_tj: '96121', num_ky: '84010' },
- { rank: 8, title: '당신이 좋은 이유', artist: '설운도', num_tj: '96087', num_ky: '83988' },
- { rank: 9, title: '진또배기', artist: '홍진영', num_tj: '96054', num_ky: '83966' },
- { rank: 10, title: '찐이야', artist: '홍진영', num_tj: '96021', num_ky: '83944' },
-];
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
export default function PopularPage() {
return (
-
-
인기 노래
+
+
+
+ 서비스 준비 중
+
+ 더 나은 서비스를 위해 준비 중입니다
+
+
-
-
-
-
-
+
+
+
+ 곧 새로운 기능으로 찾아뵙겠습니다
+
+ 조금만 기다려주세요
+
+
+
);
}
diff --git a/apps/web/app/stores/useSongStore.ts b/apps/web/app/stores/useSongStore.ts
index 1a3ed4b..8ac6b47 100644
--- a/apps/web/app/stores/useSongStore.ts
+++ b/apps/web/app/stores/useSongStore.ts
@@ -1,5 +1,8 @@
import { create } from 'zustand';
+import { deleteLikedSongsArray, getLikedSongs } from '@/lib/api/like_activites';
+import { getRecentSongs } from '@/lib/api/songs';
+import { deleteToSingSongs, getToSingSongs, postToSingSongsArray } from '@/lib/api/tosings';
import { AddListModalSong, ToSing } from '@/types/song';
interface SongStore {
@@ -11,6 +14,7 @@ interface SongStore {
refreshLikedSongs: () => Promise
;
refreshRecentSongs: () => Promise;
postToSingSongs: (songIds: string[]) => Promise;
+ deleteToSingSong: (songId: string) => Promise;
deleteLikedSongs: (songIds: string[]) => Promise;
}
@@ -24,46 +28,45 @@ const useSongStore = create((set, get) => ({
},
refreshToSings: async () => {
- const response = await fetch('/api/songs/tosing');
- const { success, data } = await response.json();
+ const { success, data } = await getToSingSongs();
if (success) {
set({ toSings: data });
}
},
refreshLikedSongs: async () => {
- const response = await fetch('/api/songs/like');
- const { success, data } = await response.json();
+ const { success, data } = await getLikedSongs();
if (success) {
set({ likedSongs: data });
}
},
refreshRecentSongs: async () => {
- const response = await fetch('/api/songs/recent');
- const { success, data } = await response.json();
+ const { success, data } = await getRecentSongs();
if (success) {
set({ recentSongs: data });
}
},
postToSingSongs: async (songIds: string[]) => {
- const response = await fetch('/api/songs/tosing/array', {
- method: 'POST',
- body: JSON.stringify({ songIds }),
- });
- const { success } = await response.json();
+ const { success } = await postToSingSongsArray({ songIds });
if (success) {
get().refreshToSings();
get().refreshLikedSongs();
get().refreshRecentSongs();
}
},
+
+ deleteToSingSong: async (songId: string) => {
+ const { success } = await deleteToSingSongs({ songId });
+ if (success) {
+ get().refreshToSings();
+ get().refreshLikedSongs();
+ get().refreshRecentSongs();
+ }
+ },
+
deleteLikedSongs: async (songIds: string[]) => {
- const response = await fetch('/api/songs/like/arr', {
- method: 'DELETE',
- body: JSON.stringify({ songIds }),
- });
- const { success } = await response.json();
+ const { success } = await deleteLikedSongsArray({ songIds });
if (success) {
get().refreshLikedSongs();
}
diff --git a/apps/web/app/types/likeLog.ts b/apps/web/app/types/likeLog.ts
new file mode 100644
index 0000000..1e2ae30
--- /dev/null
+++ b/apps/web/app/types/likeLog.ts
@@ -0,0 +1,5 @@
+export interface LikeLog {
+ song_id: string;
+ user_id: string;
+ created_at: string;
+}
diff --git a/apps/web/app/types/sing_log.ts b/apps/web/app/types/singLog.ts
similarity index 100%
rename from apps/web/app/types/sing_log.ts
rename to apps/web/app/types/singLog.ts
diff --git a/apps/web/app/types/userStat.ts b/apps/web/app/types/userStat.ts
new file mode 100644
index 0000000..22647cf
--- /dev/null
+++ b/apps/web/app/types/userStat.ts
@@ -0,0 +1,8 @@
+export interface UserSongStat {
+ userId: string;
+ songId: string;
+ singCount: number;
+ lastSingAt: string;
+ title: string;
+ artist: string;
+}
diff --git a/apps/web/app/update-password/page.tsx b/apps/web/app/update-password/page.tsx
index fa29e3c..89b0d7f 100644
--- a/apps/web/app/update-password/page.tsx
+++ b/apps/web/app/update-password/page.tsx
@@ -60,7 +60,7 @@ export default function UpdatePasswordPage() {
useEffect(() => {
const supabase = createClient();
- supabase.auth.onAuthStateChange(async (event, session) => {
+ supabase.auth.onAuthStateChange(async event => {
if (event == 'PASSWORD_RECOVERY') {
setStep('reset'); // 비밀번호 재설정 단계로 이동
}
diff --git a/apps/web/package.json b/apps/web/package.json
index fd4ad58..cc83b5f 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -29,6 +29,8 @@
"@supabase/supabase-js": "^2.49.1",
"@tanstack/react-query": "^5.68.0",
"@tanstack/react-query-devtools": "^5.68.0",
+ "@vercel/analytics": "^1.5.0",
+ "@vercel/speed-insights": "^1.2.0",
"axios": "^1.5.0",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
diff --git a/packages/open-api/src/test.ts b/packages/open-api/src/test.ts
index 8916e65..1eba272 100644
--- a/packages/open-api/src/test.ts
+++ b/packages/open-api/src/test.ts
@@ -36,7 +36,7 @@ console.log('get song test');
// console.log('get release test');
-let year = 2010;
+let year = 2025;
let month = 1;
const parseMonth = (month: number) => {
@@ -54,9 +54,7 @@ while (year <= 2025) {
// console.log('response9', `${year}${parseMonth(month)}`, response9?.length);
response9?.forEach((item: any) => {
const { title, singer, composer, lyricist } = item;
- if (singer === 'ヨルシカ') {
- console.log('item', item);
- }
+ console.log('item', item);
});
month++;
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 4a85292..aa91e17 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -181,6 +181,12 @@ importers:
'@tanstack/react-query-devtools':
specifier: ^5.68.0
version: 5.68.0(@tanstack/react-query@5.68.0(react@19.0.0))(react@19.0.0)
+ '@vercel/analytics':
+ specifier: ^1.5.0
+ version: 1.5.0(next@15.2.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)
+ '@vercel/speed-insights':
+ specifier: ^1.2.0
+ version: 1.2.0(next@15.2.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)
axios:
specifier: ^1.5.0
version: 1.8.3
@@ -2779,6 +2785,55 @@ packages:
peerDependencies:
'@urql/core': ^5.0.0
+ '@vercel/analytics@1.5.0':
+ resolution: {integrity: sha512-MYsBzfPki4gthY5HnYN7jgInhAZ7Ac1cYDoRWFomwGHWEX7odTEzbtg9kf/QSo7XEsEAqlQugA6gJ2WS2DEa3g==}
+ peerDependencies:
+ '@remix-run/react': ^2
+ '@sveltejs/kit': ^1 || ^2
+ next: '>= 13'
+ react: ^18 || ^19 || ^19.0.0-rc
+ svelte: '>= 4'
+ vue: ^3
+ vue-router: ^4
+ peerDependenciesMeta:
+ '@remix-run/react':
+ optional: true
+ '@sveltejs/kit':
+ optional: true
+ next:
+ optional: true
+ react:
+ optional: true
+ svelte:
+ optional: true
+ vue:
+ optional: true
+ vue-router:
+ optional: true
+
+ '@vercel/speed-insights@1.2.0':
+ resolution: {integrity: sha512-y9GVzrUJ2xmgtQlzFP2KhVRoCglwfRQgjyfY607aU0hh0Un6d0OUyrJkjuAlsV18qR4zfoFPs/BiIj9YDS6Wzw==}
+ peerDependencies:
+ '@sveltejs/kit': ^1 || ^2
+ next: '>= 13'
+ react: ^18 || ^19 || ^19.0.0-rc
+ svelte: '>= 4'
+ vue: ^3
+ vue-router: ^4
+ peerDependenciesMeta:
+ '@sveltejs/kit':
+ optional: true
+ next:
+ optional: true
+ react:
+ optional: true
+ svelte:
+ optional: true
+ vue:
+ optional: true
+ vue-router:
+ optional: true
+
'@webassemblyjs/ast@1.14.1':
resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==}
@@ -10261,6 +10316,16 @@ snapshots:
'@urql/core': 5.1.1
wonka: 6.3.5
+ '@vercel/analytics@1.5.0(next@15.2.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)':
+ optionalDependencies:
+ next: 15.2.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ react: 19.0.0
+
+ '@vercel/speed-insights@1.2.0(next@15.2.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)':
+ optionalDependencies:
+ next: 15.2.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ react: 19.0.0
+
'@webassemblyjs/ast@1.14.1':
dependencies:
'@webassemblyjs/helper-numbers': 1.13.2