import { useState } from 'react' import { useTranslation } from 'react-i18next' import { Group, Server } from '@/types' import { Edit, Trash, Copy, Check } from '@/components/icons/LucideIcons' import DeleteDialog from '@/components/ui/DeleteDialog' import { useToast } from '@/contexts/ToastContext' interface GroupCardProps { group: Group servers: Server[] onEdit: (group: Group) => void onDelete: (groupId: string) => void } const GroupCard = ({ group, servers, onEdit, onDelete }: GroupCardProps) => { const { t } = useTranslation() const { showToast } = useToast() const [showDeleteDialog, setShowDeleteDialog] = useState(false) const [copied, setCopied] = useState(false) const handleEdit = () => { onEdit(group) } const handleDelete = () => { setShowDeleteDialog(true) } const handleConfirmDelete = () => { onDelete(group.id) setShowDeleteDialog(false) } const copyToClipboard = () => { if (navigator.clipboard && window.isSecureContext) { navigator.clipboard.writeText(group.id).then(() => { setCopied(true) setTimeout(() => setCopied(false), 2000) }) } else { // Fallback for HTTP or unsupported clipboard API const textArea = document.createElement('textarea') textArea.value = group.id // Avoid scrolling to bottom textArea.style.position = 'fixed' textArea.style.left = '-9999px' document.body.appendChild(textArea) textArea.focus() textArea.select() try { document.execCommand('copy') setCopied(true) setTimeout(() => setCopied(false), 2000) } catch (err) { showToast(t('common.copyFailed') || 'Copy failed', 'error') console.error('Copy to clipboard failed:', err) } document.body.removeChild(textArea) } } // Get servers that belong to this group const groupServers = servers.filter(server => group.servers.includes(server.name)) return (
{group.description}
)}{t('groups.noServers')}
) : (