import React, { useState, useEffect } from 'react'; import { X, Save, Calendar, MapPin, User, Loader2 } from 'lucide-react'; import { UserInput, Gender } from '../../types'; import SmartBaziInput from '../SmartBaziInput'; interface CreateProfileModalProps { onClose: () => void; onSave: (data: UserInput) => void; initialData?: UserInput & { id: string; isDefault: boolean; createdAt: string; }; } const CreateProfileModal: React.FC = ({ onClose, onSave, initialData }) => { const [useSmartInput, setUseSmartInput] = useState(true); const [isSubmitting, setIsSubmitting] = useState(false); const [errors, setErrors] = useState>({}); const [formData, setFormData] = useState(() => { if (initialData) { const { id, isDefault, createdAt, ...userData } = initialData; return userData; } // Default values for new profile return { name: '', birthPlace: '', gender: Gender.MALE, birthYear: '', yearPillar: '', monthPillar: '', dayPillar: '', hourPillar: '', startAge: '', firstDaYun: '', modelName: 'gemini-3-pro-preview', apiBaseUrl: 'https://ttkk.inping.com/v1', apiKey: '', useCustomApi: false, authEmail: '', authPassword: '', }; }); const handleBasicInputChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setFormData(prev => ({ ...prev, [name]: value })); // Clear error when user starts typing if (errors[name]) { setErrors(prev => ({ ...prev, [name]: '' })); } }; const handleBaziCalculated = (baziData: any) => { setFormData(prev => ({ ...prev, birthPlace: baziData.birthPlace || prev.birthPlace, birthYear: baziData.birthYear, yearPillar: baziData.yearPillar, monthPillar: baziData.monthPillar, dayPillar: baziData.dayPillar, hourPillar: baziData.hourPillar, startAge: baziData.startAge, firstDaYun: baziData.firstDaYun, })); // Clear bazi errors if they exist if (errors.bazi) { setErrors(prev => ({ ...prev, bazi: '' })); } }; const validateForm = () => { const newErrors: Record = {}; // Name is required if (!formData.name.trim()) { newErrors.name = 'Name is required'; } // Check if Bazi data is complete const hasBasicInfo = formData.birthYear && formData.birthPlace; const hasCompleteBazi = formData.yearPillar && formData.monthPillar && formData.dayPillar && formData.hourPillar; if (!hasBasicInfo && !hasCompleteBazi) { newErrors.bazi = 'Please provide either birth details or complete Bazi pillars'; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!validateForm()) { return; } setIsSubmitting(true); try { await onSave(formData); } catch (error) { console.error('Failed to save profile:', error); setErrors({ submit: 'Failed to save profile. Please try again.' }); } finally { setIsSubmitting(false); } }; const toggleInputMode = () => { setUseSmartInput(!useSmartInput); // Clear bazi-related errors when switching modes if (errors.bazi) { setErrors(prev => ({ ...prev, bazi: '' })); } }; return (
{/* Header */}

{initialData ? 'Edit Profile' : 'Create New Profile'}

{/* Form */}
{/* Basic Information */}

Basic Information

{/* Name */}
{errors.name && (

{errors.name}

)}
{/* Gender */}
{/* Bazi Information */}

Birth Information

{errors.bazi && (
{errors.bazi}
)} {useSmartInput ? ( ) : (
{/* Manual input fields */}
{/* Bazi Pillars */}
)}
{/* Error Message */} {errors.submit && (
{errors.submit}
)} {/* Actions */}
); }; export default CreateProfileModal;