import React, { useEffect, useState } from 'react'; import { Link } from 'react-router-dom'; import { Clock3, Folder, RefreshCw, RotateCcw, Trash2 } from 'lucide-react'; import { Button } from '@/src/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/src/components/ui/card'; import { apiRequest } from '@/src/lib/api'; import type { PageResponse, RecycleBinItem } from '@/src/lib/types'; import { formatRecycleBinExpiresLabel, RECYCLE_BIN_RETENTION_DAYS } from './recycle-bin-state'; function formatFileSize(size: number) { if (size <= 0) { return '—'; } const units = ['B', 'KB', 'MB', 'GB']; const index = Math.min(Math.floor(Math.log(size) / Math.log(1024)), units.length - 1); const value = size / 1024 ** index; return `${value.toFixed(value >= 10 || index === 0 ? 0 : 1)} ${units[index]}`; } function formatDateTime(value: string) { return new Intl.DateTimeFormat('zh-CN', { month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', }).format(new Date(value)); } export default function RecycleBin() { const [items, setItems] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [restoringId, setRestoringId] = useState(null); const loadRecycleBin = async () => { setLoading(true); setError(''); try { const response = await apiRequest>('/files/recycle-bin?page=0&size=100'); setItems(response.items); } catch (requestError) { setError(requestError instanceof Error ? requestError.message : '回收站加载失败'); } finally { setLoading(false); } }; useEffect(() => { void loadRecycleBin(); }, []); const handleRestore = async (itemId: number) => { setRestoringId(itemId); setError(''); try { await apiRequest(`/files/recycle-bin/${itemId}/restore`, { method: 'POST', }); setItems((previous) => previous.filter((item) => item.id !== itemId)); } catch (requestError) { setError(requestError instanceof Error ? requestError.message : '恢复失败'); } finally { setRestoringId(null); } }; return (
回收站保留 {RECYCLE_BIN_RETENTION_DAYS} 天
网盘回收站

删除的文件会先进入回收站,{RECYCLE_BIN_RETENTION_DAYS} 天内可恢复,到期后自动清理。

返回网盘
{error ? (
{error}
) : null} {loading ? (
正在加载回收站...
) : items.length === 0 ? (

回收站为空

删除后的文件会在这里保留 10 天。

) : (
{items.map((item) => (

{item.filename}

{item.path}

{item.directory ? '文件夹' : formatFileSize(item.size)} 删除于 {formatDateTime(item.deletedAt)} {formatRecycleBinExpiresLabel(item.expiresAt)}
))}
)}
); }