appLotoDemo Page - TSX
appLotoDemo Page - TSX
// Types
type RaffleType = 'Daily' | 'Weekly' | 'Monthly' | 'Yearly'
interface Raffle {
id: number
type: RaffleType
prize: number
endsIn: string
entries: number
}
interface User {
name: string
avatar: string
entries: { [key in RaffleType]: number }
adsWatched: number
totalEarnings: number
}
// Mock data
const initialRaffles: Raffle[] = [
{ id: 1, type: 'Daily', prize: 100, endsIn: '23:59:59', entries: 0 },
{ id: 2, type: 'Weekly', prize: 500, endsIn: '6 days', entries: 0 },
{ id: 3, type: 'Monthly', prize: 2000, endsIn: '29 days', entries: 0 },
{ id: 4, type: 'Yearly', prize: 10000, endsIn: '11 months', entries: 0 },
]
useEffect(() => {
if (isWatchingAd) {
const timer = setInterval(() => {
setAdProgress((prevProgress) => {
if (prevProgress >= 100) {
clearInterval(timer)
setIsWatchingAd(false)
handleAdComplete()
return 0
}
return prevProgress + 10
})
}, 500)
return () => clearInterval(timer)
}
}, [isWatchingAd])
return (
<div className="container mx-auto px-4 py-8">
<header className="flex justify-between items-center mb-8">
<h1 className="text-4xl font-bold">AdRaffle</h1>
<div className="flex items-center space-x-4">
<Button variant="ghost" size="icon">
<Bell className="h-5 w-5" />
<span className="sr-only">Notifications</span>
</Button>
<Avatar>
<AvatarImage src={user.avatar} alt={user.name} />
<AvatarFallback>{user.name.charAt(0)}</AvatarFallback>
</Avatar>
</div>
</header>
<aside>
<Card>
<CardHeader>
<CardTitle>Your Profile</CardTitle>
</CardHeader>
<CardContent className="space-y-4">
<div className="flex items-center space-x-4">
<Avatar>
<AvatarImage src={user.avatar} alt={user.name} />
<AvatarFallback>{user.name.charAt(0)}</AvatarFallback>
</Avatar>
<div>
<p className="font-semibold">{user.name}</p>
<p className="text-sm text-muted-foreground">Member since
2023</p>
</div>
</div>
<div className="space-y-2">
<div className="flex justify-between">
<span className="flex items-center">
<Package className="mr-2 h-4 w-4" />
Ads Watched
</span>
<span>{user.adsWatched}</span>
</div>
<div className="flex justify-between">
<span className="flex items-center">
<Trophy className="mr-2 h-4 w-4" />
Total Earnings
</span>
<span>${user.totalEarnings.toFixed(2)}</span>
</div>
</div>
</CardContent>
</Card>
</aside>
</div>