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.name}

{group.id}
{group.description && (

{group.description}

)}
{t('groups.serverCount', { count: group.servers.length })}
{groupServers.length === 0 ? (

{t('groups.noServers')}

) : (
{groupServers.map(server => (
{server.name}
))}
)}
setShowDeleteDialog(false)} onConfirm={handleConfirmDelete} serverName={group.name} isGroup={true} />
) } export default GroupCard