|
| 1 | +'use client'; |
| 2 | + |
| 3 | +import React, { useEffect, useState } from 'react'; |
| 4 | +import { |
| 5 | + Sheet, |
| 6 | + SheetContent, |
| 7 | + SheetHeader, |
| 8 | + SheetTitle, |
| 9 | +} from '@/components/ui/sheet'; |
| 10 | +import { Button } from '@/components/ui/button'; |
| 11 | +import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; |
| 12 | +import { Zap, RefreshCw, LayoutPanelLeft, X } from 'lucide-react'; |
| 13 | + |
| 14 | +interface UsageSidebarProps { |
| 15 | + isOpen: boolean; |
| 16 | + onClose: () => void; |
| 17 | +} |
| 18 | + |
| 19 | +export function UsageSidebar({ isOpen, onClose }: UsageSidebarProps) { |
| 20 | + const [usage, setUsage] = useState<any[]>([]); |
| 21 | + const [credits, setCredits] = useState(0); |
| 22 | + |
| 23 | + useEffect(() => { |
| 24 | + if (isOpen) { |
| 25 | + // Mock data for now as per the screenshot |
| 26 | + setUsage([ |
| 27 | + { details: 'Efficiently Fix Pull Request ...', date: '2026-01-17 08:05', change: -418 }, |
| 28 | + { details: 'Fix Build and Add Parallel S...', date: '2026-01-16 06:10', change: -482 }, |
| 29 | + { details: 'How to Add a Feature to a ...', date: '2026-01-14 10:42', change: -300 }, |
| 30 | + ]); |
| 31 | + setCredits(0); |
| 32 | + } |
| 33 | + }, [isOpen]); |
| 34 | + |
| 35 | + return ( |
| 36 | + <Sheet open={isOpen} onOpenChange={onClose}> |
| 37 | + <SheetContent className="w-full sm:max-w-[400px] p-0 overflow-y-auto"> |
| 38 | + <div className="p-6 space-y-6"> |
| 39 | + <div className="flex justify-between items-center"> |
| 40 | + <h2 className="text-xl font-semibold">Usage</h2> |
| 41 | + <Button variant="ghost" size="icon" onClick={onClose}> |
| 42 | + <X size={20} /> |
| 43 | + </Button> |
| 44 | + </div> |
| 45 | + |
| 46 | + <div className="p-4 border rounded-xl space-y-4"> |
| 47 | + <div className="flex justify-between items-center"> |
| 48 | + <span className="italic font-medium text-lg">Free</span> |
| 49 | + <Button size="sm" className="rounded-full px-4" onClick={() => window.open('https://buy.stripe.com/3cIaEX3tRcur9EM7tbasg00', '_blank')}>Upgrade</Button> |
| 50 | + </div> |
| 51 | + |
| 52 | + <div className="space-y-2"> |
| 53 | + <div className="flex items-center justify-between text-sm"> |
| 54 | + <div className="flex items-center gap-2"> |
| 55 | + <Zap size={16} className="text-muted-foreground" /> |
| 56 | + <span>Credits</span> |
| 57 | + </div> |
| 58 | + <span className="font-bold">{credits}</span> |
| 59 | + </div> |
| 60 | + <div className="flex items-center justify-between text-xs text-muted-foreground pl-6"> |
| 61 | + <span>Free credits</span> |
| 62 | + <span>0</span> |
| 63 | + </div> |
| 64 | + </div> |
| 65 | + |
| 66 | + <div className="space-y-1"> |
| 67 | + <div className="flex items-center justify-between text-sm"> |
| 68 | + <div className="flex items-center gap-2"> |
| 69 | + <RefreshCw size={16} className="text-muted-foreground" /> |
| 70 | + <span>Daily refresh credits</span> |
| 71 | + </div> |
| 72 | + <span className="font-bold">300</span> |
| 73 | + </div> |
| 74 | + <p className="text-[10px] text-muted-foreground pl-6">Refresh to 300 at 00:00 every day</p> |
| 75 | + </div> |
| 76 | + </div> |
| 77 | + |
| 78 | + <div className="space-y-4"> |
| 79 | + <div className="flex items-center justify-between"> |
| 80 | + <div className="flex items-center gap-2"> |
| 81 | + <LayoutPanelLeft size={18} /> |
| 82 | + <span className="font-medium">Website usage & billing</span> |
| 83 | + </div> |
| 84 | + <Button variant="ghost" size="icon" className="h-4 w-4"> |
| 85 | + <span className="sr-only">View more</span> |
| 86 | + <svg width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" className="h-4 w-4"><path d="M6.1584 3.1356C6.35366 2.94034 6.67024 2.94034 6.8655 3.1356L10.8655 7.13561C11.0608 7.33087 11.0608 7.64745 10.8655 7.84271L6.8655 11.8427C6.67024 12.038 6.35366 12.038 6.1584 11.8427C5.96314 11.6474 5.96314 11.3309 6.1584 11.1356L9.80485 7.48916L6.1584 3.84271C5.96314 3.64745 5.96314 3.33087 6.1584 3.1356Z" fill="currentColor" fillRule="evenodd" clipRule="evenodd"></path></svg> |
| 87 | + </Button> |
| 88 | + </div> |
| 89 | + |
| 90 | + <Table> |
| 91 | + <TableHeader> |
| 92 | + <TableRow> |
| 93 | + <TableHead className="text-xs">Details</TableHead> |
| 94 | + <TableHead className="text-xs">Date</TableHead> |
| 95 | + <TableHead className="text-xs text-right">Credits change</TableHead> |
| 96 | + </TableRow> |
| 97 | + </TableHeader> |
| 98 | + <TableBody> |
| 99 | + {usage.map((item, i) => ( |
| 100 | + <TableRow key={i}> |
| 101 | + <TableCell className="text-xs font-medium">{item.details}</TableCell> |
| 102 | + <TableCell className="text-[10px] text-muted-foreground">{item.date}</TableCell> |
| 103 | + <TableCell className="text-xs text-right font-medium">{item.change}</TableCell> |
| 104 | + </TableRow> |
| 105 | + ))} |
| 106 | + </TableBody> |
| 107 | + </Table> |
| 108 | + </div> |
| 109 | + </div> |
| 110 | + </SheetContent> |
| 111 | + </Sheet> |
| 112 | + ); |
| 113 | +} |
0 commit comments