diff --git a/next.config.js b/next.config.js
index 8a35c52..d0a1a48 100644
--- a/next.config.js
+++ b/next.config.js
@@ -7,6 +7,10 @@ const nextConfig = {
enabled: true, // Set turbo to true within an object
},
},
+ images: {
+ domains: ['randomuser.me'],
+ },
+
};
// export default nextConfig;
diff --git a/public/live-event.png b/public/live-event.png
new file mode 100644
index 0000000..d90eebe
Binary files /dev/null and b/public/live-event.png differ
diff --git a/src/app/dashboard/discussions/ClubCard.tsx b/src/app/dashboard/discussions/ClubCard.tsx
new file mode 100644
index 0000000..ffbe093
--- /dev/null
+++ b/src/app/dashboard/discussions/ClubCard.tsx
@@ -0,0 +1,99 @@
+import React from "react";
+import { Globe, PlusIcon } from "lucide-react";
+import { ClubDetailsProps } from "@/lib/types";
+
+interface CardProps extends ClubDetailsProps {
+ onOpen: (club: ClubDetailsProps) => void;
+}
+
+export default function ClubCard({
+ id,
+ name,
+ isPublic,
+ memberCount,
+ sessionsInfo,
+ unreadNotifications,
+ authorAvatars,
+ onOpen,
+}: CardProps) {
+ return (
+
+
+
+
+
+ {name}
+
+ {unreadNotifications > 0 && (
+
+ {unreadNotifications}
+
+ )}
+
+
+
+
+
+ {isPublic ? "Public" : "Private"}
+
+
+
+
+
+ {sessionsInfo}
+
+
+
+
+
+ {authorAvatars &&
+ authorAvatars.length > 0 &&
+ authorAvatars.map((author) => (
+
+ ))}
+
+
+ {authorAvatars && authorAvatars.length > 0 && (
+
+ {authorAvatars.length} Authors you follow are members
+
+ )}
+
+
+
{
+ onOpen({
+ id: id,
+ name,
+ isPublic,
+ memberCount,
+ sessionsInfo,
+ unreadNotifications,
+ authorAvatars,
+ });
+ }}
+ type="button"
+ className="text-[#0F265C] py-2 px-8 transition-colors duration-300 ease-in-out
+ rounded-[10px] bg-[linear-gradient(to_bottom,_#EDF7FF_100%,_#096CFF_30%)]
+ hover:bg-gray-200 "
+ >
+ Open
+
+
+ );
+}
diff --git a/src/app/dashboard/discussions/[id]/page.tsx b/src/app/dashboard/discussions/[id]/page.tsx
new file mode 100644
index 0000000..4747871
--- /dev/null
+++ b/src/app/dashboard/discussions/[id]/page.tsx
@@ -0,0 +1,191 @@
+"use client";
+
+import { Header } from "@/components/dashboard/header";
+import { Camera, Mic } from "lucide-react";
+
+export default function LiveEventPage() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ 🔴 Live
+
+
+ 93
+
+
+
+
+
+ End Event
+
+
+
+
+
+ Native Invisibility
+
+
+ By Darrin Collins ✔
+
+
+ Vibrant book club dedicated to exploring the vast and magical
+ realms of fantasy literature. From epic sagas and dark fantasy
+ to urban magic and whimsical tales, we delve into all corners of
+ the genre.
+
+
+
+
+
+
+
Host
+
+ Aisha Musa
+
+
+
+
+
+
+
+
Guest
+
+ Hana Yamal
+
+
+
+
+
+
+
+
+
+
Viewers
+
+ 92 Watching
+
+
+
+ {Array.from({ length: 4 }).map((_, i) => (
+
+
+ Darrin Collins
+
+ ))}
+
+
+
+
+
+
+ Live Chat
+
+
+
+
+
+
+
+ Young John
+
+
+
+ I disagree with Peace. I believe Umar deserved a second chance
+ after what he did
+
+
+
+
+
+
+
+ Ahmed Aliyu
+
+
+
Why do you feel that way?
+
+
+
+
+ You
+
+
+ You're saying you don't agree with 'Peace' on this one
+
+
+
+
+
+
+
+ Tony Tony
+
+
+
+ What makes you think he deserved that second chance?
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/dashboard/discussions/components/AddGuest.tsx b/src/app/dashboard/discussions/components/AddGuest.tsx
new file mode 100644
index 0000000..f217f5d
--- /dev/null
+++ b/src/app/dashboard/discussions/components/AddGuest.tsx
@@ -0,0 +1,50 @@
+"use client";
+
+import React from "react";
+import Modal from "./Modal";
+import { Input } from "@/components/ui/input";
+
+type Props = {
+ isOpen: boolean;
+ onClose: () => void;
+ addGuest: () => void;
+};
+
+export default function AddGuestModal({ isOpen, onClose, addGuest }: Props) {
+ return (
+
+
+
+ Guest Email Address
+
+
+
Guest Email Address
+
+
+
+
+
+
Joseph Yanum
+
josephyanum75@gmail.com
+
+
+
{
+ onClose();
+ addGuest();
+ }}
+ className="mb-5 w-full py-3 text-white rounded-md bg-gradient-to-b from-[#2A62F3] to-[#0029B3] hover:opacity-90 transition"
+ >
+ Add
+
+
+
+ );
+}
diff --git a/src/app/dashboard/discussions/components/ClubDetails.tsx b/src/app/dashboard/discussions/components/ClubDetails.tsx
new file mode 100644
index 0000000..5343791
--- /dev/null
+++ b/src/app/dashboard/discussions/components/ClubDetails.tsx
@@ -0,0 +1,129 @@
+import { ClubDetailsProps } from "@/lib/types";
+import { Globe, PlusIcon } from "lucide-react";
+import Modal from "./Modal";
+
+type ClubModalProps = {
+ club: ClubDetailsProps | null;
+ isOpen: boolean;
+ onClose: () => void;
+ onJoin: () => void;
+};
+
+export default function ClubModal({
+ club,
+ isOpen,
+ onClose,
+ onJoin,
+}: ClubModalProps) {
+ if (!club) return null;
+
+ return (
+
+
+
+
+
+
+ {club.name}
+
+
+
+
+
+
+
+
+
+
+
+ {club.authorAvatars?.length > 0 && (
+
+ {club.authorAvatars.length} Authors you follow are members
+
+ )}
+
+
+
+
+
+
+
+ Vibrant book club dedicated to exploring the vast and magical realms
+ of fantasy literature. From epic sagas and dark fantasy to urban
+ magic and whimsical tales, we delve into all corners of the genre.
+
+
+
+
+
+
+
+
+ Cancel
+
+
+ Join Club
+
+
+
+ );
+}
+
+function Badge({ text, icon }: { text: string; icon?: "globe" | "plus" }) {
+ const icons = {
+ globe: ,
+ plus: ,
+ };
+
+ return (
+
+ {icon && icons[icon]}
+ {text}
+
+ );
+}
+
+function SectionTitle({ title }: { title: string }) {
+ return (
+
+ );
+}
+
+function Tag({ text }: { text: string }) {
+ return (
+
+ {text}
+
+ );
+}
+
+function AvatarGroup({ urls }: { urls: string[] }) {
+ return (
+
+ {urls.map((url, i) => (
+
+ ))}
+
+ );
+}
diff --git a/src/app/dashboard/discussions/components/ClubDiscussion.tsx b/src/app/dashboard/discussions/components/ClubDiscussion.tsx
new file mode 100644
index 0000000..5335a45
--- /dev/null
+++ b/src/app/dashboard/discussions/components/ClubDiscussion.tsx
@@ -0,0 +1,209 @@
+import { useState } from "react";
+
+interface ClubDiscussionProps {
+ startEvent: () => void;
+}
+
+export default function ClubDiscussion({ startEvent }: ClubDiscussionProps) {
+ const [activeTab, setActiveTab] = useState("discussion");
+
+ const tabs = [
+ { id: "discussion", label: "Discussion" },
+ { id: "live", label: "Live", badge: 1 },
+ { id: "about", label: "About" },
+ { id: "members", label: "Members" },
+ ];
+
+ const eventTabs = [
+ {
+ id: "discussion",
+ label: "Discussion",
+ badge: 2,
+ event: {
+ title: "Native Invisibility",
+ author: "Darrin Collins",
+ verified: true,
+ description:
+ "Delves into the complex and often insidious ways in which indigenous peoples and their unique experiences are rendered unseen and unheard in the modern era.",
+ live: false,
+ timeAgo: "2 weeks ago",
+ image: "/images/bookCover1.png",
+ },
+ },
+ {
+ id: "live",
+ label: "Live",
+ badge: null,
+ event: {
+ title: "Native Invisibility",
+ author: "Darrin Collins",
+ verified: true,
+ description:
+ "Delves into the complex and often insidious ways in which indigenous peoples and their unique experiences are rendered unseen and unheard in the modern era.",
+ live: true,
+ timeAgo: "Live now",
+ image: "/images/bookCover1.png",
+ },
+ },
+
+ {
+ id: "discussion",
+ label: "Discussion",
+ badge: null,
+ event: {
+ title: "Native Invisibility",
+ author: "Darrin Collins",
+ verified: true,
+ description:
+ "Delves into the complex and often insidious ways in which indigenous peoples and their unique experiences are rendered unseen and unheard in the modern era.",
+ live: true,
+ timeAgo: "Live now",
+ image: "/images/bookCover1.png",
+ },
+ },
+ ];
+
+ return (
+
+
+
+
+
+ Fantasy Enthusiasts
+
+
+ Vibrant book club dedicated to exploring the vast and magical realms
+ of fantasy literature. From epic sagas and dark fantasy to urban
+ magic and whimsical tales, we delve into all corners of the genre.
+
+
+
+
+
+
+
+
+
+
+ 2 Authors you follow are members
+
+
+
+
+
+
+
+
+ {tabs.map(({ id, label, badge }) => (
+ setActiveTab(id)}
+ className={`relative py-2 px-3 text-[#5D5D5D] text-sm font-medium rounded-md focus:outline-none ${
+ activeTab === id ? "] text-[#5D5D5D] bg-[#F6F6F6]" : ""
+ }`}
+ aria-current={activeTab === id ? "page" : undefined}
+ >
+ {label}
+ {badge && (
+
+ {badge}
+
+ )}
+
+ ))}
+
+
+ Start Event
+
+
+
+
+ {eventTabs.map(({ id, event }) =>
+ activeTab === id ? (
+
+ ) :
+ )}
+
+
+
+ );
+}
+
+function Badge({ icon, label }: { icon: string; label: string }) {
+ return (
+
+ {icon} {label}
+
+ );
+}
+
+function EventCard({
+ title,
+ author,
+ verified,
+ description,
+ live,
+ timeAgo,
+ image,
+}: {
+ title: string;
+ author: string;
+ verified?: boolean;
+ description: string;
+ live?: boolean;
+ timeAgo?: string;
+ image: string;
+}) {
+ return (
+
+
+
+
+
+
+ Live
+
+
{title}
+
+
+ By {author}{" "}
+
+
+
+
+
+
Book Description
+
{description}
+
+ {timeAgo &&
{timeAgo}
}
+
+
+ );
+}
diff --git a/src/app/dashboard/discussions/components/ClubToolBar.tsx b/src/app/dashboard/discussions/components/ClubToolBar.tsx
new file mode 100644
index 0000000..1c5f1ca
--- /dev/null
+++ b/src/app/dashboard/discussions/components/ClubToolBar.tsx
@@ -0,0 +1,53 @@
+import React from "react";
+import { Search, ChevronDown, PlusIcon } from "lucide-react";
+
+export default function ClubsToolbar() {
+ return (
+
+
+
+
Clubs You've Joined (2)
+
+
+
+
+
+
+
+ {" "}
+ Create a Club
+
+
+
+
+
+
+
+
+
+
+ Club Type
+
+
+
+
+ );
+}
diff --git a/src/app/dashboard/discussions/components/CreateEvent.tsx b/src/app/dashboard/discussions/components/CreateEvent.tsx
new file mode 100644
index 0000000..7f0faf3
--- /dev/null
+++ b/src/app/dashboard/discussions/components/CreateEvent.tsx
@@ -0,0 +1,116 @@
+"use client";
+
+import React from "react";
+import Modal from "./Modal";
+import { Input } from "@/components/ui/input";
+
+type Props = {
+ isOpen: boolean;
+ onClose: () => void;
+ onSubmit: () => void;
+};
+
+export default function CreateClubModal({ isOpen, onClose, onSubmit }: Props) {
+ const [name, setName] = React.useState("");
+ const [description, setDescription] = React.useState("");
+ const [genres, setGenres] = React.useState(["Fiction", "Drama"]);
+ const [clubType, setClubType] = React.useState("");
+
+ return (
+
+
+
+ Create a new Club
+
+
+ Launch your book club! Gather readers, share favorites, and spark
+ discussions
+
+
+
+
+
Club Name
+
setName(e.target.value)}
+ className="mt-1 border border-gray-100 w-full h-[46px] border-b-0 px-3"
+ />
+
+
+
+
+ Genre Focus
+
+
+
+ setGenres(e.target.value)}
+ >
+ Select Type
+ Fiction
+ Drama
+
+
+
+ {genres.map((genre) => (
+
+ {genre} ×
+
+ ))}
+
+
+
+
+
+ Description
+
+
+
+
+
+ Club Type
+
+
+ setClubType(e.target.value)}
+ >
+ Select Type
+ Public
+ Private
+
+
+
+
+
+
{
+ onClose();
+ onSubmit();
+ }}
+ className="mt-6 w-full py-3 text-white rounded-md bg-gradient-to-b from-[#2A62F3] to-[#0029B3] hover:opacity-90 transition"
+ >
+ Create Club
+
+
+
+ );
+}
diff --git a/src/app/dashboard/discussions/components/Modal.tsx b/src/app/dashboard/discussions/components/Modal.tsx
new file mode 100644
index 0000000..3a297ae
--- /dev/null
+++ b/src/app/dashboard/discussions/components/Modal.tsx
@@ -0,0 +1,61 @@
+import React from "react";
+import { cn } from "@/lib/utils";
+type ModalProps = {
+ isOpen: boolean;
+ onClose: () => void;
+ children: React.ReactNode;
+ className?: string;
+ hideClose?: boolean;
+};
+
+export default function Modal({
+ isOpen,
+ onClose,
+ children,
+ className,
+ hideClose = false,
+}: ModalProps) {
+ if (!isOpen) return null;
+
+ return (
+
+
+ {!hideClose && (
+
+ )}
+
+ {children}
+
+
+ );
+}
diff --git a/src/app/dashboard/discussions/components/ScheduleEvent.tsx b/src/app/dashboard/discussions/components/ScheduleEvent.tsx
new file mode 100644
index 0000000..3068549
--- /dev/null
+++ b/src/app/dashboard/discussions/components/ScheduleEvent.tsx
@@ -0,0 +1,169 @@
+"use client";
+
+import React, { useState } from "react";
+import Modal from "./Modal";
+import { Input } from "@/components/ui/input";
+import DatePicker from "react-datepicker";
+import "react-datepicker/dist/react-datepicker.css";
+import { Calendar, Timer, TimerIcon } from "lucide-react";
+
+type Props = {
+ isOpen: boolean;
+ onClose: () => void;
+ onSubmit: () => void;
+};
+
+export default function ScheduleEvent({ isOpen, onClose, onSubmit }: Props) {
+ const [name, setName] = React.useState("");
+ const [description, setDescription] = React.useState("");
+ const [genres, setGenres] = React.useState(["Fiction", "Drama"]);
+ const [startDate, setStartDate] = useState(new Date());
+ const [startTime, setStartTime] = useState(new Date());
+ const [endTime, setEndTime] = useState(new Date());
+
+ const [focusBook, setFocusBook] = React.useState("");
+
+ return (
+
+
+
+ Schedule Event
+
+
+
+
+
Event Name
+
setName(e.target.value)}
+ className="mt-1 border border-gray-100 w-full h-[46px] placeholder:text-[#B0B0B0] border-b-0 px-3"
+ />
+
+
+
+
+
Date
+
+
+ setStartDate(date as Date)}
+ dateFormat="dd MMMM, yyyy"
+ className="w-full cursor-pointer outline-none bg-transparent text-[#B0B0B0] text-sm"
+ />
+
+
+
+
+
+ Start
+
+
+
+ setStartTime(time as Date)}
+ showTimeSelect
+ showTimeSelectOnly
+ timeIntervals={15}
+ timeCaption="Time"
+ dateFormat="h:mm aa"
+ className="w-full outline-none bg-transparent text-[#B0B0B0] text-sm"
+ />
+
+
+
+
End
+
+
+
+ setEndTime(time as Date)}
+ showTimeSelect
+ showTimeSelectOnly
+ timeIntervals={15}
+ timeCaption="Time"
+ dateFormat="h:mm aa"
+ className="w-full outline-none bg-transparent text-[#B0B0B0] text-sm"
+ />
+
+
+
+
+
+
+
+ Genre Focus
+
+
+
+
+ Select Type
+ Fiction
+ Drama
+
+
+
+ {genres.map((genre) => (
+
+ {genre} ×
+
+ ))}
+
+
+
+
+
+ Focus Book
+
+
+ setFocusBook(e.target.value)}
+ >
+ Select Type
+ Public
+ Private
+
+
+
+
+
+
+
+ Description
+
+
+
+
{
+ onClose();
+ onSubmit();
+ }}
+ className="mt-6 w-full py-3 text-white rounded-md bg-gradient-to-b from-[#2A62F3] to-[#0029B3] hover:opacity-90 transition"
+ >
+ Schedule Event
+
+
+
+ );
+}
diff --git a/src/app/dashboard/discussions/components/StartEvent.tsx b/src/app/dashboard/discussions/components/StartEvent.tsx
new file mode 100644
index 0000000..7e5a6cf
--- /dev/null
+++ b/src/app/dashboard/discussions/components/StartEvent.tsx
@@ -0,0 +1,44 @@
+"use client";
+
+import React from "react";
+import Modal from "./Modal";
+
+type Props = {
+ isOpen: boolean;
+ onClose: () => void;
+ startEvent: () => void;
+ instantEvent: () => void;
+};
+
+export default function StartEventModal({
+ isOpen,
+ onClose,
+ startEvent,
+ instantEvent,
+}: Props) {
+ return (
+
+
+ {
+ onClose();
+ startEvent();
+ }}
+ className=" w-full py-3 rounded-[16px] bg-[#E7E7E7] hover:opacity-90 transition"
+ >
+ Create Club
+
+
+ {
+ onClose();
+ instantEvent();
+ }}
+ className=" w-full py-3 rounded-[16px] bg-[#E7E7E7] hover:opacity-90 transition"
+ >
+ Schedule
+
+
+
+ );
+}
diff --git a/src/app/dashboard/discussions/components/SuccessModal.tsx b/src/app/dashboard/discussions/components/SuccessModal.tsx
new file mode 100644
index 0000000..3ebe40b
--- /dev/null
+++ b/src/app/dashboard/discussions/components/SuccessModal.tsx
@@ -0,0 +1,53 @@
+"use client";
+
+import React from "react";
+import Modal from "./Modal";
+import { Button } from "@/components/ui/button";
+import { CheckIcon } from "lucide-react";
+import Link from "next/link";
+
+type Props = {
+ isOpen: boolean;
+ onClose: () => void;
+ onSubmit: () => void;
+};
+
+export default function EventScheduleModal({
+ isOpen,
+ onClose,
+ onSubmit,
+}: Props) {
+ return (
+
+
+
+
+
+ Event Successfully Scheduled
+
+
+
+ ChLbevent1200Sh...
+
+ navigator.clipboard.writeText("ChLbevent1200Sh")}
+ className="ml-3 text-sm font-medium text-blue-600 hover:underline"
+ >
+ Copy
+
+
+
+
Start
+
+
+
+
+ );
+}
diff --git a/src/app/dashboard/discussions/page.tsx b/src/app/dashboard/discussions/page.tsx
new file mode 100644
index 0000000..5c1245a
--- /dev/null
+++ b/src/app/dashboard/discussions/page.tsx
@@ -0,0 +1,171 @@
+"use client";
+import { Header } from "@/components/dashboard/header";
+import React, { useState } from "react";
+import ClubsToolbar from "./components/ClubToolBar";
+import ClubCard from "./ClubCard";
+import { ClubDetailsProps } from "@/lib/types";
+import ClubModal from "./components/ClubDetails";
+import CreateClubModal from "./components/CreateEvent";
+import ClubDiscussion from "./components/ClubDiscussion";
+import StartEventModal from "./components/StartEvent";
+import ScheduleEvent from "./components/ScheduleEvent";
+import EventScheduleModal from "./components/SuccessModal";
+
+const clubCards: ClubDetailsProps[] = [
+ {
+ id: "1",
+ name: "Fantasy Enthusiasts",
+ isPublic: true,
+ memberCount: 1500,
+ sessionsInfo: "2+ Sessions a month",
+ unreadNotifications: 3,
+ authorAvatars: [
+ "https://randomuser.me/api/portraits/men/32.jpg",
+ "https://randomuser.me/api/portraits/women/44.jpg",
+ "https://randomuser.me/api/portraits/men/32.jpg"
+ ],
+ },
+ {
+ id: "2",
+ name: "Book Lovers",
+ isPublic: false,
+ memberCount: 1500,
+ sessionsInfo: "2+ Sessions in three months",
+ unreadNotifications: 2,
+ authorAvatars: [
+ "https://randomuser.me/api/portraits/men/32.jpg",
+ "https://randomuser.me/api/portraits/women/44.jpg",
+ ],
+ },
+ {
+ id: "3",
+ name: "Fantasy Enthusiasts",
+ isPublic: true,
+ memberCount: 1500,
+ sessionsInfo: "2+ Sessions a month",
+ unreadNotifications: 3,
+ authorAvatars: [
+ "https://randomuser.me/api/portraits/men/32.jpg",
+ "https://randomuser.me/api/portraits/women/44.jpg",
+ "https://randomuser.me/api/portraits/men/32.jpg"
+
+ ],
+ },
+ {
+ id: "4",
+ name: "Book Lovers",
+ isPublic: false,
+ memberCount: 1500,
+ sessionsInfo: "2+ Sessions a month",
+ unreadNotifications: 10,
+ authorAvatars: [
+ "https://randomuser.me/api/portraits/men/32.jpg",
+ "https://randomuser.me/api/portraits/women/44.jpg",
+ ],
+ },
+];
+
+export default function DiscussionDashboard() {
+ const [selectedClub, setSelectedClub] = useState(
+ null
+ );
+ const [modalOpen, setModalOpen] = useState(false);
+ const [createEventOpen, setCreateEventOpen] = useState(false);
+ const [startEventOpen, setStartEventOpen] = useState(false);
+ const [scheduleEventOpen, setScheduleEventOpen] = useState(false);
+ const [successModal, setSuccessModal] = useState(false);
+
+ const [activePage, setActivePage] = useState<
+ "index" | "discussion" | "start"
+ >("index");
+
+ function openModal(club: ClubDetailsProps) {
+ setSelectedClub(club);
+ setModalOpen(true);
+ }
+
+ function closeModal() {
+ setModalOpen(false);
+ setSelectedClub(null);
+ }
+
+ function joinClub() {
+ setCreateEventOpen(true);
+ closeModal();
+ }
+
+ return (
+
+
+
+ {activePage === "index" ? (
+
+
+
+
+ {clubCards.map(
+ ({
+ id,
+ name,
+ isPublic,
+ memberCount,
+ sessionsInfo,
+ authorAvatars,
+ unreadNotifications,
+ }) => (
+
+ )
+ )}
+
+
+ ) : (
+
+ setStartEventOpen(true)} />
+
+ )}
+
+
setCreateEventOpen(true)}
+ instantEvent={() => setScheduleEventOpen(true)}
+ isOpen={startEventOpen}
+ onClose={() => setStartEventOpen(false)}
+ />
+
+
+
+ setCreateEventOpen(false)}
+ onSubmit={() => setActivePage("discussion")}
+ />
+
+ setScheduleEventOpen(false)}
+ onSubmit={() => setSuccessModal(true)}
+ />
+
+ setSuccessModal(false)}
+ onSubmit={() => {}}
+ />
+
+
+ );
+}
diff --git a/src/app/globals.css b/src/app/globals.css
index 25a91f5..ea3adcb 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -1,4 +1,5 @@
@import "tailwindcss";
+@import url("https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap");
@custom-variant dark (&:is(.dark *));
@@ -325,6 +326,12 @@ html {
}
}
+body {
+ font-family: "Inter", sans-serif;
+ font-optical-sizing: auto;
+ font-style: normal;
+}
+
button,
a {
cursor: pointer;
diff --git a/src/app/waiting-room/page.tsx b/src/app/waiting-room/page.tsx
new file mode 100644
index 0000000..364a3bd
--- /dev/null
+++ b/src/app/waiting-room/page.tsx
@@ -0,0 +1,82 @@
+"use client";
+import { Camera, Mic, PlusCircleIcon } from "lucide-react";
+import { useState } from "react";
+import AddGuestModal from "../dashboard/discussions/components/AddGuest";
+import Link from "next/link";
+
+export default function WaitingRoom() {
+ const [guestEmailOpen, setGuestEmailOpen] = useState(false);
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Native Invisibility
+
+
+
+
+
+
{
+ setGuestEmailOpen(true);
+ }}
+ className="inline-flex py-3 px-4 rounded-full items-center bg-[#EDF7FF] space-x-1 text-[#5D5D5D] hover:text-blue-800 text-sm focus:outline-none focus:ring-2 focus:ring-blue-300 "
+ >
+
+ Another Guest
+
+
+
+
+
setGuestEmailOpen(false)}
+ addGuest={() => {}}
+ />
+
+ );
+}
+
+function InfoRow({ label, value }: { label: string; value: string }) {
+ return (
+
+
+ {label}
+
+ {value}
+
+ );
+}
diff --git a/src/components/dashboard/sidebar.tsx b/src/components/dashboard/sidebar.tsx
index b01f4d6..517be7a 100644
--- a/src/components/dashboard/sidebar.tsx
+++ b/src/components/dashboard/sidebar.tsx
@@ -9,6 +9,7 @@ import {
LogOut,
MessageSquare,
User,
+ MessageCircle,
ClipboardList,
Heart
} from "lucide-react";
@@ -55,6 +56,11 @@ export function Sidebar() {
label: "Readers Feedback",
href: "/dashboard/feedback",
},
+ {
+ icon: MessageCircle,
+ label: "Discussions & Clubs",
+ href: "/dashboard/discussions",
+ },
{
icon: Bell,
label: "Notification",
diff --git a/src/lib/types.ts b/src/lib/types.ts
new file mode 100644
index 0000000..c271a1d
--- /dev/null
+++ b/src/lib/types.ts
@@ -0,0 +1,9 @@
+export type ClubDetailsProps = {
+ id: string;
+ name: string;
+ isPublic: boolean;
+ memberCount: number;
+ sessionsInfo: string;
+ unreadNotifications: number;
+ authorAvatars: string[];
+};