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' // Validation schema const validationSchema = Yup.object({ name: Yup.string().required(), description: Yup.string(), dependencies: Yup.array().of(Yup.string()), code: 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: '', description: '', dependencies: [] as string[], code: '', 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, description: component.description || '', dependencies: deps, code: component.code, 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]) // Generate component template based on name const generateComponentTemplate = (componentName: string): string => { if (!componentName.trim()) return '' // Convert component name to PascalCase if not already const pascalCaseName = componentName.charAt(0).toUpperCase() + componentName.slice(1) return `const ${pascalCaseName}Component = ({ title = "${pascalCaseName}" }) => { return ( {title} ); }; export default ${pascalCaseName}Component;` } const handleSubmit = async (values: typeof initialValues, { setSubmitting }: any) => { if (!values.name.trim()) { alert('Please enter a component name') setSubmitting(false) return } try { const componentData = { name: values.name.trim(), description: values.description.trim(), dependencies: JSON.stringify(values.dependencies), // Serialize dependencies to JSON string code: values.code.trim(), isActive: values.isActive, } if (isEditing && id) { updateComponent(id, componentData) } else { 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'}