mirror of
https://github.com/KuekHaoYang/KVideo.git
synced 2026-08-12 23:33:43 +08:00
94 lines
2.7 KiB
TypeScript
94 lines
2.7 KiB
TypeScript
'use client';
|
|
|
|
import { useMemo, useState } from 'react';
|
|
import { useRouter } from 'next/navigation';
|
|
import { Navbar } from '@/components/layout/Navbar';
|
|
import { FavoritesPageHeader } from '@/components/favorites/FavoritesPageHeader';
|
|
import { FavoritesGrid } from '@/components/favorites/FavoritesGrid';
|
|
import { FavoritesSidebar } from '@/components/favorites/FavoritesSidebar';
|
|
import { WatchHistorySidebar } from '@/components/history/WatchHistorySidebar';
|
|
import { ConfirmDialog } from '@/components/ui/ConfirmDialog';
|
|
import { useFavorites } from '@/lib/store/favorites-store';
|
|
|
|
interface FavoritesPageContentProps {
|
|
isPremium?: boolean;
|
|
}
|
|
|
|
export function FavoritesPageContent({
|
|
isPremium = false,
|
|
}: FavoritesPageContentProps) {
|
|
const router = useRouter();
|
|
const { favorites, clearFavorites } = useFavorites(isPremium);
|
|
const [sortBy, setSortBy] = useState<'date' | 'title'>('date');
|
|
const [isClearDialogOpen, setIsClearDialogOpen] = useState(false);
|
|
|
|
const sortedFavorites = useMemo(() => {
|
|
if (sortBy === 'title') {
|
|
return [...favorites].sort((a, b) => a.title.localeCompare(b.title, 'zh-CN'));
|
|
}
|
|
|
|
return favorites;
|
|
}, [favorites, sortBy]);
|
|
|
|
return (
|
|
<div
|
|
className={
|
|
isPremium
|
|
? 'min-h-screen bg-black'
|
|
: 'min-h-screen bg-[var(--bg-color)] bg-[image:var(--bg-image)] bg-fixed'
|
|
}
|
|
>
|
|
<Navbar
|
|
onReset={() => router.push(isPremium ? '/premium' : '/')}
|
|
isPremiumMode={isPremium}
|
|
/>
|
|
|
|
<main className="max-w-7xl mx-auto px-4 py-8 space-y-8">
|
|
<FavoritesPageHeader
|
|
count={favorites.length}
|
|
sortBy={sortBy}
|
|
onSortChange={setSortBy}
|
|
onClearAll={() => setIsClearDialogOpen(true)}
|
|
/>
|
|
|
|
<FavoritesGrid favorites={sortedFavorites} isPremium={isPremium} />
|
|
</main>
|
|
|
|
<FavoritesSidebar isPremium={isPremium} />
|
|
<WatchHistorySidebar isPremium={isPremium} />
|
|
|
|
<ConfirmDialog
|
|
isOpen={isClearDialogOpen}
|
|
title="清空收藏"
|
|
message="确定要清空所有收藏吗?此操作不可撤销。"
|
|
confirmText="清空"
|
|
cancelText="取消"
|
|
onConfirm={() => {
|
|
clearFavorites();
|
|
setIsClearDialogOpen(false);
|
|
}}
|
|
onCancel={() => setIsClearDialogOpen(false)}
|
|
dangerous
|
|
/>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
interface FavoritesPageFallbackProps {
|
|
isPremium?: boolean;
|
|
}
|
|
|
|
export function FavoritesPageFallback({
|
|
isPremium = false,
|
|
}: FavoritesPageFallbackProps) {
|
|
return (
|
|
<div
|
|
className={`min-h-screen flex items-center justify-center${
|
|
isPremium ? ' bg-black' : ''
|
|
}`}
|
|
>
|
|
<div className="animate-spin rounded-full h-16 w-16 border-4 border-[var(--accent-color)] border-t-transparent" />
|
|
</div>
|
|
);
|
|
}
|