import { MigrateLogEntry } from '@/proxy/setup/models' import { useLocalization } from '@/utils/hooks/useLocalization' import { useEffect, useRef, useState } from 'react' import { createRoot } from 'react-dom/client' interface DbMigrateLogPanelProps { onClose: () => void } function levelColor(level: string): string { switch (level?.toLowerCase()) { case 'error': return 'text-red-400' case 'warn': case 'warning': return 'text-yellow-400' case 'success': return 'text-green-400' default: return 'text-gray-200' } } function DbMigrateLogPanel({ onClose }: DbMigrateLogPanelProps) { const [logs, setLogs] = useState([]) const [done, setDone] = useState(false) const bottomRef = useRef(null) useEffect(() => { const handler = (e: CustomEvent) => { setLogs((prev) => [...prev, e.detail]) } const doneHandler = () => setDone(true) window.addEventListener('db-migrate-log', handler as EventListener) window.addEventListener('db-migrate-done', doneHandler) return () => { window.removeEventListener('db-migrate-log', handler as EventListener) window.removeEventListener('db-migrate-done', doneHandler) } }, []) useEffect(() => { bottomRef.current?.scrollIntoView({ behavior: 'smooth' }) }, [logs]) return (
DB Migration Logs {done && ( )}
{logs.map((log, i) => (
[{log.level}] {log.message}
))} {!done && (
Running...
)}
) } let panelRoot: ReturnType | null = null let panelContainer: HTMLElement | null = null export function openDbMigrateLogPanel() { if (panelContainer) return panelContainer = document.createElement('div') document.body.appendChild(panelContainer) panelRoot = createRoot(panelContainer) const close = () => { panelRoot?.unmount() panelContainer?.remove() panelRoot = null panelContainer = null } panelRoot.render() } export function dispatchMigrateLog(entry: MigrateLogEntry) { window.dispatchEvent(new CustomEvent('db-migrate-log', { detail: entry })) } export function dispatchMigrateDone() { window.dispatchEvent(new CustomEvent('db-migrate-done')) }