From 54c8a7bfd1c22e358c269bbd64076f1dce243a59 Mon Sep 17 00:00:00 2001 From: EDOHWARES Date: Fri, 25 Jul 2025 05:19:15 +0100 Subject: [PATCH 1/2] ui: add user management root --- .../dashboard/admin/user-management/page.tsx | 259 +++++++++++++- .../user-management/readers/[id]/page.tsx | 329 ++++++++++++++++++ 2 files changed, 578 insertions(+), 10 deletions(-) create mode 100644 src/app/dashboard/admin/user-management/readers/[id]/page.tsx diff --git a/src/app/dashboard/admin/user-management/page.tsx b/src/app/dashboard/admin/user-management/page.tsx index b2bd5e4..7378fe9 100644 --- a/src/app/dashboard/admin/user-management/page.tsx +++ b/src/app/dashboard/admin/user-management/page.tsx @@ -1,20 +1,259 @@ -"use-client"; +"use client"; + import { Header } from "@/components/dashboard/header"; +import { useRouter } from "next/navigation"; + +import React, { useState } from "react"; +import { + Users, + UserCheck, + BookOpen, + UserPlus, + Search, + Filter, + SortAsc, +} from "lucide-react"; + +const UserManagment = () => { + const [activeTab, setActiveTab] = useState("Readers"); + const [searchTerm, setSearchTerm] = useState(""); + const router = useRouter(); + + const statsCards = [ + { title: "Writers", value: "257", icon: Users, bgColor: "bg-white" }, + { + title: "Verified Writers", + value: "83", + icon: UserCheck, + bgColor: "bg-white", + }, + { title: "Readers", value: "1093", icon: BookOpen, bgColor: "bg-white" }, + { + title: "Subscribed Readers", + value: "204", + icon: UserPlus, + bgColor: "bg-white", + }, + ]; + + const additionalStats = [ + { title: "Total Users", value: "257", icon: Users, bgColor: "bg-white" }, + ]; + const readersData = [ + { + name: "Jane Doe", + wallet: "0xABC...789", + joinedDate: "27 May, 2025", + booksPurchased: 13, + readingRank: "Bookworm", + }, + { + name: "Ole Paul", + wallet: "0xABC...789", + joinedDate: "7 June, 2025", + booksPurchased: 3, + readingRank: "Enthusiast", + }, + { + name: "Aminu Sani", + wallet: "0xABC...789", + joinedDate: "27 May, 2025", + booksPurchased: 9, + readingRank: "Scholar", + }, + { + name: "Faith Adamu", + wallet: "0xABC...789", + joinedDate: "7 June, 2025", + booksPurchased: 11, + readingRank: "Connoisseur", + }, + { + name: "Wood Word", + wallet: "0xABC...789", + joinedDate: "27 May, 2025", + booksPurchased: 4, + readingRank: "Scholar", + }, + ]; -export default function UserManagment() { + type StatCardProps = { + title: string; + value: string; + icon: React.ElementType; + bgColor: string; + }; + + const StatCard: React.FC = ({ title, value, icon: Icon, bgColor }) => ( +
+
+
+

{title}

+

{value}

+
+
+ +
+
+
+ ); return ( <> -
-
-
-

User Management

-

- Welcome to user management section of the admin dashboard! Here, you can manage all aspects of user accounts, including registration, profiles, and permissions. This space is designed to help you maintain a secure and organized user base, ensuring that users have the appropriate access and capabilities within your platform. -

+
+ +
+
+ {/* Stats Cards Grid */} +
+ {statsCards.map((card, index) => ( + + ))} +
+ + {/* Additional Stats Row */} +
+ {additionalStats.map((card, index) => ( + + ))} + {/* Empty placeholders for consistent grid */} +
+
+
+
+ + {/* Main Content Area */} +
+ {/* Tab Navigation */} +
+
+
+ {["Readers", "Writers"].map((tab) => ( + + ))} +
+ + {/* Search and Filter Controls */} +
+
+ + setSearchTerm(e.target.value)} + className="pl-10 pr-4 py-2 border border-gray-300 rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent w-full sm:w-64" + /> +
+ + +
+
+
+ + {/* Table */} +
+ + + + + + + + + + + + + {readersData + .filter((reader) => + reader.name + .toLowerCase() + .includes(searchTerm.toLowerCase()) + ) + .map((reader, index) => ( + router.push(`/dashboard/admin/user-management/readers/${encodeURIComponent(reader.name)}`)} + > + + + + + + + + ))} + +
+ Reader Name + + Wallet Address + + Joined Date + + Books Purchased + + Reading Rank + + Action +
+ {reader.name} + + {reader.wallet} + + {reader.joinedDate} + + {reader.booksPurchased} + + {reader.readingRank} + + +
+
+ + {/* Pagination */} +
+
+ Showing 1 to 5 of 12 +
+ +
+
); -} +}; + +export default UserManagment; diff --git a/src/app/dashboard/admin/user-management/readers/[id]/page.tsx b/src/app/dashboard/admin/user-management/readers/[id]/page.tsx new file mode 100644 index 0000000..055951f --- /dev/null +++ b/src/app/dashboard/admin/user-management/readers/[id]/page.tsx @@ -0,0 +1,329 @@ +"use client" + +import React, { useState } from 'react'; +import { MessageCircle, Star, BookOpen } from 'lucide-react'; +import { useParams } from 'next/navigation'; + +type Reader = { + name: string; + wallet: string; + joinedDate: string; + readingRank: string; + image: string; +}; + +const mockReaders: { [key: string]: Reader } = { + 'Jane Doe': { + name: 'Jane Doe', + wallet: '0xABC...789', + joinedDate: '27 May, 2025', + readingRank: 'Bookworm', + image: '/api/placeholder/64/64', + }, + 'Ole Paul': { + name: 'Ole Paul', + wallet: '0xABC...789', + joinedDate: '7 June, 2025', + readingRank: 'Enthusiast', + image: '/api/placeholder/64/64', + }, + 'Aminu Sani': { + name: 'Aminu Sani', + wallet: '0xABC...789', + joinedDate: '27 May, 2025', + readingRank: 'Scholar', + image: '/api/placeholder/64/64', + }, + 'Faith Adamu': { + name: 'Faith Adamu', + wallet: '0xABC...789', + joinedDate: '7 June, 2025', + readingRank: 'Connoisseur', + image: '/api/placeholder/64/64', + }, + 'Wood Word': { + name: 'Wood Word', + wallet: '0xABC...789', + joinedDate: '27 May, 2025', + readingRank: 'Scholar', + image: '/api/placeholder/64/64', + }, +}; + +const UserProfilePage = () => { + const params = useParams(); + const readerId = decodeURIComponent(params.id as string); + const reader = mockReaders[readerId] || mockReaders['Jane Doe']; + + const [activeTab, setActiveTab] = useState('Library'); + const [activeFilter, setActiveFilter] = useState('All'); + + const stats = [ + { label: 'Following', value: '4', color: 'text-blue-600' }, + { label: 'Average Session', value: '45', unit: 'Minutes', color: 'text-blue-600' }, + { label: 'Completion Rate', value: '4', unit: 'Hours', color: 'text-blue-600' }, + { label: 'Last Seen', value: '14', unit: 'Hours Ago', color: 'text-blue-600' } + ]; + + const libraryStats = [ + { label: 'Total Books Purchased', value: '24' }, + { label: 'Regular Book', value: '12' }, + { label: 'NFT Editions', value: '4' }, + { label: 'Series', value: '8' }, + { label: 'Collections', value: '3' }, + { label: 'Read', value: '3' }, + { label: 'Progress', value: '3' }, + { label: 'Unread', value: '3' } + ]; + + const books = [ + { + id: 1, + title: 'Native Invisibility', + author: 'Danni Collins', + rating: 4.5, + image: '/api/placeholder/80/120', + isNFT: false, + views: null + }, + { + id: 2, + title: 'Native Invisibility', + author: 'Danni Collins', + rating: 4.5, + image: '/api/placeholder/80/120', + isNFT: false, + views: 4 + }, + { + id: 3, + title: 'Native Invisibility', + author: 'Danni Collins', + rating: 4.5, + image: '/api/placeholder/80/120', + isNFT: true, + views: null + }, + { + id: 4, + title: 'Native Invisibility', + author: 'Danni Collins', + rating: 4.5, + image: '/api/placeholder/80/120', + isNFT: false, + views: 4 + }, + { + id: 5, + title: 'Native Invisibility', + author: 'Danni Collins', + rating: 4.5, + image: '/api/placeholder/80/120', + isNFT: false, + views: null + }, + { + id: 6, + title: 'Native Invisibility', + author: 'Danni Collins', + rating: 4.5, + image: '/api/placeholder/80/120', + isNFT: false, + views: 4 + }, + { + id: 7, + title: 'Native Invisibility', + author: 'Danni Collins', + rating: 4.5, + image: '/api/placeholder/80/120', + isNFT: false, + views: null + }, + { + id: 8, + title: 'Native Invisibility', + author: 'Danni Collins', + rating: 4.5, + image: '/api/placeholder/80/120', + isNFT: true, + views: null + } + ]; + + type Book = { + id: number; + title: string; + author: string; + rating: number; + image: string; + isNFT: boolean; + views: number | null; + }; + + const BookCard = ({ book }: { book: Book }) => ( +
+ {book.isNFT && ( +
+ NFT +
+ )} +
+
+ +
+
+

{book.title}

+

By {book.author}

+
+ + {book.rating} + {book.views && ( + <> + + {book.views} + + )} +
+
+
+
+ ); + + return ( +
+
+ {/* Header Section */} +
+
+
+
+ {reader.name} +
+
+

+ {reader.name} + +

+

{reader.wallet}

+
+ Rank: + + {reader.readingRank} + +
+

Joined: {reader.joinedDate}

+
+
+
+ + +
+
+ + {/* Stats Grid */} +
+ {stats.map((stat, index) => ( +
+
+ {stat.value} + {stat.unit && {stat.unit}} +
+
{stat.label}
+
+ ))} +
+
+ + {/* Main Content */} +
+ {/* Tab Navigation */} +
+
+ {['Library', 'Transactions', 'Direct Notification', 'Reviews & Feedback'].map((tab) => ( + + ))} +
+
+ + {/* Library Content */} + {activeTab === 'Library' && ( +
+ {/* Library Stats */} +
+ {libraryStats.map((stat, index) => ( +
+
{stat.value}
+
{stat.label}
+
+ ))} +
+ + {/* Filter Tabs */} +
+
+ {['All', 'Regular', 'NFT Edition', 'Series'].map((filter) => ( + + ))} +
+
+ +
+
+ + {/* Books Grid */} +
+ {books.map((book) => ( + + ))} +
+
+ )} + + {/* Other Tab Contents */} + {activeTab !== 'Library' && ( +
+
+ {activeTab} content would go here +
+
+ )} +
+
+
+ ); +}; + +export default UserProfilePage; From f58aaa6a22befc7933034316db77efca4718c283 Mon Sep 17 00:00:00 2001 From: EDOHWARES Date: Thu, 31 Jul 2025 15:04:24 +0100 Subject: [PATCH 2/2] feat: add comprehensive reader user management system with access control, analytics, and subscription features --- public/message_icon.png | Bin 0 -> 801 bytes .../dashboard/admin/user-management/page.tsx | 3 +- .../user-management/readers/[id]/page.tsx | 479 ++++++++++-------- src/assets/images/reader1.png | Bin 0 -> 17570 bytes src/components/reader/SuspendUserModal.tsx | 160 ++++++ 5 files changed, 440 insertions(+), 202 deletions(-) create mode 100644 public/message_icon.png create mode 100644 src/assets/images/reader1.png create mode 100644 src/components/reader/SuspendUserModal.tsx diff --git a/public/message_icon.png b/public/message_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f979d6658ab7793a324a3059f3bf25839d760637 GIT binary patch literal 801 zcmV++1K#|JP)+ zKTUBo*xo0}smNwZ&Xs$>J4qqeb<4$Kv58=A1hH(f9M>Mod<6Qu)9Fklg$%Z{ZQF)! z#eTov#0c;RnDQH@K5TkPKoiH{XfztbLtho(C=1iqBkFV|fwTenA%H!IrclS_kBO$V z00)CXiyxAN;*T*jbn0jUqNx%!Q&@~!b}m(WWk7mQGFTrnZrSry?Ue!Hy@q5Yyh|BS zc^t%_vp2?-S1^S5adqHz)_IP3WQ(G7Jm^SvvQ!OI%_I~(G#n1)TGHvozGNhBkW_7T zJjj{$BDY z=e)nh1$*GfAbFSz1qoH|9(yKIUEkovFWAgzZwap@rUY@CGX;HFEV!V3VpcPpAHKDM zJUJI64pYD^JNM!sVOR&80oTHA(F%g}R$$h8z3wur3b>!){In5gjFXF5z|MFd@|w { const params = useParams(); const readerId = decodeURIComponent(params.id as string); - const reader = mockReaders[readerId] || mockReaders['Jane Doe']; + const reader = mockReaders[readerId] || mockReaders["Jane Doe"]; + const [suspendModalOpen, setSuspendModalOpen] = useState(false); + + const [activeTab, setActiveTab] = useState("Library"); + const [activeFilter, setActiveFilter] = useState("All"); - const [activeTab, setActiveTab] = useState('Library'); - const [activeFilter, setActiveFilter] = useState('All'); + const setShowModal = (show: boolean) => { + setSuspendModalOpen(show); + } const stats = [ - { label: 'Following', value: '4', color: 'text-blue-600' }, - { label: 'Average Session', value: '45', unit: 'Minutes', color: 'text-blue-600' }, - { label: 'Completion Rate', value: '4', unit: 'Hours', color: 'text-blue-600' }, - { label: 'Last Seen', value: '14', unit: 'Hours Ago', color: 'text-blue-600' } + { label: "Following", value: "4", color: "text-blue-600" }, + { + label: "Average Session", + value: "45", + unit: "Minutes", + color: "text-blue-600", + }, + { + label: "Completion Rate", + value: "4", + unit: "Hours", + color: "text-blue-600", + }, + { + label: "Last Seen", + value: "14", + unit: "Hours Ago", + color: "text-blue-600", + }, ]; const libraryStats = [ - { label: 'Total Books Purchased', value: '24' }, - { label: 'Regular Book', value: '12' }, - { label: 'NFT Editions', value: '4' }, - { label: 'Series', value: '8' }, - { label: 'Collections', value: '3' }, - { label: 'Read', value: '3' }, - { label: 'Progress', value: '3' }, - { label: 'Unread', value: '3' } + { label: "Total Books Purchased", value: "24" }, + { label: "Regular Book", value: "12" }, + { label: "NFT Editions", value: "4" }, + { label: "Series", value: "8" }, + { label: "Collections", value: "3" }, + { label: "Read", value: "3" }, + { label: "Progress", value: "3" }, + { label: "Unread", value: "3" }, ]; const books = [ { id: 1, - title: 'Native Invisibility', - author: 'Danni Collins', + title: "Native Invisibility", + author: "Danni Collins", rating: 4.5, - image: '/api/placeholder/80/120', + image: "/api/placeholder/80/120", isNFT: false, - views: null + views: null, }, { id: 2, - title: 'Native Invisibility', - author: 'Danni Collins', + title: "Native Invisibility", + author: "Danni Collins", rating: 4.5, - image: '/api/placeholder/80/120', + image: "/api/placeholder/80/120", isNFT: false, - views: 4 + views: 4, }, { id: 3, - title: 'Native Invisibility', - author: 'Danni Collins', + title: "Native Invisibility", + author: "Danni Collins", rating: 4.5, - image: '/api/placeholder/80/120', + image: "/api/placeholder/80/120", isNFT: true, - views: null + views: null, }, { id: 4, - title: 'Native Invisibility', - author: 'Danni Collins', + title: "Native Invisibility", + author: "Danni Collins", rating: 4.5, - image: '/api/placeholder/80/120', + image: "/api/placeholder/80/120", isNFT: false, - views: 4 + views: 4, }, { id: 5, - title: 'Native Invisibility', - author: 'Danni Collins', + title: "Native Invisibility", + author: "Danni Collins", rating: 4.5, - image: '/api/placeholder/80/120', + image: "/api/placeholder/80/120", isNFT: false, - views: null + views: null, }, { id: 6, - title: 'Native Invisibility', - author: 'Danni Collins', + title: "Native Invisibility", + author: "Danni Collins", rating: 4.5, - image: '/api/placeholder/80/120', + image: "/api/placeholder/80/120", isNFT: false, - views: 4 + views: 4, }, { id: 7, - title: 'Native Invisibility', - author: 'Danni Collins', + title: "Native Invisibility", + author: "Danni Collins", rating: 4.5, - image: '/api/placeholder/80/120', + image: "/api/placeholder/80/120", isNFT: false, - views: null + views: null, }, { id: 8, - title: 'Native Invisibility', - author: 'Danni Collins', + title: "Native Invisibility", + author: "Danni Collins", rating: 4.5, - image: '/api/placeholder/80/120', + image: "/api/placeholder/80/120", isNFT: true, - views: null - } + views: null, + }, ]; type Book = { @@ -162,20 +190,28 @@ const UserProfilePage = () => { }; const BookCard = ({ book }: { book: Book }) => ( -
+
{book.isNFT && (
NFT
)} -
-
- -
-
-

{book.title}

-

By {book.author}

-
+
+ {book.title} +
+

+ {book.title} +

+
+

By {book.author}

+ Verified Icon +
+
{book.rating} {book.views && ( @@ -191,138 +227,179 @@ const UserProfilePage = () => { ); return ( -
-
- {/* Header Section */} -
-
-
-
- {reader.name} -
-
-

- {reader.name} - -

-

{reader.wallet}

-
- Rank: - - {reader.readingRank} - + <> +
+ {suspendModalOpen &&
+ +
} +
+
+ {/* Header Section */} +
+
+
+
+ {reader.name}
-

Joined: {reader.joinedDate}

-
-
-
- - -
-
- - {/* Stats Grid */} -
- {stats.map((stat, index) => ( -
-
- {stat.value} - {stat.unit && {stat.unit}} +
+

+ {reader.name} +

+
+

{reader.wallet}

+ Copy Wallet Address +
+
+ Rank: + + {reader.readingRank} + +
+

+ Joined: {reader.joinedDate} +

-
{stat.label}
- ))} -
-
- - {/* Main Content */} -
- {/* Tab Navigation */} -
-
- {['Library', 'Transactions', 'Direct Notification', 'Reviews & Feedback'].map((tab) => ( +
+ +
+
+ + {/* Stats Grid */} +
+ {stats.map((stat, index) => ( +
+
+ {stat.label} +
+ +
+ {stat.value} + {stat.unit && ( + + {stat.unit} + + )} +
+
))}
- {/* Library Content */} - {activeTab === 'Library' && ( -
- {/* Library Stats */} -
- {libraryStats.map((stat, index) => ( -
-
{stat.value}
-
{stat.label}
-
+ {/* Main Content */} +
+ {/* Tab Navigation */} +
+
+ {[ + "Library", + "Transactions", + "Direct Notification", + "Reviews & Feedback", + ].map((tab) => ( + ))}
+
- {/* Filter Tabs */} -
-
- {['All', 'Regular', 'NFT Edition', 'Series'].map((filter) => ( - + {/* Library Content */} + {activeTab === "Library" && ( +
+ {/* Library Stats */} +
+ {libraryStats.map((stat, index) => ( +
+
{stat.label}
+ +
+ {stat.value} +
+
))}
-
- + + {/* Filter Tabs */} +
+
+ {["All", "Regular", "NFT Edition", "Series"].map( + (filter) => ( + + ) + )} +
+
+ + +
-
- {/* Books Grid */} -
- {books.map((book) => ( - - ))} + {/* Books Grid */} +
+ {books.map((book) => ( + + ))} +
-
- )} + )} - {/* Other Tab Contents */} - {activeTab !== 'Library' && ( -
-
- {activeTab} content would go here + {/* Other Tab Contents */} + {activeTab !== "Library" && ( +
+
+ {activeTab} content would go here +
-
- )} + )} +
-
+ ); }; diff --git a/src/assets/images/reader1.png b/src/assets/images/reader1.png new file mode 100644 index 0000000000000000000000000000000000000000..1af34396b261d652cff9ab202be4a100dce34475 GIT binary patch literal 17570 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 JPDHLkV1j^r>N)@b literal 0 HcmV?d00001 diff --git a/src/components/reader/SuspendUserModal.tsx b/src/components/reader/SuspendUserModal.tsx new file mode 100644 index 0000000..ae2b646 --- /dev/null +++ b/src/components/reader/SuspendUserModal.tsx @@ -0,0 +1,160 @@ +import React, { useState } from "react"; +import { X, ChevronDown } from "lucide-react"; + +type SuspendUserModalProps = { + setShow: (show: boolean) => void; +}; + +export default function SuspendUserModal({ setShow }: SuspendUserModalProps) { + const [reason, setReason] = useState(""); + const [duration, setDuration] = useState(""); + const [isDropdownOpen, setIsDropdownOpen] = useState(false); + const [isModalOpen, setIsModalOpen] = useState(true); + + const durationOptions = [ + "1 Day", + "3 Days", + "1 Week", + "2 Weeks", + "1 Month", + "3 Months", + "6 Months", + "1 Year", + "Permanent", + ]; + + const handleDurationSelect = (selectedDuration: any) => { + setDuration(selectedDuration); + setIsDropdownOpen(false); + }; + + const handleSuspend = () => { + console.log( + "Suspending user with reason:", + reason, + "and duration:", + duration + ); + // Add your suspension logic here + }; + + const handleCancel = () => { + setIsModalOpen(false); + }; + + if (!isModalOpen) { + return ( +
+ +
+ ); + } + + return ( +
+
+ {/* Header */} +
+

Suspend User

+ +
+ + {/* Content */} +
+ {/* Blue info box */} +
+

+ Enter the reason you are suspending these user +

+
+ + {/* Suspended by info */} +
+

+ Suspended by:{" "} + Ola***p@gmail.com +

+
+ + {/* Description field */} +
+ +