feat: clear play record & favorites

This commit is contained in:
shinya
2025-06-26 19:34:36 +08:00
parent 1e9e8fb07a
commit 3652bf3e6b
3 changed files with 72 additions and 8 deletions

View File

@@ -5,7 +5,7 @@ import Link from 'next/link';
import { Suspense, useEffect, useState } from 'react';
// 客户端收藏 API
import { getAllFavorites } from '@/lib/db.client';
import { clearAllFavorites, getAllFavorites } from '@/lib/db.client';
import CapsuleSwitch from '@/components/CapsuleSwitch';
import ContinueWatching from '@/components/ContinueWatching';
@@ -118,9 +118,20 @@ function HomeClient() {
{activeTab === 'favorites' ? (
// 收藏夹视图
<section className='mb-8'>
<h2 className='mb-4 text-xl font-bold text-gray-800 text-left'>
</h2>
<div className='mb-4 flex items-center justify-between'>
<h2 className='text-xl font-bold text-gray-800'></h2>
{favoriteItems.length > 0 && (
<button
className='text-sm text-gray-500 hover:text-gray-700'
onClick={async () => {
await clearAllFavorites();
setFavoriteItems([]);
}}
>
</button>
)}
</div>
<div className='justify-start grid grid-cols-3 gap-x-2 gap-y-14 sm:gap-y-20 px-2 sm:grid-cols-[repeat(auto-fill,_minmax(11rem,_1fr))] sm:gap-x-8 sm:px-4'>
{favoriteItems.map((item) => (
<div key={item.id + item.source} className='w-full'>

View File

@@ -4,7 +4,7 @@
import { useEffect, useState } from 'react';
import type { PlayRecord } from '@/lib/db.client';
import { getAllPlayRecords } from '@/lib/db.client';
import { clearAllPlayRecords, getAllPlayRecords } from '@/lib/db.client';
import ScrollableRow from '@/components/ScrollableRow';
import VideoCard from '@/components/VideoCard';
@@ -71,9 +71,20 @@ export default function ContinueWatching({ className }: ContinueWatchingProps) {
return (
<section className={`mb-8 ${className || ''}`}>
<h2 className='mb-4 text-xl font-bold text-gray-800 text-left'>
</h2>
<div className='mb-4 flex items-center justify-between'>
<h2 className='text-xl font-bold text-gray-800'></h2>
{!loading && playRecords.length > 0 && (
<button
className='text-sm text-gray-500 hover:text-gray-700'
onClick={async () => {
await clearAllPlayRecords();
setPlayRecords([]);
}}
>
</button>
)}
</div>
<ScrollableRow>
{loading
? // 加载状态显示灰色占位数据

View File

@@ -439,3 +439,45 @@ export async function toggleFavorite(
await saveFavorite(source, id, favoriteData);
return true;
}
/**
* 清空全部播放记录
*/
export async function clearAllPlayRecords(): Promise<void> {
// 数据库模式
if (STORAGE_TYPE === 'database') {
try {
await fetch('/api/playrecords', {
method: 'DELETE',
});
} catch (err) {
console.error('清空播放记录失败:', err);
}
return;
}
// localStorage 模式
if (typeof window === 'undefined') return;
localStorage.removeItem(PLAY_RECORDS_KEY);
}
/**
* 清空全部收藏
*/
export async function clearAllFavorites(): Promise<void> {
// 数据库模式
if (STORAGE_TYPE === 'database') {
try {
await fetch('/api/favorites', {
method: 'DELETE',
});
} catch (err) {
console.error('清空收藏失败:', err);
}
return;
}
// localStorage 模式
if (typeof window === 'undefined') return;
localStorage.removeItem(FAVORITES_KEY);
}