diff --git a/components/modals/create-channel-modal.tsx b/components/modals/create-channel-modal.tsx index 79e13f7..b45bebe 100644 --- a/components/modals/create-channel-modal.tsx +++ b/components/modals/create-channel-modal.tsx @@ -33,6 +33,7 @@ import { SelectTrigger, SelectValue } from "@/components/ui/select"; +import { useEffect } from "react"; const formSchema = z.object({ name: z.string().min(1, { @@ -47,20 +48,30 @@ const formSchema = z.object({ }); export const CreateChannelModal = () => { - const { isOpen, onClose, type } = useModal(); + const { isOpen, onClose, type, data } = useModal(); const router = useRouter(); const params = useParams(); const isModalOpen = isOpen && type === "createChannel"; + const { channelType } = data; const form = useForm({ resolver: zodResolver(formSchema), defaultValues: { name: "", - type: ChannelType.TEXT, + type: channelType || ChannelType.TEXT, } }); + useEffect(() => { + if (channelType) { + form.setValue("type", channelType); + } + else{ + form.setValue("type", ChannelType.TEXT); + } + }, [channelType, form]) + const isLoading = form.formState.isSubmitting; const onSubmit = async (values: z.infer) => { diff --git a/components/server/server-channel.tsx b/components/server/server-channel.tsx new file mode 100644 index 0000000..ae78b1e --- /dev/null +++ b/components/server/server-channel.tsx @@ -0,0 +1,64 @@ +"use client" + +import { cn } from "@/lib/utils"; +import { Channel, ChannelType, MemberRole, Server } from "@prisma/client"; +import { Edit, Hash, Lock, Mic, Trash, Video } from "lucide-react"; +import { useParams, useRouter } from "next/navigation"; +import { ActionTooltip } from "@/components/action-tooltip"; + +interface ServerChannelProps { + channel: Channel; + server: Server; + role?: MemberRole; +} + +const iconMap = { + [ChannelType.TEXT]: Hash, + [ChannelType.AUDIO]: Mic, + [ChannelType.VIDEO]: Video +} + +export const ServerChannel = ({ + channel, + server, + role +}: ServerChannelProps) => { + const params = useParams(); + const router = useRouter(); + + const Icon = iconMap[channel.type]; + + return ( + + ) +} \ No newline at end of file diff --git a/components/server/server-header.tsx b/components/server/server-header.tsx index 04c9663..51223ea 100644 --- a/components/server/server-header.tsx +++ b/components/server/server-header.tsx @@ -11,7 +11,7 @@ interface ServerHeaderProps { role?: MemberRole; } -export const SeverHeader = ({server, role}: ServerHeaderProps) => { +export const ServerHeader = ({server, role}: ServerHeaderProps) => { const { onOpen } = useModal(); const isAdmin = role === MemberRole.ADMIN; const isModerator = isAdmin || role === MemberRole.MODERATOR; diff --git a/components/server/server-member.tsx b/components/server/server-member.tsx new file mode 100644 index 0000000..d18f77b --- /dev/null +++ b/components/server/server-member.tsx @@ -0,0 +1,49 @@ +"use client" + +import { cn } from "@/lib/utils"; +import { Member, MemberRole, Profile, Server } from "@prisma/client" +import { ShieldAlert, ShieldCheck } from "lucide-react"; +import { useParams } from "next/navigation"; +import { useRouter } from "next/router"; +import { UserAvatar } from "@/components/user-avatar"; + +interface ServerMemberProps { + member: Member & { + profile: Profile; + }; + server: Server; +} + +const roleIconMap = { + [MemberRole.GUEST]: null, + [MemberRole.MODERATOR]: , + [MemberRole.ADMIN]: +} + +export const ServerMember = ({ + member, + server +}: ServerMemberProps) => { + const params = useParams(); + //const router = useRouter(); + + const icon = roleIconMap[member.role]; + return ( + + ) +} \ No newline at end of file diff --git a/components/server/server-section.tsx b/components/server/server-section.tsx new file mode 100644 index 0000000..042c8d2 --- /dev/null +++ b/components/server/server-section.tsx @@ -0,0 +1,47 @@ +"use client" + +import { ServerWithMembersWithProfiles } from "@/types"; +import { ChannelType, MemberRole } from "@prisma/client"; +import { ActionTooltip } from "../action-tooltip"; +import { Plus, Settings } from "lucide-react"; +import { useModal } from "@/hooks/use-modal-store"; + +interface ServerSectionProps { + label: string; + role?: MemberRole; + sectionType: "channels" | "members"; + channelType?: ChannelType; + server?: ServerWithMembersWithProfiles; +} + +export const ServerSection = ({ + label, + role, + sectionType, + channelType, + server +}: ServerSectionProps)=> { + const {onOpen } = useModal(); + + return ( +
+

+ {label} +

+ {role !== MemberRole.GUEST && sectionType === "channels" && ( + + + + )} + {role === MemberRole.ADMIN && sectionType === "members" && ( + + + + )} +
+ ) +} \ No newline at end of file diff --git a/components/server/server-sidebar.tsx b/components/server/server-sidebar.tsx index dd68f9d..e7ab355 100644 --- a/components/server/server-sidebar.tsx +++ b/components/server/server-sidebar.tsx @@ -5,9 +5,14 @@ import { Hash, Mic, ShieldAlert, ShieldCheck, Video } from "lucide-react"; import { currentProfile } from "@/lib/current-profile"; import { db } from "@/lib/db"; +import { Separator } from "@/components/ui/separator"; import { ScrollArea } from "@/components/ui/scroll-area"; import { ServerHeader } from "./server-header"; import { ServerSearch } from "./server-search"; +import { ServerSection } from "./server-section"; +import { ServerChannel } from "./server-channel"; +import { ServerMember } from "./server-member"; + interface ServerSidebarProps { @@ -116,6 +121,87 @@ export const ServerSidebar = async ({ ]} /> + + {!!textChannels?.length && ( +
+ +
+ {textChannels?.map((channel) => ( + + ))} +
+
+ )} + {!!audioChannels?.length && ( +
+ +
+ {audioChannels?.map((channel) => ( + + ))} +
+
+ )} + {!!videoChannels?.length && ( +
+ +
+ {videoChannels?.map((channel) => ( + + ))} +
+
+ )} + {!!members?.length && ( +
+ +
+ {members?.map((member) => ( + + ))} +
+
+ )} ) diff --git a/hooks/use-modal-store.ts b/hooks/use-modal-store.ts index ffd7eb4..51b2e69 100644 --- a/hooks/use-modal-store.ts +++ b/hooks/use-modal-store.ts @@ -1,11 +1,12 @@ -import { Server } from "@prisma/client"; +import { ChannelType, Server } from "@prisma/client"; import { create } from "zustand"; export type ModalType = "createServer" | "invite" | "editServer" | "members" | "createChannel" | "leaveServer" | "deleteServer"; interface ModalData { - server?: Server + server?: Server; + channelType?: ChannelType; } interface ModalStore {