Sign up and Working username display

This commit is contained in:
2025-09-29 12:34:34 +02:00
parent f1f6ae2640
commit feb0804843
5 changed files with 45 additions and 15 deletions
+1 -1
View File
@@ -84,7 +84,7 @@ export async function GET(req: NextRequest) {
{ status: StatusCodes.BAD_REQUEST } { status: StatusCodes.BAD_REQUEST }
); );
else { else {
const id = query_id ? query_id : token ? CLIENT_AUTH_TOKENS[token] : null; const id = query_id ? parseInt(query_id) : token ? CLIENT_AUTH_TOKENS[token] : null;
if (!id) if (!id)
return NextResponse.json( return NextResponse.json(
+7 -1
View File
@@ -6,6 +6,8 @@ import axios from "axios";
import { useState } from "react"; import { useState } from "react";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import { redirect } from "next/navigation"; import { redirect } from "next/navigation";
import { Label } from "@/components/ui/label";
import Link from "next/link";
export default function Login() { export default function Login() {
const [username, setUsername] = useState(""); const [username, setUsername] = useState("");
@@ -35,7 +37,11 @@ export default function Login() {
/> />
</span> </span>
<Button className="mt-4" onClick={login}> <Label>
Don't have an account? <Link href={"/signup"}>Sign Up</Link>
</Label>
<Button className="mt-2" onClick={login}>
Login Login
</Button> </Button>
</div> </div>
+3 -2
View File
@@ -8,7 +8,7 @@ import Message from "@/types/message";
import useUser, { User } from "@/hooks/get-user"; import useUser, { User } from "@/hooks/get-user";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import axios from "axios"; import axios from "axios";
import { StringMap } from "@/types/typeUtils"; import { NumberMap, StringMap } from "@/types/typeUtils";
import ServerType from "@/types/server"; import ServerType from "@/types/server";
export default function Server() { export default function Server() {
@@ -17,7 +17,7 @@ export default function Server() {
const wsRef = useRef<WebSocket | null>(null); const wsRef = useRef<WebSocket | null>(null);
const [messages, setMessages] = useState<Message[]>([]); const [messages, setMessages] = useState<Message[]>([]);
const { user, loading } = useUser(); const { user, loading } = useUser();
const [userList, setUserList] = useState<StringMap<User>>({}); const [userList, setUserList] = useState<NumberMap<User>>({});
useEffect(() => { useEffect(() => {
if (!ip || !user || loading) return; if (!ip || !user || loading) return;
@@ -86,6 +86,7 @@ export default function Server() {
<AppSidebar server={{ channels: [], ...server } as ServerType}> <AppSidebar server={{ channels: [], ...server } as ServerType}>
<MessageBox <MessageBox
userList={userList} userList={userList}
setUserList={setUserList}
messages={messages messages={messages
.filter((m) => m.channel_id === "general") .filter((m) => m.channel_id === "general")
.toReversed()} .toReversed()}
+24 -5
View File
@@ -11,20 +11,32 @@ import {
DropdownMenuTrigger, DropdownMenuTrigger,
} from "./ui/dropdown-menu"; } from "./ui/dropdown-menu";
import { SmilePlusIcon } from "lucide-react"; import { SmilePlusIcon } from "lucide-react";
import { useRef, useState } from "react"; import { useEffect, useRef, useState } from "react";
import { format, isToday, isYesterday } from "date-fns"; import { format, isToday, isYesterday } from "date-fns";
import ReactMarkdown from "react-markdown"; import ReactMarkdown from "react-markdown";
import remarkGfm from "remark-gfm"; import remarkGfm from "remark-gfm";
import { StringMap } from "@/types/typeUtils"; import { NumberMap, StringMap } from "@/types/typeUtils";
import { User } from "@/hooks/get-user"; import { User } from "@/hooks/get-user";
import axios from "axios";
function MessageContainer({ function MessageContainer({
message, message,
userList, userList,
setUserList,
}: { }: {
message: Message; message: Message;
userList: StringMap<User>; userList: NumberMap<User>;
setUserList: React.Dispatch<React.SetStateAction<NumberMap<User>>>;
}) { }) {
useEffect(() => {
axios
.get("/api/user/", { params: { id: message.from } })
.then((res) =>
setUserList((prev) => ({ ...prev, [message.from]: res.data as User }))
)
.catch(console.error);
}, [message.from, setUserList]);
return ( return (
<div className="flex flex-col gap-3 rounded-lg p-4 hover:bg-accent"> <div className="flex flex-col gap-3 rounded-lg p-4 hover:bg-accent">
<div className="flex gap-2"> <div className="flex gap-2">
@@ -117,10 +129,12 @@ function MessageContainer({
export default function MessageBox({ export default function MessageBox({
messages, messages,
userList, userList,
setUserList,
sendMessage, sendMessage,
}: { }: {
messages: Message[]; messages: Message[];
userList: StringMap<User>; userList: NumberMap<User>;
setUserList: React.Dispatch<React.SetStateAction<NumberMap<User>>>;
sendMessage: (m: string) => void; sendMessage: (m: string) => void;
}) { }) {
const [text, setText] = useState(""); const [text, setText] = useState("");
@@ -129,7 +143,12 @@ export default function MessageBox({
<div className="h-screen w-full flex flex-col py-5 pl-5 gap-5"> <div className="h-screen w-full flex flex-col py-5 pl-5 gap-5">
<div className="w-full flex-1 overflow-y-scroll flex gap-2 flex-col-reverse pr-5"> <div className="w-full flex-1 overflow-y-scroll flex gap-2 flex-col-reverse pr-5">
{messages.map((msg) => ( {messages.map((msg) => (
<MessageContainer key={msg.id} message={msg} userList={userList} /> <MessageContainer
key={msg.id}
message={msg}
userList={userList}
setUserList={setUserList}
/>
))} ))}
</div> </div>
<div className="w-full flex gap-3 pr-5"> <div className="w-full flex gap-3 pr-5">
+4
View File
@@ -2,6 +2,10 @@ export type StringMap<T> = {
[key: string]: T; [key: string]: T;
}; };
export type NumberMap<T> = {
[key: number]: T;
};
export function narrow<T>(s: T, defd: T, ...allowed: T[]): T { export function narrow<T>(s: T, defd: T, ...allowed: T[]): T {
if (allowed.includes(s) || s == defd) { if (allowed.includes(s) || s == defd) {
return s; return s;