animetix-web / frontend /src /features /manga-reader /components /ChapterDownloadButton.tsx
MissawB's picture
Upload folder using huggingface_hub (part 4)
df2e14d verified
Raw
History Blame Contribute Delete
1.77 kB
import React from 'react';
import { Download, Loader2, Trash2, AlertCircle } from 'lucide-react';
import { useChapterDownload } from '../offline/useChapterDownload';
import type { DownloadablePage } from '../offline/offlineLibrary';
export interface ApiChapter {
id: number;
number: number;
title: string;
pages: DownloadablePage[];
}
export const ChapterDownloadButton: React.FC<{
mediaId: string;
mediaTitle: string;
chapter: ApiChapter;
}> = ({ mediaId, mediaTitle, chapter }) => {
const meta = {
mediaId,
mediaTitle,
chapterNumber: chapter.number,
chapterTitle: chapter.title,
};
const { status, progress, error, download, remove } = useChapterDownload(meta, chapter.pages);
if (status === 'downloading') {
return (
<span className="flex items-center gap-1.5 text-[10px] font-black text-anime-accent">
<Loader2 className="w-4 h-4 animate-spin" />
{Math.round(progress * 100)}%
</span>
);
}
if (status === 'downloaded') {
return (
<button
type="button"
onClick={remove}
aria-label="Supprimer le téléchargement"
className="p-2 rounded-full text-green-400 hover:bg-red-500/10 hover:text-red-500 transition-colors"
>
<Trash2 className="w-4 h-4" />
</button>
);
}
return (
<button
type="button"
onClick={download}
aria-label="Télécharger le chapitre"
title={error || undefined}
className={`p-2 rounded-full transition-colors ${
status === 'error' ? 'text-red-500 hover:bg-red-500/10' : 'opacity-50 hover:opacity-100 hover:bg-white/10'
}`}
>
{status === 'error' ? <AlertCircle className="w-4 h-4" /> : <Download className="w-4 h-4" />}
</button>
);
};