import React, { useState, useEffect } from 'react'; import { Download, Loader2, FileText } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { api } from '@/lib/api/client'; import { toast } from 'sonner'; import SEOHead from '@/components/SEOHead'; interface DownloadItem { download_id: string; download_url: string; product_id: number; product_name: string; product_url: string; download_name: string; order_id: number; order_key: string; downloads_remaining: string; access_expires: string | null; file: { name: string; file: string; }; } export default function Downloads() { const [downloads, setDownloads] = useState([]); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { const fetchDownloads = async () => { try { setIsLoading(true); const data = await api.get('/account/downloads'); setDownloads(data); } catch (err: any) { console.error('Failed to fetch downloads:', err); setError(err.message || 'Failed to load downloads'); } finally { setIsLoading(false); } }; fetchDownloads(); }, []); const handleDownload = (downloadUrl: string, fileName: string) => { // Open download in new tab window.open(downloadUrl, '_blank'); toast.success(`Downloading ${fileName}`); }; if (isLoading) { return (

Downloads

Loading your downloads...

); } if (error) { return (

Downloads

{error}

); } if (downloads.length === 0) { return (

Downloads

No downloads available

Downloads will appear here after you purchase downloadable products.

); } return (

Downloads

{downloads.map((download) => (

{download.product_name}

{download.download_name || download.file?.name || 'Download'}

Order #{download.order_id} {download.downloads_remaining && download.downloads_remaining !== 'unlimited' && ( {download.downloads_remaining} downloads left )} {download.access_expires && ( Expires: {new Date(download.access_expires).toLocaleDateString()} )}
))}
{downloads.length > 0 && (

{downloads.length} {downloads.length === 1 ? 'download' : 'downloads'} available

)}
); }