import { useEffect, useState } from 'react'; import type { ReactElement } from 'react'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { Loader2 } from 'lucide-react'; import { Modal, FormField, FormSelect, PrimaryButton, SecondaryButton } from '@/components/shared'; import type { Tenant } from '@/types/tenant'; // Validation schema const editTenantSchema = z.object({ name: z.string().min(1, 'Tenant name is required'), slug: z.string().min(1, 'Slug is required'), status: z.enum(['active', 'suspended', 'blocked'], { message: 'Status is required', }), timezone: z.string().min(1, 'Timezone is required'), }); type EditTenantFormData = z.infer; interface EditTenantModalProps { isOpen: boolean; onClose: () => void; tenantId: string | null; onLoadTenant: (id: string) => Promise; onSubmit: (id: string, data: EditTenantFormData) => Promise; isLoading?: boolean; } const statusOptions = [ { value: 'active', label: 'Active' }, { value: 'suspended', label: 'Suspended' }, { value: 'blocked', label: 'Blocked' }, ]; const timezoneOptions = [ { value: 'America/New_York', label: 'America/New_York (EST)' }, { value: 'America/Chicago', label: 'America/Chicago (CST)' }, { value: 'America/Denver', label: 'America/Denver (MST)' }, { value: 'America/Los_Angeles', label: 'America/Los_Angeles (PST)' }, { value: 'UTC', label: 'UTC' }, { value: 'Europe/London', label: 'Europe/London (GMT)' }, { value: 'Asia/Dubai', label: 'Asia/Dubai (GST)' }, { value: 'Asia/Kolkata', label: 'Asia/Kolkata (IST)' }, { value: 'Asia/Tokyo', label: 'Asia/Tokyo (JST)' }, { value: 'Australia/Sydney', label: 'Australia/Sydney (AEDT)' }, ]; export const EditTenantModal = ({ isOpen, onClose, tenantId, onLoadTenant, onSubmit, isLoading = false, }: EditTenantModalProps): ReactElement | null => { const [isLoadingTenant, setIsLoadingTenant] = useState(false); const [loadError, setLoadError] = useState(null); const { register, handleSubmit, setValue, watch, reset, formState: { errors }, } = useForm({ resolver: zodResolver(editTenantSchema), }); const statusValue = watch('status'); const timezoneValue = watch('timezone'); // Load tenant data when modal opens useEffect(() => { if (isOpen && tenantId) { const loadTenant = async (): Promise => { try { setIsLoadingTenant(true); setLoadError(null); const tenant = await onLoadTenant(tenantId); reset({ name: tenant.name, slug: tenant.slug, status: tenant.status, timezone: tenant.settings?.timezone || 'America/New_York', }); } catch (err: any) { setLoadError(err?.response?.data?.error?.message || 'Failed to load tenant details'); } finally { setIsLoadingTenant(false); } }; loadTenant(); } else { reset({ name: '', slug: '', status: 'active', timezone: 'America/New_York', }); setLoadError(null); } }, [isOpen, tenantId, onLoadTenant, reset]); const handleFormSubmit = async (data: EditTenantFormData): Promise => { if (tenantId) { await onSubmit(tenantId, data); } }; return ( Cancel {isLoading ? 'Updating...' : 'Update Tenant'} } >
{isLoadingTenant && (
)} {loadError && (

{loadError}

)} {!isLoadingTenant && (
{/* Tenant Name */} {/* Slug */} {/* Status and Timezone Row */}
setValue('status', value as 'active' | 'suspended' | 'blocked')} error={errors.status?.message} /> setValue('timezone', value)} error={errors.timezone?.message} />
)}
); };