import { and, eq, like } from "drizzle-orm"; import type { Metadata } from "next"; import Image from "next/image"; import Link from "next/link"; import { db, Rooms, User } from "@/lib/db"; import { avatarImageUrl } from "@/lib/format"; export const metadata: Metadata = { title: "Search" }; type SearchParams = Promise<{ q?: string }>; export default async function SearchPage({ searchParams, }: { searchParams: SearchParams; }) { const { q } = await searchParams; const query = q?.trim(); if (!query) { return (

Enter a search term to find users.

); } const users = await db .select({ id: User.id, username: User.username, look: User.look, motto: User.motto, online: User.online, rank: User.rank, }) .from(User) .where(like(User.username, `%${query}%`)) .limit(30) .catch(() => []); const rooms = await db .select({ id: Rooms.id, name: Rooms.name, ownerName: Rooms.ownerName, users: Rooms.users, usersMax: Rooms.usersMax, }) .from(Rooms) .where(and(like(Rooms.name, `%${query}%`), eq(Rooms.state, "open"))) .limit(12) .catch(() => []); return (

Results for "{query}" — {users.length} user {users.length !== 1 ? "s" : ""} {rooms.length > 0 && `, ${rooms.length} room${rooms.length !== 1 ? "s" : ""}`}

{users.length > 0 && (

Users

{users.map((u) => ( {u.username} {u.username} {u.online === "1" ? "🟢 Online" : "Offline"} ))}
)} {rooms.length > 0 && (

Rooms

{rooms.map((room) => (

{room.name}

{room.ownerName} · {room.users}/{room.usersMax}

))}
)} {users.length === 0 && rooms.length === 0 && (

No users or rooms found for "{query}".

)}
); }