// 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 { Modal, FormField, FormSelect, PrimaryButton, SecondaryButton, MultiselectPaginatedSelect } from '@/components/shared'; // import { moduleService } from '@/services/module-service'; // // Validation schema - matches backend validation // const newTenantSchema = z.object({ // name: z // .string() // .min(1, 'name is required') // .min(3, 'name must be at least 3 characters') // .max(100, 'name must be at most 100 characters'), // slug: z // .string() // .min(1, 'slug is required') // .min(3, 'slug must be at least 3 characters') // .max(100, 'slug must be at most 100 characters') // .regex(/^[a-z0-9-]+$/, 'slug format is invalid'), // status: z.enum(['active', 'suspended', 'deleted'], { // message: 'Status is required', // }), // settings: z.any().optional().nullable(), // subscription_tier: z.enum(['basic', 'professional', 'enterprise'], { // message: 'Invalid subscription tier', // }).optional().nullable(), // max_users: z.number().int().min(1, 'max_users must be at least 1').optional().nullable(), // max_modules: z.number().int().min(1, 'max_modules must be at least 1').optional().nullable(), // modules: z.array(z.string().uuid()).optional().nullable(), // }); // type NewTenantFormData = z.infer; // interface NewTenantModalProps { // isOpen: boolean; // onClose: () => void; // onSubmit: (data: NewTenantFormData) => Promise; // isLoading?: boolean; // } // const statusOptions = [ // { value: 'active', label: 'Active' }, // { value: 'suspended', label: 'Suspended' }, // { value: 'deleted', label: 'Deleted' }, // ]; // const subscriptionTierOptions = [ // { value: 'basic', label: 'Basic' }, // { value: 'professional', label: 'Professional' }, // { value: 'enterprise', label: 'Enterprise' }, // ]; // export const NewTenantModal = ({ // isOpen, // onClose, // onSubmit, // isLoading = false, // }: NewTenantModalProps): ReactElement | null => { // const [selectedModules, setSelectedModules] = useState([]); // const { // register, // handleSubmit, // setValue, // watch, // reset, // setError, // clearErrors, // formState: { errors }, // } = useForm({ // resolver: zodResolver(newTenantSchema), // defaultValues: { // status: 'active', // settings: null, // subscription_tier: null, // max_users: null, // max_modules: null, // modules: [], // }, // }); // const statusValue = watch('status'); // const subscriptionTierValue = watch('subscription_tier'); // // Load modules for multiselect // const loadModules = async (page: number, limit: number) => { // const response = await moduleService.getRunningModules(page, limit); // return { // options: response.data.map((module) => ({ // value: module.id, // label: module.name, // })), // pagination: response.pagination, // }; // }; // // Reset form when modal closes // useEffect(() => { // if (!isOpen) { // reset({ // name: '', // slug: '', // status: 'active', // settings: null, // subscription_tier: null, // max_users: null, // max_modules: null, // modules: [], // }); // setSelectedModules([]); // clearErrors(); // } // }, [isOpen, reset, clearErrors]); // const handleFormSubmit = async (data: NewTenantFormData): Promise => { // clearErrors(); // try { // const { modules, ...restData } = data; // const submitData = { // ...restData, // module_ids: selectedModules.length > 0 ? selectedModules : undefined, // }; // await onSubmit(submitData); // } catch (error: any) { // // Handle validation errors from API // if (error?.response?.data?.details && Array.isArray(error.response.data.details)) { // const validationErrors = error.response.data.details; // validationErrors.forEach((detail: { path: string; message: string }) => { // if ( // detail.path === 'name' || // detail.path === 'slug' || // detail.path === 'status' || // detail.path === 'settings' || // detail.path === 'subscription_tier' || // detail.path === 'max_users' || // detail.path === 'max_modules' || // detail.path === 'module_ids' // ) { // // Map module_ids error to modules field for display // const fieldPath = detail.path === 'module_ids' ? 'modules' : detail.path; // setError(fieldPath as keyof NewTenantFormData, { // type: 'server', // message: detail.message, // }); // } // }); // } else { // // Handle general errors // // Check for nested error object with message property // const errorObj = error?.response?.data?.error; // const errorMessage = // (typeof errorObj === 'object' && errorObj !== null && 'message' in errorObj ? errorObj.message : null) || // (typeof errorObj === 'string' ? errorObj : null) || // error?.response?.data?.message || // error?.message || // 'Failed to create tenant. Please try again.'; // setError('root', { // type: 'server', // message: typeof errorMessage === 'string' ? errorMessage : 'Failed to create tenant. Please try again.', // }); // } // } // }; // return ( // // // Cancel // // // {isLoading ? 'Creating...' : 'Create Tenant'} // // // } // > //
// {/* General Error Display */} // {errors.root && ( //
//

{errors.root.message}

//
// )} //
// {/* Tenant Name */} // // {/* Slug */} // // {/* Status and Subscription Tier Row */} //
//
// setValue('status', value as 'active' | 'suspended' | 'deleted')} // error={errors.status?.message} // /> //
//
// setValue('subscription_tier', value === '' ? null : value as 'basic' | 'professional' | 'enterprise')} // error={errors.subscription_tier?.message} // /> //
//
// {/* Max Users and Max Modules Row */} //
//
// { // if (value === '' || value === null || value === undefined) return null; // const num = Number(value); // return isNaN(num) ? null : num; // }, // })} // /> //
//
// { // if (value === '' || value === null || value === undefined) return null; // const num = Number(value); // return isNaN(num) ? null : num; // }, // })} // /> //
//
// {/* Modules Multiselect */} // { // setSelectedModules(values); // setValue('modules', values.length > 0 ? values : []); // }} // onLoadOptions={loadModules} // error={errors.modules?.message} // /> //
//
//
// ); // };