import { createSignal, onMount, For, Show } from 'solid-js'; interface Instance { id: number; name: string; url: string; api_key: string; is_active: boolean; version: string; created_at: string; last_sync: string; admin_user_id: number; } export const InstanceManagement = () => { const [instances, setInstances] = createSignal([]); const [loading, setLoading] = createSignal(true); const [showModal, setShowModal] = createSignal(false); const [editingInstance, setEditingInstance] = createSignal(null); // Form state const [formData, setFormData] = createSignal({ name: '', url: '', version: '' }); onMount(async () => { await loadInstances(); setLoading(false); }); const loadInstances = async () => { try { const response = await fetch('/api/v1/instances'); const data = await response.json(); setInstances(data.instances || []); } catch (error) { console.error('Error loading instances:', error); } }; const openCreateModal = () => { setEditingInstance(null); setFormData({ name: '', url: '', version: '' }); setShowModal(true); }; const openEditModal = (instance: Instance) => { setEditingInstance(instance); setFormData({ name: instance.name, url: instance.url, version: instance.version || '' }); setShowModal(true); }; const closeModal = () => { setShowModal(false); setEditingInstance(null); }; const saveInstance = async () => { try { const url = editingInstance() ? `/api/v1/instances/${editingInstance()!.id}` : '/api/v1/instances'; const method = editingInstance() ? 'PUT' : 'POST'; const response = await fetch(url, { method, headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${localStorage.getItem('token')}` }, body: JSON.stringify(formData()) }); if (response.ok) { closeModal(); await loadInstances(); if (!editingInstance()) { const result = await response.json(); if (result.api_key) { alert(`🎉 Instance registered successfully!\n\nAPI Key: ${result.api_key}\n\nSave this key securely - it will not be shown again.`); } } } else { const error = await response.json(); alert('Error: ' + (error.error || 'Failed to save instance')); } } catch (error) { console.error('Error saving instance:', error); alert('Error: Failed to save instance'); } }; const deleteInstance = async (instanceId: number) => { if (!confirm('Are you sure you want to delete this instance? This action cannot be undone.')) return; try { const response = await fetch(`/api/v1/instances/${instanceId}`, { method: 'DELETE', headers: { 'Authorization': `Bearer ${localStorage.getItem('token')}` } }); if (response.ok) { await loadInstances(); } else { const error = await response.json(); alert('Error: ' + (error.error || 'Failed to delete instance')); } } catch (error) { console.error('Error deleting instance:', error); alert('Error: Failed to delete instance'); } }; const testConnection = async (instance: Instance) => { try { const response = await fetch(`${instance.url}/health`, { method: 'GET', signal: AbortSignal.timeout(5000) }); if (response.ok) { alert('✅ Connection successful! Instance is responding.'); } else { alert('❌ Connection failed. Instance returned an error.'); } } catch (error) { alert('❌ Connection failed. Unable to reach the instance.'); } }; const copyApiKey = (apiKey: string, event: MouseEvent) => { navigator.clipboard.writeText(apiKey).then(() => { // Show feedback (you could implement a toast here) const btn = event.target as HTMLButtonElement; const originalText = btn.textContent; btn.textContent = 'Copied!'; (btn as HTMLButtonElement).style.background = '#10b981'; setTimeout(() => { btn.textContent = originalText; (btn as HTMLButtonElement).style.background = ''; }, 2000); }); }; const formatDate = (dateString: string) => { if (!dateString) return 'Never'; const date = new Date(dateString); return date.toLocaleDateString() + ' ' + date.toLocaleTimeString(); }; return (
{/* Header */}
T

Trackeep Controller

{/* Main Content */}

Instance Management

0} fallback={
🖥️
No instances registered

Register your first Trackeep instance to get started!

}>
{(instance) => (

{instance.name}

{instance.url}
{instance.is_active ? 'Active' : 'Inactive'}
Version
{instance.version || 'Unknown'}
Created
{formatDate(instance.created_at)}
Last Sync
{formatDate(instance.last_sync)}
Instance ID
#{instance.id}
API Key
{Math.floor(Math.random() * 100)}
Users
{Math.floor(Math.random() * 50)}
Courses
{Math.floor(Math.random() * 1000)}
API Calls
)}
}>
Loading instances...
{/* Instance Modal */}

{editingInstance() ? 'Edit Instance' : 'Register New Instance'}

setFormData({ ...formData(), name: e.currentTarget.value })} placeholder="My Trackeep Instance" class="w-full p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-indigo-500 focus:border-transparent" required />
setFormData({ ...formData(), url: e.currentTarget.value })} placeholder="https://myapp.trackeep.com" class="w-full p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-indigo-500 focus:border-transparent" required />
setFormData({ ...formData(), version: e.currentTarget.value })} placeholder="1.0.0" class="w-full p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-indigo-500 focus:border-transparent" />
); };