From e284de79a8eef8d5140172f2fd96842c82a11c41 Mon Sep 17 00:00:00 2001 From: javayhu Date: Sun, 11 May 2025 14:50:13 +0800 Subject: [PATCH] chore: support show admin user page in demo website --- env.example | 5 ++-- messages/en.json | 1 + messages/zh.json | 1 + src/components/admin/user-detail-viewer.tsx | 21 ++++++++------ src/components/admin/users-table.tsx | 32 +++++++++++++-------- src/config/sidebar-config.tsx | 5 +++- 6 files changed, 42 insertions(+), 23 deletions(-) diff --git a/env.example b/env.example index 37051fa..2e987b1 100644 --- a/env.example +++ b/env.example @@ -78,9 +78,10 @@ NEXT_PUBLIC_STRIPE_PRICE_LIFETIME="" # ----------------------------------------------------------------------------- # Configurations # ----------------------------------------------------------------------------- -# Disable image optimization -# ----------------------------------------------------------------------------- +# Disable image optimization, check out next.config.ts for more details DISABLE_IMAGE_OPTIMIZATION="false" +# Run this website as demo website, in most cases, you should set this to false +RUN_AS_DEMO_WEBSITE="false" # ----------------------------------------------------------------------------- # Analytics diff --git a/messages/en.json b/messages/en.json index 0f6dd64..b8e58ee 100644 --- a/messages/en.json +++ b/messages/en.json @@ -441,6 +441,7 @@ "title": "Admin", "users": { "title": "Users", + "fakeData": "Note: Faked data for demonstration, some features are disabled", "error": "Failed to get users", "search": "Search users...", "columns": { diff --git a/messages/zh.json b/messages/zh.json index f29cd4b..b68a5d1 100644 --- a/messages/zh.json +++ b/messages/zh.json @@ -442,6 +442,7 @@ "title": "系统管理", "users": { "title": "用户管理", + "fakeData": "注:只为演示功能,数据为假数据,封禁功能不可用", "error": "获取用户失败", "search": "搜索用户...", "columns": { diff --git a/src/components/admin/user-detail-viewer.tsx b/src/components/admin/user-detail-viewer.tsx index b5bcf3b..3120754 100644 --- a/src/components/admin/user-detail-viewer.tsx +++ b/src/components/admin/user-detail-viewer.tsx @@ -51,6 +51,9 @@ export function UserDetailViewer({ user }: UserDetailViewerProps) { const [banExpiresAt, setBanExpiresAt] = useState(); const triggerRefresh = useUsersStore((state) => state.triggerRefresh); + // show fake data in demo website + const isDemo = process.env.NEXT_PUBLIC_DEMO_WEBSITE === 'true'; + const handleBan = async () => { if (!banReason) { setError(t('ban.error')); @@ -131,7 +134,7 @@ export function UserDetailViewer({ user }: UserDetailViewerProps) { className="size-8 border" /> - {user.name} + {isDemo ? 'MkSaaS User' : user.name} @@ -145,8 +148,10 @@ export function UserDetailViewer({ user }: UserDetailViewerProps) { className="size-12 border" />
- {user.name} - {user.email} + {isDemo ? 'MkSaaS User' : user.name} + + {isDemo ? 'example@mksaas.com' : user.email} +
@@ -158,7 +163,7 @@ export function UserDetailViewer({ user }: UserDetailViewerProps) { variant={user.role === 'admin' ? 'default' : 'outline'} className="px-1.5" > - {t(user.role === 'admin' ? 'admin' : 'user')} + {user.role === 'admin' ? t('admin') : t('user')} {/* email verified */} @@ -201,10 +206,10 @@ export function UserDetailViewer({ user }: UserDetailViewerProps) { {/* ban or unban user */} {user.banned ? (
-
+
{t('ban.reason')}: {user.banReason}
-
+
{t('ban.expires')}:{' '} {(user.banExpires && formatDate(user.banExpires)) || t('ban.never')} @@ -212,7 +217,7 @@ export function UserDetailViewer({ user }: UserDetailViewerProps) {
); @@ -185,7 +188,7 @@ export function UsersTable({ variant={role === 'admin' ? 'default' : 'outline'} className="px-1.5" > - {t(role === 'admin' ? 'admin' : 'user')} + {role === 'admin' ? t('admin') : t('user')}
); @@ -224,7 +227,7 @@ export function UsersTable({ rel="noopener noreferrer" className="hover:underline hover:underline-offset-4" > - {user.customerId} + {!isDemo ? user.customerId : 'cus_abcdef123456'} ) : ( '-' @@ -323,15 +326,20 @@ export function UsersTable({ return (
- { - onSearch(event.target.value); - onPageChange(0); - }} - className="max-w-sm" - /> +
+ { + onSearch(event.target.value); + onPageChange(0); + }} + className="max-w-sm" + /> + {isDemo && ( + {t('fakeData')} + )} +