import React, { useState, useRef, useEffect } from 'react' import { Editor } from '@monaco-editor/react' import { FaPlay, FaUpload, FaCode, FaCheckCircle, FaExclamationCircle, FaSpinner, FaCopy, FaExternalLinkAlt, FaTrash, FaSync, } from 'react-icons/fa' import { useLocalization } from '@/utils/hooks/useLocalization' import { dynamicServiceService, type CompileResult, type PublishResult, type DynamicServiceDto, postTestCompile, TestCompileDto, } from '@/services/dynamicService.service' const DynamicAppServiceEditor: React.FC = () => { // State const [code, setCode] = useState('') const [serviceName, setServiceName] = useState('') const [displayName, setDisplayName] = useState('') const [description, setDescription] = useState('') const [primaryEntityType, setPrimaryEntityType] = useState('') const [isCompiling, setIsCompiling] = useState(false) const [isPublishing, setIsPublishing] = useState(false) const [isLoading, setIsLoading] = useState(false) const [compileResult, setCompileResult] = useState(null) const [publishResult, setPublishResult] = useState(null) const [services, setServices] = useState([]) const [selectedService, setSelectedService] = useState(null) const [showServiceList, setShowServiceList] = useState(true) const { translate } = useLocalization() // Template kod const defaultTemplate = `using System; using System.Collections.Generic; using System.Threading.Tasks; using Volo.Abp.Application.Services; using Volo.Abp.Domain.Repositories; using Microsoft.AspNetCore.Authorization; namespace DynamicServices { [Authorize] public class DynamicCustomerAppService : ApplicationService { // Repository injection örneği (kendi entity'nizi kullanın) // private readonly IRepository _customerRepository; // public DynamicCustomerAppService(IRepository customerRepository) // { // _customerRepository = customerRepository; // } public virtual async Task GetHelloWorldAsync() { return await Task.FromResult("Hello World from Dynamic AppService!"); } public virtual async Task> GetSampleDataAsync() { return await Task.FromResult(new List { "Item 1", "Item 2", "Item 3" }); } // Repository kullanım örneği: // public virtual async Task> GetCustomersAsync() // { // return await _customerRepository.GetListAsync(); // } } }` // Component mount useEffect(() => { setCode(defaultTemplate) loadServices() }, []) // Monaco Editor ayarları const editorOptions = { fontSize: 14, lineNumbers: 'on' as const, roundedSelection: false, scrollBeyondLastLine: false, automaticLayout: true, minimap: { enabled: false }, folding: true, wordWrap: 'on' as const, theme: 'vs-dark', } // Servisleri yükle const loadServices = async () => { try { setIsLoading(true) const response = await dynamicServiceService.getList() setServices(response.items || []) } catch (error) { console.error('Servisler yüklenirken hata:', error) } finally { setIsLoading(false) } } // Test compile const handleTestCompile = async () => { if (!code.trim()) { alert('Lütfen kod girin') return } try { setIsCompiling(true) setCompileResult(null) console.log('Test compile code:', code) const input = { code: code } as TestCompileDto const result = await postTestCompile(input) setCompileResult(result.data) } catch (error: any) { console.error('Test compile error:', error) console.error('Error response:', error.response?.data) setCompileResult({ success: false, errorMessage: error.response?.data?.message || 'Derleme sırasında hata oluştu', compilationTimeMs: 0, hasWarnings: false, errors: [], }) } finally { setIsCompiling(false) } } // Publish const handlePublish = async () => { if (!code.trim() || !serviceName.trim()) { alert('Lütfen kod ve servis adını girin') return } try { setIsPublishing(true) setPublishResult(null) const requestData = { name: serviceName, code: code, displayName: displayName, description: description, primaryEntityType: primaryEntityType, } const result = await dynamicServiceService.publish(requestData) setPublishResult(result) if (result.success) { await loadServices() // Listeyi yenile } } catch (error: any) { console.error('Publish error:', error) console.error('Error response:', error.response?.data) setPublishResult({ success: false, errorMessage: error.response?.data?.message || 'Yayınlama sırasında hata oluştu', }) } finally { setIsPublishing(false) } } // Servisi yükle const loadService = async (service: DynamicServiceDto) => { try { const data = await dynamicServiceService.getById(service.id) setSelectedService(data) setCode(data.code) setServiceName(data.name) setDisplayName(data.displayName || '') setDescription(data.description || '') setPrimaryEntityType(data.primaryEntityType || '') setCompileResult(null) setPublishResult(null) } catch (error) { console.error('Servis yüklenirken hata:', error) } } // Servisi sil const deleteService = async (serviceId: string) => { if (!confirm('Bu servisi silmek istediğinizden emin misiniz?')) { return } try { await dynamicServiceService.delete(serviceId) await loadServices() if (selectedService?.id === serviceId) { setSelectedService(null) setCode(defaultTemplate) setServiceName('') setDisplayName('') setDescription('') setPrimaryEntityType('') } } catch (error) { console.error('Servis silinirken hata:', error) alert('Servis silinirken hata oluştu') } } // Yeni servis const newService = () => { setSelectedService(null) setCode(defaultTemplate) setServiceName('') setDisplayName('') setDescription('') setPrimaryEntityType('') setCompileResult(null) setPublishResult(null) } // Swagger aç const openSwagger = () => { window.open(`${import.meta.env.VITE_API_URL}/swagger/index.html`, '_blank') } // Kodu kopyala const copyCode = () => { navigator.clipboard.writeText(code) alert('Kod panoya kopyalandı') } return (
{/* Header */}

{translate('::App.DeveloperKit.DynamicServices')}

{translate('::App.DeveloperKit.DynamicServices.Description')}

{/* Service List */} {showServiceList && (

Mevcut Servisler

{isLoading ? (
Yükleniyor...
) : services.length > 0 ? ( services.map((service) => (
loadService(service)} >

{service.name}

{service.displayName && (

{service.displayName}

)}
{service.compilationStatus} v{service.version}
)) ) : (
Henüz servis yok
)}
)} {/* Main Editor */}
{/* Service Info Form */}
setServiceName(e.target.value)} placeholder="ör: DynamicCustomerAppService" className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
setDisplayName(e.target.value)} placeholder="ör: Müşteri Yönetimi" className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" />