import AppLayout from '@/Layouts/AppLayout'; import { Head, router } from '@inertiajs/react'; import { Cloud, Plus, RefreshCw, Server, HardDrive, Database, Globe } from 'lucide-react'; import { GlassCard, StatCard } from '@/Components/ui/GlassCard'; import { StatusBadge } from '@/Components/ui/StatusBadge'; import { Button } from '@/Components/ui/Button'; import { DataTable } from '@/Components/ui/DataTable'; import { timeAgo } from '@/lib/utils'; import { motion } from 'framer-motion'; import { useState } from 'react'; const PROVIDERS = { aws: { label: 'Amazon Web Services', color: '#FF9900', icon: '☁' }, alibaba: { label: 'Alibaba Cloud', color: '#FF6A00', icon: '☁' }, tencent: { label: 'Tencent Cloud', color: '#00A3FF', icon: '☁' }, gcp: { label: 'Google Cloud', color: '#4285F4', icon: '☁' }, azure: { label: 'Microsoft Azure', color: '#0078D4', icon: '☁' }, digitalocean: { label: 'DigitalOcean', color: '#0080FF', icon: '☁' }, vultr: { label: 'Vultr', color: '#007BFC', icon: '☁' }, hetzner: { label: 'Hetzner', color: '#D50C2D', icon: '☁' }, }; const RESOURCE_ICONS = { ec2: Server, s3: HardDrive, rds: Database, vpc: Globe }; export default function CloudIndex({ accounts, resources, stats }) { const [syncLoading, setSyncLoading] = useState(null); const [selectedAccount, setSelectedAccount] = useState(null); const sync = (id) => { setSyncLoading(id); router.post(`/cloud/accounts/${id}/sync`, {}, { onFinish: () => setSyncLoading(null) }); }; const accountColumns = [ { header: 'Account', accessor: 'name', render: row => { const p = PROVIDERS[row.provider] ?? {}; return (
{row.name}
{p.label ?? row.provider}
{row.name}
{row.resource_id}
{key.toUpperCase()}
{count} account{count !== 1 ? 's' : ''}