mirror of
https://github.com/MoonTechLab/LunaTV.git
synced 2026-03-13 01:17:29 +08:00
feat: clear play record & favorites
This commit is contained in:
@@ -5,7 +5,7 @@ import Link from 'next/link';
|
|||||||
import { Suspense, useEffect, useState } from 'react';
|
import { Suspense, useEffect, useState } from 'react';
|
||||||
|
|
||||||
// 客户端收藏 API
|
// 客户端收藏 API
|
||||||
import { getAllFavorites } from '@/lib/db.client';
|
import { clearAllFavorites, getAllFavorites } from '@/lib/db.client';
|
||||||
|
|
||||||
import CapsuleSwitch from '@/components/CapsuleSwitch';
|
import CapsuleSwitch from '@/components/CapsuleSwitch';
|
||||||
import ContinueWatching from '@/components/ContinueWatching';
|
import ContinueWatching from '@/components/ContinueWatching';
|
||||||
@@ -118,9 +118,20 @@ function HomeClient() {
|
|||||||
{activeTab === 'favorites' ? (
|
{activeTab === 'favorites' ? (
|
||||||
// 收藏夹视图
|
// 收藏夹视图
|
||||||
<section className='mb-8'>
|
<section className='mb-8'>
|
||||||
<h2 className='mb-4 text-xl font-bold text-gray-800 text-left'>
|
<div className='mb-4 flex items-center justify-between'>
|
||||||
我的收藏
|
<h2 className='text-xl font-bold text-gray-800'>我的收藏</h2>
|
||||||
</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'>
|
<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) => (
|
{favoriteItems.map((item) => (
|
||||||
<div key={item.id + item.source} className='w-full'>
|
<div key={item.id + item.source} className='w-full'>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
|
|
||||||
import type { PlayRecord } from '@/lib/db.client';
|
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 ScrollableRow from '@/components/ScrollableRow';
|
||||||
import VideoCard from '@/components/VideoCard';
|
import VideoCard from '@/components/VideoCard';
|
||||||
@@ -71,9 +71,20 @@ export default function ContinueWatching({ className }: ContinueWatchingProps) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<section className={`mb-8 ${className || ''}`}>
|
<section className={`mb-8 ${className || ''}`}>
|
||||||
<h2 className='mb-4 text-xl font-bold text-gray-800 text-left'>
|
<div className='mb-4 flex items-center justify-between'>
|
||||||
继续观看
|
<h2 className='text-xl font-bold text-gray-800'>继续观看</h2>
|
||||||
</h2>
|
{!loading && playRecords.length > 0 && (
|
||||||
|
<button
|
||||||
|
className='text-sm text-gray-500 hover:text-gray-700'
|
||||||
|
onClick={async () => {
|
||||||
|
await clearAllPlayRecords();
|
||||||
|
setPlayRecords([]);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
清空
|
||||||
|
</button>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
<ScrollableRow>
|
<ScrollableRow>
|
||||||
{loading
|
{loading
|
||||||
? // 加载状态显示灰色占位数据
|
? // 加载状态显示灰色占位数据
|
||||||
|
|||||||
@@ -439,3 +439,45 @@ export async function toggleFavorite(
|
|||||||
await saveFavorite(source, id, favoriteData);
|
await saveFavorite(source, id, favoriteData);
|
||||||
return true;
|
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);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user