import { Title } from "@solidjs/meta" import { createSignal, onCleanup, onMount, Show, For } from "solid-js" import { useParams } from "@solidjs/router" type Message = { key: string content: string } export default function SharePage() { const params = useParams<{ id: string }>() const [messages, setMessages] = createSignal([]) const [connectionStatus, setConnectionStatus] = createSignal("Disconnected") onMount(() => { // Get the API URL from environment const apiUrl = import.meta.env.VITE_API_URL const shareId = params.id console.log("Mounting Share component with ID:", shareId) console.log("API URL:", apiUrl) if (!apiUrl) { console.error("API URL not found in environment variables") setConnectionStatus("Error: API URL not found") return } let reconnectTimer: number | undefined let socket: WebSocket | null = null // Function to create and set up WebSocket with auto-reconnect const setupWebSocket = () => { // Close any existing connection if (socket) { socket.close() } setConnectionStatus("Connecting...") // Always use secure WebSocket protocol (wss) const wsBaseUrl = apiUrl.replace(/^https?:\/\//, "wss://") const wsUrl = `${wsBaseUrl}/share_poll?share_id=${shareId}` console.log("Connecting to WebSocket URL:", wsUrl) // Create WebSocket connection socket = new WebSocket(wsUrl) // Handle connection opening socket.onopen = () => { setConnectionStatus("Connected") console.log("WebSocket connection established") } // Handle incoming messages socket.onmessage = (event) => { console.log("WebSocket message received") try { const data = JSON.parse(event.data) as Message setMessages((prev) => [...prev, data]) } catch (error) { console.error("Error parsing WebSocket message:", error) } } // Handle errors socket.onerror = (error) => { console.error("WebSocket error:", error) setConnectionStatus("Error: Connection failed") } // Handle connection close and reconnection socket.onclose = (event) => { console.log(`WebSocket closed: ${event.code} ${event.reason}`) setConnectionStatus("Disconnected, reconnecting...") // Try to reconnect after 2 seconds clearTimeout(reconnectTimer) reconnectTimer = window.setTimeout( setupWebSocket, 2000, ) as unknown as number } } // Initial connection setupWebSocket() // Clean up on component unmount onCleanup(() => { console.log("Cleaning up WebSocket connection") if (socket) { socket.close() } clearTimeout(reconnectTimer) }) }) return (
Share: {params.id}

Share: {params.id}

WebSocket Connection

Status: {connectionStatus()}

Live Updates

0} fallback={

Waiting for messages...

} >
    {(msg) => (
  • Key: {msg.key}
    Content: {msg.content}
  • )}
) }