diff --git a/src/app/chat/[id]/page.tsx b/src/app/chat/[id]/page.tsx new file mode 100644 index 0000000..ecdc88c --- /dev/null +++ b/src/app/chat/[id]/page.tsx @@ -0,0 +1,55 @@ +"use client"; + +import { useEffect, useRef, useState } from "react"; +import MessageBox from "@/components/MessageBox"; +import AppSidebar from "@/components/Sidebar"; +import Message from "@/types/message"; +import useUser, { User } from "@/hooks/get-user"; +import { NumberMap } from "@/types/typeUtils"; +import auth, { makeAddress } from "@/lib/auth"; +import { useParams } from "next/navigation"; + +// In this testing instance we are assuming that the target's node is localhost +// To make this functional we need to add a settings feature to the api + +export default function DMs() { + const { id } = useParams<{ id: string }>(); + const numericId = id ? Number(id) : undefined; + const wsRef = useRef(null); + const [messages, setMessages] = useState([]); + const { user, loading } = useUser(); + const [userList, setUserList] = useState>({}); + + useEffect(() => { + if (!numericId || !user || loading) return; + auth(makeAddress("localhost", 7090), wsRef, () => {}, setMessages); + setUserList((prev) => { + prev[user.id] = user; + return prev; + }); + }, [id, user, loading]); + + return ( + + m.channel_id === numericId || m.from === numericId) + .toReversed()} + sendMessage={(message) => { + wsRef.current?.send( + JSON.stringify({ + type: "send_message", + params: { + channel_id: numericId, + contents: message, + }, + }) + ); + }} + /> + + ); +} diff --git a/src/app/chat/page.tsx b/src/app/chat/page.tsx new file mode 100644 index 0000000..24882c3 --- /dev/null +++ b/src/app/chat/page.tsx @@ -0,0 +1,56 @@ +"use client"; + +import { useEffect, useRef, useState } from "react"; +import MessageBox from "@/components/MessageBox"; +import AppSidebar from "@/components/Sidebar"; +import Message from "@/types/message"; +import useUser, { User } from "@/hooks/get-user"; +import { NumberMap } from "@/types/typeUtils"; +import auth, { makeAddress } from "@/lib/auth"; + +// In this testing instance we are assuming that Alice's node is localhost +// To make this functional we need to add a settings feature to the api + +export default function AppHome() { + // Again we assume a static id, specifically Alice's user id + // const { id } = useParams<{ id: string }>(); + const id = 667; + const ip = "localhost"; + const wsRef = useRef(null); + const [messages, setMessages] = useState([]); + const { user, loading } = useUser(); + const [userList, setUserList] = useState>({}); + + useEffect(() => { + if (!ip || !user || loading) return; + auth(makeAddress(ip, 7090), wsRef, () => {}, setMessages); + setUserList((prev) => { + prev[user.id] = user; + return prev; + }); + }, [ip, user, loading]); + + return ( + + m.channel_id === id || m.from === id) + .toReversed()} + sendMessage={(message) => { + wsRef.current?.send( + JSON.stringify({ + type: "send_message", + params: { + channel_id: id, + contents: message, + }, + }) + ); + }} + /> + + ); +} diff --git a/src/app/home/page.tsx b/src/app/home/page.tsx deleted file mode 100644 index 3554c13..0000000 --- a/src/app/home/page.tsx +++ /dev/null @@ -1,21 +0,0 @@ -"use client"; - -import AppSidebar from "@/components/Sidebar"; -import MessageBox from "@/components/MessageBox"; -import useUser from "@/hooks/get-user"; - -export default function HomePage() { - const { user, loading } = useUser(); - - return ( - - {}} - sendMessage={() => {}} - /> - - ); -} diff --git a/src/app/server/[id]/page.tsx b/src/app/server/[id]/page.tsx index 0b7a978..6cc5bb0 100644 --- a/src/app/server/[id]/page.tsx +++ b/src/app/server/[id]/page.tsx @@ -6,10 +6,9 @@ import MessageBox from "@/components/MessageBox"; import AppSidebar from "@/components/Sidebar"; import Message from "@/types/message"; import useUser, { User } from "@/hooks/get-user"; -import Cookies from "js-cookie"; -import axios from "axios"; -import { NumberMap, StringMap } from "@/types/typeUtils"; +import { NumberMap } from "@/types/typeUtils"; import ServerType from "@/types/server"; +import auth, { makeAddress } from "@/lib/auth"; export default function Server() { const { id: ip } = useParams<{ id: string }>(); @@ -21,61 +20,7 @@ export default function Server() { useEffect(() => { if (!ip || !user || loading) return; - - async function auth() { - 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}:7080`); - 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); - - case "message_create": - // setMessages([...messages, data.params]); - setMessages((prev) => [...prev, data.params]); - } - }; - - ws.onerror = (err) => { - console.error("WebSocket error:", err); - }; - - ws.onclose = () => { - console.log("WebSocket closed:", ip); - }; - - // Cleanup on unmount or id change - return () => { - ws.close(); - }; - } - - auth(); + auth(makeAddress(ip), wsRef, setServer, setMessages); setUserList((prev) => { prev[user.id] = user; return prev; diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx index 86e5a29..1a78e2b 100644 --- a/src/components/Sidebar.tsx +++ b/src/components/Sidebar.tsx @@ -40,7 +40,7 @@ export default function AppSidebar({ }: Readonly<{ server?: Server; user: User | null; - children: React.ReactNode; + children?: React.ReactNode; }>) { const [servers, setServers] = useState<[string, string][]>([]); const [newServer, setNewServer] = useState({ name: "", ip: "" }); @@ -70,7 +70,7 @@ export default function AppSidebar({