import { Message, Server } from "@/types/types"; import axios from "axios"; import { Dispatch, RefObject, SetStateAction } from "react"; export function makeAddress(ip: string, defaultPort = 7080) { return ip.includes(":") ? `${ip}` : `${ip}:${defaultPort}`; } export default async function auth( ip: string, wsRef: RefObject, setServer: Dispatch>, setMessages: Dispatch>, onNewMessage?: (m: Message) => void ) { const server_auth = ( (await axios.post("/api/auth", { server_ip: ip })).data as any ).token; // Open the WebSocket connection const ws = new WebSocket(`ws://${ip}`); wsRef.current = ws; ws.onopen = () => { console.log("Connected to WebSocket:", ip); ws.send( JSON.stringify({ version: "0.0.1", auth_token: server_auth, last_message: 0, }) ); }; ws.onmessage = (m) => { const data = JSON.parse(m.data); console.log("Message received:", data); if (data.version) { setServer(data); return; } switch (data.type) { case "authenticated": setMessages(data.params.messages); break; case "message_create": if (onNewMessage) onNewMessage(data.params as Message); setMessages((prev) => [...prev, data.params]); break; } }; ws.onerror = (err) => { console.error("WebSocket error:", err); }; ws.onclose = () => { console.log("WebSocket closed:", ip); }; // Cleanup on unmount or id change return () => { ws.close(); }; }