diff --git a/public/reader-image.png b/public/reader-image.png
new file mode 100644
index 0000000..03cb523
Binary files /dev/null and b/public/reader-image.png differ
diff --git a/public/reader-profile-dummy-image.png b/public/reader-profile-dummy-image.png
new file mode 100755
index 0000000..aa3c795
Binary files /dev/null and b/public/reader-profile-dummy-image.png differ
diff --git a/src/app/dashboard/stats-and-achievements/page.tsx b/src/app/dashboard/stats-and-achievements/page.tsx
new file mode 100644
index 0000000..f777e98
--- /dev/null
+++ b/src/app/dashboard/stats-and-achievements/page.tsx
@@ -0,0 +1,151 @@
+"use client";
+
+import { Header } from "@/components/dashboard/header";
+import { TimeFilter } from "@/components/stats-achievements/time-filter";
+import { StatsGrid } from "@/components/stats-achievements/stats-grid";
+import { BadgeSection } from "@/components/stats-achievements/badge-section";
+import { GoalsSection } from "@/components/stats-achievements/goals-section";
+import { AchievementsSection } from "@/components/stats-achievements/achievements-section";
+import { useState } from "react";
+
+// Mock data for different time periods
+const timeData = {
+ "This Week": {
+ hours: 16,
+ minutes: 37,
+ stats: [
+ { label: "Books Completed", value: "2", color: "#096CFF" },
+ {
+ label: "Average Session",
+ value: "45",
+ unit: "Minutes",
+ color: "#096CFF",
+ },
+ { label: "Most Read Genre", value: "Fiction", color: "#096CFF" },
+ { label: "Most Read Author", value: "J.K. Rowling", color: "#096CFF" },
+ { label: "Longest Read", value: "4", unit: "Hours", color: "#096CFF" },
+ { label: "Sessions", value: "12", color: "#096CFF" },
+ { label: "Abandoned", value: "1", color: "#096CFF" },
+ ],
+ },
+ "This Month": {
+ hours: 68,
+ minutes: 24,
+ stats: [
+ { label: "Books Completed", value: "8", color: "#096CFF" },
+ {
+ label: "Average Session",
+ value: "52",
+ unit: "Minutes",
+ color: "#096CFF",
+ },
+ { label: "Most Read Genre", value: "Mystery", color: "#096CFF" },
+ { label: "Most Read Author", value: "Agatha Christie", color: "#096CFF" },
+ { label: "Longest Read", value: "6", unit: "Hours", color: "#096CFF" },
+ { label: "Sessions", value: "45", color: "#096CFF" },
+ { label: "Abandoned", value: "3", color: "#096CFF" },
+ ],
+ },
+ "This Year": {
+ hours: 324,
+ minutes: 18,
+ stats: [
+ { label: "Books Completed", value: "42", color: "#096CFF" },
+ {
+ label: "Average Session",
+ value: "48",
+ unit: "Minutes",
+ color: "#096CFF",
+ },
+ { label: "Most Read Genre", value: "Sci-Fi", color: "#096CFF" },
+ { label: "Most Read Author", value: "Isaac Asimov", color: "#096CFF" },
+ { label: "Longest Read", value: "8", unit: "Hours", color: "#096CFF" },
+ { label: "Sessions", value: "186", color: "#096CFF" },
+ { label: "Abandoned", value: "12", color: "#096CFF" },
+ ],
+ },
+ "All Time": {
+ hours: 1247,
+ minutes: 52,
+ stats: [
+ { label: "Books Completed", value: "156", color: "#096CFF" },
+ {
+ label: "Average Session",
+ value: "51",
+ unit: "Minutes",
+ color: "#096CFF",
+ },
+ { label: "Most Read Genre", value: "Fantasy", color: "#096CFF" },
+ {
+ label: "Most Read Author",
+ value: "Brandon Sanderson",
+ color: "#096CFF",
+ },
+ { label: "Longest Read", value: "12", unit: "Hours", color: "#096CFF" },
+ { label: "Sessions", value: "743", color: "#096CFF" },
+ { label: "Abandoned", value: "28", color: "#096CFF" },
+ ],
+ },
+};
+
+export default function StatsAndAchievementsPage() {
+ const [selectedPeriod, setSelectedPeriod] = useState("This Week");
+ const currentData = timeData[selectedPeriod as keyof typeof timeData];
+
+ return (
+
+
+
+
+ {/* Total Hours Read Section */}
+
+
+
+ Total Hours Read
+
+
+
+
+ {/* Large Time Display */}
+
+
+
+
+ {currentData.hours}
+
+
+ Hours
+
+
+
:
+
+
+ {currentData.minutes}
+
+
+ Minutes
+
+
+
+
+
+ {/* Stats Grid */}
+
+
+
+ {/* Badge Section */}
+
+
+ {/* Goals Section */}
+
+
+ {/* Achievements Section */}
+
+
+
+
+ );
+}
diff --git a/src/app/reader-profile/following/page.tsx b/src/app/reader-profile/following/page.tsx
new file mode 100644
index 0000000..c1d6fff
--- /dev/null
+++ b/src/app/reader-profile/following/page.tsx
@@ -0,0 +1,138 @@
+"use client";
+
+import { useState } from "react";
+import { ArrowLeft, BadgeCheck, CheckCircle } from "lucide-react";
+import { useRouter } from "next/navigation";
+import { useMobileMenu } from "@/hooks/useMobileMenu";
+import Image from "next/image";
+
+interface FollowingUser {
+ id: string;
+ name: string;
+ username: string;
+ isVerified: boolean;
+ avatar?: string;
+}
+
+export default function FollowingPage() {
+ const router = useRouter();
+ const { openMobileMenu } = useMobileMenu();
+ const [activeTab, setActiveTab] = useState<
+ "total" | "verified" | "unverified"
+ >("total");
+
+ const followingUsers: FollowingUser[] = Array.from({ length: 9 }, (_, i) => ({
+ id: `user-${i + 1}`,
+ name: "Darrin Collins",
+ username: "@darrin_collins",
+ isVerified: i < 7, // First 7 are verified
+ avatar: "/reader-image.png?height=40&width=40",
+ }));
+
+ const totalCount = followingUsers.length;
+ const verifiedCount = followingUsers.filter((user) => user.isVerified).length;
+ const unverifiedCount = totalCount - verifiedCount;
+
+ const filteredUsers = followingUsers.filter((user) => {
+ if (activeTab === "verified") return user.isVerified;
+ if (activeTab === "unverified") return !user.isVerified;
+ return true;
+ });
+
+ const handleUnfollow = (userId: string) => {
+ console.log("Unfollow user:", userId);
+ };
+
+ return (
+
+ {/* Mobile Header */}
+
+
+
+ {/* Desktop Header */}
+
+
Following
+
+
+ {/* Stats Tabs */}
+
+ setActiveTab("total")}
+ className={`px-3 py-1 text-sm font-medium border-[0.5px] rounded-2xl transition-colors ${
+ activeTab === "total"
+ ? "text-gray-700"
+ : "border-transparent text-gray-500 hover:text-gray-700"
+ }`}
+ >
+ Total {totalCount}
+
+ setActiveTab("verified")}
+ className={`px-3 py-1 text-sm font-medium border-[0.5px] rounded-2xl transition-colors ${
+ activeTab === "verified"
+ ? "text-gray-700"
+ : "border-transparent text-gray-500 hover:text-gray-700"
+ }`}
+ >
+ Verified {verifiedCount}
+
+ setActiveTab("unverified")}
+ className={`px-3 py-1 text-sm font-medium border-[0.5px] rounded-2xl transition-colors ${
+ activeTab === "unverified"
+ ? "text-gray-700"
+ : "border-transparent text-gray-500 hover:text-gray-700"
+ }`}
+ >
+ Unverified {unverifiedCount}
+
+
+
+ {/* Following List */}
+
+ {filteredUsers.map((user) => (
+
+
+
+
+
+
+ {user.name}
+ {user.isVerified && (
+
+ )}
+
+
+
handleUnfollow(user.id)}
+ className="px-4 py-2 text-sm text-gray-600 hover:text-gray-800 bg-gray-50 hover:bg-gray-100 rounded-2xl transition-colors"
+ >
+ Unfollow
+
+
+ ))}
+
+
+ {filteredUsers.length === 0 && (
+
+
No users found in this category.
+
+ )}
+
+
+ );
+}
diff --git a/src/app/reader-profile/layout.tsx b/src/app/reader-profile/layout.tsx
new file mode 100644
index 0000000..9cc9e88
--- /dev/null
+++ b/src/app/reader-profile/layout.tsx
@@ -0,0 +1,121 @@
+"use client";
+import React, { useState } from "react";
+import { X } from "lucide-react";
+import { usePathname, useRouter } from "next/navigation";
+import Link from "next/link";
+import { MobileMenuContext } from "@/hooks/useMobileMenu";
+import NavBar from "@/components/landingpage/NavBar";
+
+interface ReaderProfileLayoutProps {
+ children: React.ReactNode;
+}
+
+export default function ReaderProfileLayout({
+ children,
+}: ReaderProfileLayoutProps) {
+ const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);
+ const pathname = usePathname();
+ const router = useRouter();
+
+ const navItems = [
+ {
+ label: "Profile Details",
+ href: "/reader-profile",
+ },
+ {
+ label: "Following",
+ href: "/reader-profile/following",
+ },
+ {
+ label: "Preferences",
+ href: "/reader-profile/preferences",
+ },
+ {
+ label: "Privacy Settings",
+ href: "/reader-profile/privacy",
+ },
+ {
+ label: "Sign Out",
+ href: "/reader-profile/sign-out",
+ },
+ ];
+
+ return (
+ setIsMobileMenuOpen(true) }}
+ >
+
+
+
+ {/* Desktop Sidebar */}
+
+
+
+ {navItems.map((item) => (
+
+ {item.label}
+
+ ))}
+
+
+
+
+ {/* Mobile Menu Overlay */}
+
setIsMobileMenuOpen(false)}
+ >
+ {/* Mobile Menu Panel */}
+
e.stopPropagation()}
+ >
+
+
Profile
+ setIsMobileMenuOpen(false)}
+ className="p-1"
+ >
+
+
+
+
+ {navItems.map((item) => (
+ setIsMobileMenuOpen(false)}
+ className={`block px-4 py-3 rounded-lg text-sm transition-colors ${
+ pathname === item.href
+ ? "bg-gray-100 text-gray-900 font-medium"
+ : "text-gray-600 hover:bg-gray-50 hover:text-gray-900"
+ }`}
+ >
+ {item.label}
+
+ ))}
+
+
+
+
+ {/* Main Content */}
+
{children}
+
+
+
+ );
+}
diff --git a/src/app/reader-profile/page.tsx b/src/app/reader-profile/page.tsx
new file mode 100644
index 0000000..dcaf92d
--- /dev/null
+++ b/src/app/reader-profile/page.tsx
@@ -0,0 +1,260 @@
+"use client";
+
+import type React from "react";
+
+import { useState, useRef, type ChangeEvent } from "react";
+import Image from "next/image";
+import { ArrowLeft } from "lucide-react";
+import { useRouter } from "next/navigation";
+import { useMobileMenu } from "@/hooks/useMobileMenu";
+
+interface ProfileFormData {
+ firstName: string;
+ lastName: string;
+ username: string;
+ email: string;
+ bio: string;
+ profilePicture: string | null;
+}
+
+export default function ProfileDetailsPage() {
+ const router = useRouter();
+ const { openMobileMenu } = useMobileMenu();
+ const [formData, setFormData] = useState({
+ firstName: "Faith",
+ lastName: "Haruna",
+ username: "Faith_Haruna",
+ email: "example@gmail.com",
+ bio: "",
+ profilePicture: null,
+ });
+
+ const [preview, setPreview] = useState(
+ "/reader-profile-dummy-image.png"
+ );
+ const fileInputRef = useRef(null);
+
+ const handleInputChange = (
+ e: ChangeEvent
+ ) => {
+ const { name, value } = e.target;
+ setFormData((prev) => ({
+ ...prev,
+ [name]: value,
+ }));
+ };
+
+ const handleImageUpload = (e: ChangeEvent) => {
+ const file = e.target.files?.[0];
+ if (!file) return;
+
+ const reader = new FileReader();
+ reader.onload = () => {
+ setPreview(reader.result as string);
+ setFormData((prev) => ({
+ ...prev,
+ profilePicture: reader.result as string,
+ }));
+ };
+ reader.readAsDataURL(file);
+ };
+
+ const triggerFileInput = () => {
+ fileInputRef.current?.click();
+ };
+
+ const handleSubmit = (e: React.FormEvent) => {
+ e.preventDefault();
+ console.log("Form submitted:", formData);
+ };
+
+ return (
+
+ {/* Mobile Header */}
+
+
+
+
+ );
+}
diff --git a/src/app/reader-profile/preferences/page.tsx b/src/app/reader-profile/preferences/page.tsx
new file mode 100644
index 0000000..14581a0
--- /dev/null
+++ b/src/app/reader-profile/preferences/page.tsx
@@ -0,0 +1,210 @@
+// PreferencesPage.tsx
+"use client";
+
+import { useState } from "react";
+import { ArrowLeft, ChevronDown, X } from "lucide-react";
+import { useRouter } from "next/navigation";
+import { useMobileMenu } from "@/hooks/useMobileMenu";
+
+const allGenres = [
+ "Fiction",
+ "Drama",
+ "Horror",
+ "Comedy",
+ "Sci-Fi",
+ "Fantasy",
+ "Romance",
+ "Mystery",
+ "Thriller",
+ "Non-Fiction",
+];
+const allFormats = [
+ "short stories",
+ "novels",
+ "poetry",
+ "essays",
+ "biographies",
+ "memoirs",
+];
+
+export default function PreferencesPage() {
+ const router = useRouter();
+ const { openMobileMenu } = useMobileMenu();
+ const [selectedGenres, setSelectedGenres] = useState([
+ "Fiction",
+ "Drama",
+ ]);
+ const [selectedFormats, setSelectedFormats] = useState([
+ "short stories",
+ ]);
+ const [isGenreDropdownOpen, setIsGenreDropdownOpen] = useState(false);
+ const [isFormatDropdownOpen, setIsFormatDropdownOpen] = useState(false);
+
+ const handleGenreSelect = (genre: string) => {
+ if (!selectedGenres.includes(genre)) {
+ setSelectedGenres([...selectedGenres, genre]);
+ }
+ setIsGenreDropdownOpen(false);
+ };
+
+ const handleFormatSelect = (format: string) => {
+ if (!selectedFormats.includes(format)) {
+ setSelectedFormats([...selectedFormats, format]);
+ }
+ setIsFormatDropdownOpen(false);
+ };
+
+ const removeGenre = (genre: string) => {
+ setSelectedGenres(selectedGenres.filter((g) => g !== genre));
+ };
+
+ const removeFormat = (format: string) => {
+ setSelectedFormats(selectedFormats.filter((f) => f !== format));
+ };
+
+ const handleSave = () => {
+ console.log("Saving preferences:", { selectedGenres, selectedFormats });
+ };
+
+ const handleCancel = () => {
+ setSelectedGenres(["Fiction", "Drama"]);
+ setSelectedFormats(["short stories"]);
+ };
+
+ return (
+
+ {/* Mobile Header */}
+
+
+
+ {/* Desktop Header */}
+
+
Preferences
+
+
+
+ {/* Genre Specialization */}
+
+
+ Genre specialization(s)
+
+
+
+
setIsGenreDropdownOpen(!isGenreDropdownOpen)}
+ className="w-full px-4 py-3 border border-gray-300 rounded-lg bg-white text-left flex items-center justify-between focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent"
+ >
+ Genres
+
+
+
+ {isGenreDropdownOpen && (
+
+ {allGenres
+ .filter((genre) => !selectedGenres.includes(genre))
+ .map((genre) => (
+ handleGenreSelect(genre)}
+ className="w-full px-4 py-2 text-left hover:bg-gray-50 transition-colors"
+ >
+ {genre}
+
+ ))}
+
+ )}
+
+
+
+ {selectedGenres.map((genre) => (
+
+ {genre}
+ removeGenre(genre)}
+ className="text-gray-500 hover:text-gray-800"
+ >
+
+
+
+ ))}
+
+
+
+ {/* Favorite Formats */}
+
+
+ Favorite formats
+
+
+
+
setIsFormatDropdownOpen(!isFormatDropdownOpen)}
+ className="w-full px-4 py-3 border border-gray-300 rounded-lg bg-white text-left flex items-center justify-between focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent"
+ >
+ Formats
+
+
+
+ {isFormatDropdownOpen && (
+
+ {allFormats
+ .filter((format) => !selectedFormats.includes(format))
+ .map((format) => (
+ handleFormatSelect(format)}
+ className="w-full px-2.5 py-2 text-left hover:bg-gray-50 transition-colors"
+ >
+ {format}
+
+ ))}
+
+ )}
+
+
+
+ {selectedFormats.map((format) => (
+
+ {format}
+ removeFormat(format)}
+ className="text-gray-500 hover:text-gray-800"
+ >
+
+
+
+ ))}
+
+
+
+ {/* Action Buttons */}
+
+
+ Cancel
+
+
+ Save Change
+
+
+
+
+
+ );
+}
diff --git a/src/app/reader-profile/privacy/page.tsx b/src/app/reader-profile/privacy/page.tsx
new file mode 100644
index 0000000..51fd0cc
--- /dev/null
+++ b/src/app/reader-profile/privacy/page.tsx
@@ -0,0 +1,28 @@
+"use client";
+import { ArrowLeft } from "lucide-react";
+import { useRouter } from "next/navigation";
+import { useMobileMenu } from "@/hooks/useMobileMenu";
+
+export default function Privacy() {
+ const router = useRouter();
+ const { openMobileMenu } = useMobileMenu();
+
+ return (
+
+ {/* Mobile Header */}
+
+
+
+ {/* Desktop Header */}
+
+
Privacy
+
+
+
+ );
+}
diff --git a/src/app/reader-profile/sign-out/page.tsx b/src/app/reader-profile/sign-out/page.tsx
new file mode 100644
index 0000000..a3c5318
--- /dev/null
+++ b/src/app/reader-profile/sign-out/page.tsx
@@ -0,0 +1,28 @@
+"use client";
+import { ArrowLeft } from "lucide-react";
+import { useRouter } from "next/navigation";
+import { useMobileMenu } from "@/hooks/useMobileMenu";
+
+export default function SignOutPage() {
+ const router = useRouter();
+ const { openMobileMenu } = useMobileMenu();
+
+ return (
+
+ {/* Mobile Header */}
+
+
+
+ {/* Desktop Header */}
+
+
Sign Out
+
+
+
+ );
+}
diff --git a/src/components/dashboard/sidebar.tsx b/src/components/dashboard/sidebar.tsx
index b01f4d6..a9d9e3c 100644
--- a/src/components/dashboard/sidebar.tsx
+++ b/src/components/dashboard/sidebar.tsx
@@ -50,6 +50,11 @@ export function Sidebar() {
label: "Analytics panel",
href: "/dashboard/analytics",
},
+ {
+ icon: User,
+ label: "Stats & Achievements",
+ href: "/dashboard/stats-and-achievements",
+ },
{
icon: MessageSquare,
label: "Readers Feedback",
diff --git a/src/components/stats-achievements/achievements-section.tsx b/src/components/stats-achievements/achievements-section.tsx
new file mode 100644
index 0000000..639c248
--- /dev/null
+++ b/src/components/stats-achievements/achievements-section.tsx
@@ -0,0 +1,57 @@
+import { Trophy, Flame, Target, Star } from "lucide-react"
+
+export function AchievementsSection() {
+ const achievements = [
+ {
+ icon: Trophy,
+ title: "10 Books Read in a Month",
+ color: "#DBA736",
+ bgColor: "#DBA7361A",
+ },
+ {
+ icon: Trophy,
+ title: "6 Days Reading Streak",
+ color: "#A22BD1",
+ bgColor: "#A22BD11A",
+ },
+ {
+ icon: Trophy,
+ title: "3 Genres Mastered",
+ color: "#388405",
+ bgColor: "#3884051A",
+ },
+ {
+ icon: Trophy,
+ title: "Enthusiast",
+ color: "#096CFF",
+ bgColor: "#096CFF1A",
+ },
+ ]
+
+ return (
+
+
Achievements
+
+
+ {achievements.map((achievement, index) => {
+ const IconComponent = achievement.icon
+ return (
+
+
+
+
+
{achievement.title}
+
+ )
+ })}
+
+
+ )
+}
diff --git a/src/components/stats-achievements/badge-section.tsx b/src/components/stats-achievements/badge-section.tsx
new file mode 100644
index 0000000..60437b4
--- /dev/null
+++ b/src/components/stats-achievements/badge-section.tsx
@@ -0,0 +1,81 @@
+import { Info } from "lucide-react";
+
+export function BadgeSection() {
+ const progress = 65; // You can make this dynamic later
+
+ return (
+
+
Badge
+
+
+
+
+
+
+
+ {/* Desktop Progress Bar */}
+
+
+
+
+ {/* Percentage Text - Positioned directly on the bar */}
+
+ {progress}%
+
+
+
+
+
+
+
+ {/* Mobile Progress Bar */}
+
+
+
+
+ {/* Percentage Text - Positioned directly on the bar */}
+
+ {progress}%
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/src/components/stats-achievements/goals-section.tsx b/src/components/stats-achievements/goals-section.tsx
new file mode 100644
index 0000000..e9089f2
--- /dev/null
+++ b/src/components/stats-achievements/goals-section.tsx
@@ -0,0 +1,74 @@
+import { Plus, Clock, Trophy } from "lucide-react";
+
+export function GoalsSection() {
+ const goals = [
+ {
+ title: "Complete 4 books in 2 weeks",
+ progress: 48,
+ daysLeft: 7,
+ color: "#84CDFF",
+ },
+ {
+ title: "Finish Reading the Book Last Man in 4 days",
+ progress: 89,
+ daysLeft: 7,
+ color: "#84CDFF",
+ },
+ ];
+
+ return (
+
+
+
Goals
+
+
+ Set new goal
+
+
+
+
+ {goals.map((goal, index) => (
+
+
+
+ {" "}
+
+ {goal.title}
+ {" "}
+
+ {goal.progress}%
+
+
+
+
+
+
+
{goal.daysLeft} Days Left
+
+
+
+
+
+
+
+
+
{goal.daysLeft} Days Left
+
+
+
+ ))}
+
+
+ );
+}
diff --git a/src/components/stats-achievements/stats-grid.tsx b/src/components/stats-achievements/stats-grid.tsx
new file mode 100644
index 0000000..2bc7492
--- /dev/null
+++ b/src/components/stats-achievements/stats-grid.tsx
@@ -0,0 +1,29 @@
+interface Stat {
+ label: string
+ value: string
+ unit?: string
+ color: string
+ }
+
+ interface StatsGridProps {
+ stats: Stat[]
+ }
+
+ export function StatsGrid({ stats }: StatsGridProps) {
+ return (
+
+ {stats.map((stat, index) => (
+
+
{stat.label}
+
+
+ {stat.value}
+
+ {stat.unit && {stat.unit} }
+
+
+ ))}
+
+ )
+ }
+
\ No newline at end of file
diff --git a/src/components/stats-achievements/time-filter.tsx b/src/components/stats-achievements/time-filter.tsx
new file mode 100644
index 0000000..0e2e5ad
--- /dev/null
+++ b/src/components/stats-achievements/time-filter.tsx
@@ -0,0 +1,28 @@
+"use client"
+
+interface TimeFilterProps {
+ selectedPeriod: string
+ onPeriodChange: (period: string) => void
+}
+
+export function TimeFilter({ selectedPeriod, onPeriodChange }: TimeFilterProps) {
+ const periods = ["This Week", "This Month", "This Year", "All Time"]
+
+ return (
+
+ {periods.map((period) => (
+ onPeriodChange(period)}
+ className={`px-2 lg:px-3 py-1.5 text-xs lg:text-sm rounded-[4px] transition-all duration-200 ${
+ selectedPeriod === period
+ ? "bg-[#F6F6F6] text-[#454545] "
+ : "text-[#888888] hover:bg-[#f6f6f6] "
+ }`}
+ >
+ {period}
+
+ ))}
+
+ )
+}
diff --git a/src/hooks/useMobileMenu.ts b/src/hooks/useMobileMenu.ts
new file mode 100644
index 0000000..e364b81
--- /dev/null
+++ b/src/hooks/useMobileMenu.ts
@@ -0,0 +1,14 @@
+"use client";
+import { createContext, useContext } from "react";
+
+export const MobileMenuContext = createContext<{
+ openMobileMenu: () => void;
+} | null>(null);
+
+export const useMobileMenu = () => {
+ const context = useContext(MobileMenuContext);
+ if (!context) {
+ throw new Error("useMobileMenu must be used within ReaderProfileLayout");
+ }
+ return context;
+};