import { Component, For, createSignal, createEffect, Show, onMount, onCleanup } from "solid-js" import { instances } from "../stores/instances" import { Trash2, ChevronDown } from "lucide-solid" import type { LogEntry } from "../types/instance" interface LogsViewProps { instanceId: string } const logsScrollState = new Map() const LogsView: Component = (props) => { let scrollRef: HTMLDivElement | undefined const savedState = logsScrollState.get(props.instanceId) const [autoScroll, setAutoScroll] = createSignal(savedState?.autoScroll ?? false) const instance = () => instances().get(props.instanceId) const logs = () => instance()?.logs ?? [] onMount(() => { if (scrollRef && savedState) { scrollRef.scrollTop = savedState.scrollTop } }) onCleanup(() => { if (scrollRef) { logsScrollState.set(props.instanceId, { scrollTop: scrollRef.scrollTop, autoScroll: autoScroll(), }) } }) createEffect(() => { if (autoScroll() && scrollRef && logs().length > 0) { scrollRef.scrollTop = scrollRef.scrollHeight } }) const handleScroll = () => { if (!scrollRef) return const isAtBottom = scrollRef.scrollHeight - scrollRef.scrollTop <= scrollRef.clientHeight + 50 setAutoScroll(isAtBottom) } const scrollToBottom = () => { if (scrollRef) { scrollRef.scrollTop = scrollRef.scrollHeight setAutoScroll(true) } } const formatTime = (timestamp: number) => { const date = new Date(timestamp) return date.toLocaleTimeString("en-US", { hour12: false, hour: "2-digit", minute: "2-digit", second: "2-digit", }) } const getLevelColor = (level: string) => { switch (level) { case "error": return "text-red-600 dark:text-red-400" case "warn": return "text-yellow-600 dark:text-yellow-400" case "debug": return "text-gray-500 dark:text-gray-500" default: return "text-gray-900 dark:text-gray-100" } } return (

Server Logs

0}>
Environment Variables ({Object.keys(instance()?.environmentVariables!).length})
{([key, value]) => (
{key} = {value}
)}
0} fallback={
Waiting for server output...
} > {(entry) => (
{formatTime(entry.timestamp)} {entry.message}
)}
) } export default LogsView