import React, { useState, useEffect } from 'react' import { useParams, useNavigate, Link } from 'react-router-dom' import { useComponents } from '../../contexts/ComponentContext' import { FaRegSave, FaArrowLeft, FaSync, FaCode, FaEye, FaCog } from 'react-icons/fa' import ComponentPreview from '../../components/componentEditor/ComponentPreview' import { ROUTES_ENUM } from '@/routes/route.constant' import { useLocalization } from '@/utils/hooks/useLocalization' import { Formik, Form, Field } from 'formik' import * as Yup from 'yup' import { Button, Checkbox, FormContainer, FormItem, Input } from '@/components/ui' import { generateDesignerCode } from '@/components/visualDesigner/codeGenerator' import { createDesignerId, createEmptyDesignerDocument, type DesignerDocument, } from '@/components/visualDesigner/types' // Validation schema const validationSchema = Yup.object({ name: Yup.string().required(), routePath: Yup.string().required().matches(/^\//, 'Route path must start with /'), description: Yup.string(), dependencies: Yup.array().of(Yup.string()), isActive: Yup.boolean(), }) const ComponentEditor: React.FC = () => { const { id } = useParams() const navigate = useNavigate() const { translate } = useLocalization() const { getComponent, addComponent, updateComponent } = useComponents() const [isLoaded, setIsLoaded] = useState(false) const isEditing = !!id // Initial values for Formik const [initialValues, setInitialValues] = useState({ name: '', routePath: '', description: '', dependencies: [] as string[], isActive: true, }) // Load existing component data - sadece edit modunda useEffect(() => { if (isEditing && id && !isLoaded) { const component = getComponent(id) if (component) { // Parse dependencies from JSON string let deps: string[] = [] try { deps = component.dependencies ? JSON.parse(component.dependencies) : [] deps = Array.isArray(deps) ? deps : [] } catch { deps = [] } const values = { name: component.name, routePath: component.routePath, description: component.description || '', dependencies: deps, isActive: component.isActive, } setInitialValues(values) setIsLoaded(true) } } else if (!isEditing && !isLoaded) { // Yeni komponent için boş başla - TEMPLATE YOK setIsLoaded(true) } }, [id, isEditing, getComponent, isLoaded]) const createDefaultVisualDocument = (componentName: string): DesignerDocument => { const document = createEmptyDesignerDocument('visual') document.nodes = [ { id: createDesignerId(), type: 'span', kind: 'html', props: { children: componentName.trim() }, events: {}, bindings: {}, children: [], }, ] return document } const handleSubmit = async (values: typeof initialValues, { setSubmitting }: any) => { if (!values.name.trim()) { alert('Please enter a component name') setSubmitting(false) return } try { const existingComponent = isEditing && id ? getComponent(id) : undefined const defaultDocument = createDefaultVisualDocument(values.name) const componentData = { name: values.name.trim(), routePath: values.routePath.trim(), description: values.description.trim(), dependencies: JSON.stringify(values.dependencies), // Serialize dependencies to JSON string code: existingComponent ? existingComponent.code : generateDesignerCode(values.name, defaultDocument), props: existingComponent ? existingComponent.props : JSON.stringify({ visualDesigner: defaultDocument }), isActive: values.isActive, } if (isEditing && id) { await updateComponent(id, componentData) } else { await addComponent(componentData) } navigate(ROUTES_ENUM.protected.saas.developerKit.components) } catch (error) { console.error('Error saving component:', error) alert('Failed to save component. Please try again.') } finally { setSubmitting(false) } } // Loading state - komponent yüklenene kadar bekle if (isEditing && !isLoaded) { return (
{translate('::App.Loading')}
{isEditing ? 'Modify your React component' : 'Create a new React component'}