From fca82def368a6bd5091e9a4a3d75071462c098eb Mon Sep 17 00:00:00 2001 From: Bob Burningham Date: Sun, 15 Oct 2023 20:29:24 -0700 Subject: [PATCH] added search --- components/server/server-search.tsx | 107 ++++++++++++++++++ components/server/server-sidebar.tsx | 62 ++++++++++- components/ui/command.tsx | 155 +++++++++++++++++++++++++++ 3 files changed, 323 insertions(+), 1 deletion(-) create mode 100644 components/server/server-search.tsx create mode 100644 components/ui/command.tsx diff --git a/components/server/server-search.tsx b/components/server/server-search.tsx new file mode 100644 index 0000000..cb6f1a9 --- /dev/null +++ b/components/server/server-search.tsx @@ -0,0 +1,107 @@ +"use client" + +import { Search } from "lucide-react"; +import React, { useEffect, useState } from "react"; +import { + CommandDialog, + CommandInput, + CommandItem, + CommandEmpty, + CommandGroup, + CommandList +} from "@/components/ui/command"; +import { useParams, useRouter } from "next/navigation"; + +interface ServerSearchProps { + data: { + label: string; + type: "channel" | "member"; + data: { + icon: React.ReactNode; + name: string; + id: string; + }[] | undefined + }[]; +} + +export const ServerSearch = ({ + data +}: ServerSearchProps) => { + const [open, setOpen] = useState(false); + const router = useRouter(); + const params = useParams(); + + useEffect(() => + { + const down = (e: KeyboardEvent) => + { + if (e.key === "k" && (e.metaKey || e.ctrlKey)) + { + e.preventDefault(); + setOpen((open) => !open); + } + } + + document.addEventListener("keydown", down); + return () => document.removeEventListener("keydown", down); + }, []); + + const onClick = ({ id, type }: { id: string, type: "channel" | "member"}) => + { + setOpen(false); + + if (type === "member") { + return router.push(`/servers/${params.serverId}/conversations/${id}`); + } + + if (type === "channel") { + return router.push(`/servers/${params.serverId}/channels/${id}`); + } + } + + return ( + <> + + + + + + No Results Found + + {data.map(({ label, type, data }) => { + if (!data?.length) return null; + + return ( + + {data?.map(({ id, icon, name }) => { + return ( + onClick({ id, type})} + key={id}> + {icon} + {name} + + + ) + })} + + ) + })} + + + + + ) +} \ No newline at end of file diff --git a/components/server/server-sidebar.tsx b/components/server/server-sidebar.tsx index 399261d..90d54cd 100644 --- a/components/server/server-sidebar.tsx +++ b/components/server/server-sidebar.tsx @@ -1,15 +1,31 @@ -import { ChannelType } from "@prisma/client"; +import { ChannelType, MemberRole } from "@prisma/client"; import { redirect } from "next/navigation"; +import { Hash, Mic, ShieldAlert, ShieldCheck, Video } from "lucide-react"; import { currentProfile } from "@/lib/current-profile"; import { db } from "@/lib/db"; +import { ScrollArea } from "@/components/ui/scroll-area"; import { SeverHeader } from "./server-header"; +import { ServerSearch } from "./server-search"; + interface ServerSidebarProps { serverId: string; } +const iconMap = { + [ChannelType.TEXT]: , + [ChannelType.AUDIO]: , + [ChannelType.VIDEO]: