diff --git a/src/app/chat/[id]/page.tsx b/src/app/chat/[id]/page.tsx index 7edaab8..5a8e6b4 100644 --- a/src/app/chat/[id]/page.tsx +++ b/src/app/chat/[id]/page.tsx @@ -16,25 +16,18 @@ export default function DMs() { const { id } = useParams<{ id: string }>(); const wsRef = useRef(null); const [messages, setMessages] = useState([]); - const { user, loading } = useUser(); const [userList, setUserList] = useState>({}); - useEffect(() => { - async function fetchInitialData() { - if (!user || loading) return; - await auth(makeAddress("localhost", 7090), wsRef, () => {}, setMessages); - setUserList((prev) => { - prev[user.id] = user; - return prev; - }); - } - fetchInitialData(); - }, [id, user, loading]); - return ( - + (null); - const { user, loading } = useUser(); const [userList, setUserList] = useState>({}); - useEffect(() => { - if (!ip || !user || loading) return; - auth( - makeAddress(ip, 7090), - wsRef, - () => {}, - () => {}, - (m) => { - toast(`New message from ${m.from}`, { - description: m.contents.slice(0, 80), - }); - } - ); - setUserList((prev) => { - prev[user.id] = user; - return prev; - }); - }, [ip, user, loading]); - return ( - + {}} + > Direct Messages diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx index 7c8c7db..18ef988 100644 --- a/src/components/Sidebar.tsx +++ b/src/components/Sidebar.tsx @@ -8,8 +8,8 @@ import { SettingsIcon, Volume2Icon, } from "lucide-react"; -import { Server, Channel } from "@/types/types"; -import { useEffect, useState } from "react"; +import { Server, Channel, Message } from "@/types/types"; +import React, { useEffect, useRef, useState } from "react"; import Cookies from "js-cookie"; import { Dialog, @@ -25,32 +25,69 @@ import { Input } from "./ui/input"; import { Label } from "./ui/label"; import { Button } from "./ui/button"; import { Card } from "./ui/card"; -import { Avatar, AvatarFallback, AvatarImage } from "./ui/avatar"; import { ScrollArea } from "./ui/scroll-area"; import { useRouter } from "next/navigation"; import Link from "next/link"; -import { NumberMap } from "@/types/typeUtils"; -import { User } from "@/hooks/get-user"; +import useUser, { User } from "@/hooks/get-user"; import ProfilePicture from "./ProfilePicture"; +import auth, { makeAddress } from "@/lib/auth"; +import { toast } from "sonner"; +import { StringMap } from "@/types/typeUtils"; export default function AppSidebar({ - user, - server, children, + chatWith, + wsRef, + setMessages, + onNewMessage, }: Readonly<{ - server?: Server; - user: User | null; + wsRef: React.RefObject; + setMessages: React.Dispatch>; + onNewMessage?: (msg: Message) => void; + userList: StringMap; + setUserList: React.Dispatch>>; + chatWith?: string; children?: React.ReactNode; }>) { const [servers, setServers] = useState<[string, string][]>([]); const [newServer, setNewServer] = useState({ name: "", ip: "" }); + const [server, setServer] = useState(); const router = useRouter(); + const user = useUser(); + const [userList, setUserList] = useState>({}); + const ip = "192.168.100.3"; useEffect(() => { const s = Cookies.get("servers")?.split(","); if (s) setServers(s.map((x) => x.trim().split("@") as [string, string])); }, []); + useEffect(() => { + if (!ip || !user) return; + auth( + makeAddress(ip, 7090), + wsRef, + () => {}, + setMessages, + (m) => { + if (m.from !== chatWith) + toast(`New message from ${m.from}`, { + description: m.contents.slice(0, 80), + action: { + label: "View", + onClick: () => router.push(`/chat/${m.from}`), + }, + }); + + if (onNewMessage) onNewMessage(m); + } + ); + setUserList((prev) => { + prev[user.id] = user; + return prev; + }); + }, [chatWith, user]); + const handleAddServer = () => { if (!newServer.ip) return; const updatedServers = [ @@ -204,7 +241,7 @@ export default function AppSidebar({ function DMItem({ name, status }: { name: string; status: string }) { return ( - +
{name} {status} diff --git a/src/hooks/get-user.ts b/src/hooks/get-user.ts index b3613e4..f1fdb35 100644 --- a/src/hooks/get-user.ts +++ b/src/hooks/get-user.ts @@ -14,7 +14,6 @@ export interface User { export default function useUser() { const [user, setUser] = useState(null); - const [loading, setLoading] = useState(true); const router = useRouter(); useEffect(() => { @@ -31,13 +30,11 @@ export default function useUser() { setUser(res); } catch { router.push("/login"); - } finally { - setLoading(false); } } fetchUser(); }, [router]); - return { user, loading }; + return user; } diff --git a/src/lib/auth.ts b/src/lib/auth.ts index 36410c5..1124987 100644 --- a/src/lib/auth.ts +++ b/src/lib/auth.ts @@ -38,7 +38,7 @@ export default async function auth( console.log("Message received:", data); if (data.version) { - setServer(data); + setServer({ channels: [], ...data }); return; }