'use client'; import { useTranslations } from 'next-intl'; import { useEffect, useMemo, useState } from 'react'; import { Button } from '@/components/ui/button'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { Field, FieldGroup, FieldLabel } from '@/components/ui/field'; import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import type { CloudflareGroup, CloudflareMember, } from '@/lib/services/openflare'; export interface MemberMoveDialogProps { open: boolean; onOpenChange: (open: boolean) => void; members: CloudflareMember[]; groups: CloudflareGroup[]; currentGroupId: number; pending: boolean; onSubmit: (targetGroupId: number) => void; } export function MemberMoveDialog({ open, onOpenChange, members, groups, currentGroupId, pending, onSubmit, }: MemberMoveDialogProps) { const t = useTranslations('cloudflare'); const tCommon = useTranslations('common'); const [targetGroupId, setTargetGroupId] = useState(''); const availableGroups = useMemo( () => groups.filter((g) => g.id !== currentGroupId), [groups, currentGroupId], ); useEffect(() => { if (!open) return; setTargetGroupId(''); }, [open]); const title = members.length === 1 ? t('moveDialog.titleSingle', { domain: members[0]?.domain ?? '' }) : t('moveDialog.titleBatch', { count: members.length }); const description = members.length > 0 ? members.map((m) => m.domain).join(', ') : t('moveDialog.targetGroupLabel'); return ( { if (!pending) { onOpenChange(next); } }} > { if (pending) e.preventDefault(); }} onEscapeKeyDown={(e) => { if (pending) e.preventDefault(); }} > {title} {description} {availableGroups.length === 0 ? (

{t('moveDialog.noOtherGroups')}

) : ( {t('moveDialog.targetGroupLabel')} )}
); }