feat: display user email and customer ID in UserDetailViewer

This commit is contained in:
javayhu 2025-07-12 08:10:31 +08:00
parent 4abca022aa
commit a5c6c8b493
2 changed files with 47 additions and 6 deletions

View File

@ -24,6 +24,7 @@ import { useIsMobile } from '@/hooks/use-mobile';
import { authClient } from '@/lib/auth-client'; import { authClient } from '@/lib/auth-client';
import type { User } from '@/lib/auth-types'; import type { User } from '@/lib/auth-types';
import { formatDate } from '@/lib/formatter'; import { formatDate } from '@/lib/formatter';
import { getStripeDashboardCustomerUrl } from '@/lib/urls/urls';
import { cn } from '@/lib/utils'; import { cn } from '@/lib/utils';
import { useUsersStore } from '@/stores/users-store'; import { useUsersStore } from '@/stores/users-store';
import { import {
@ -149,7 +150,7 @@ export function UserDetailViewer({ user }: UserDetailViewerProps) {
/> />
<div> <div>
<DrawerTitle>{user.name}</DrawerTitle> <DrawerTitle>{user.name}</DrawerTitle>
<DrawerDescription>{user.email}</DrawerDescription> {/* <DrawerDescription>{user.email}</DrawerDescription> */}
</div> </div>
</div> </div>
</DrawerHeader> </DrawerHeader>
@ -188,12 +189,51 @@ export function UserDetailViewer({ user }: UserDetailViewerProps) {
</div> </div>
</div> </div>
{/* information */} {/* email */}
<div className="text-muted-foreground"> {user.email && (
{t('joined')}: {formatDate(user.createdAt)} <div className="grid gap-3">
<span className="text-muted-foreground text-xs">
{t('columns.email')}:
</span>
<span
className="break-words cursor-pointer hover:bg-accent px-2 py-1 rounded border"
onClick={() => {
navigator.clipboard.writeText(user.email!);
toast.success(t('emailCopied'));
}}
>
{user.email}
</span>
</div>
)}
{/* customerId */}
{user.customerId && (
<div className="grid gap-3">
<span className="text-muted-foreground text-xs">
{t('columns.customerId')}:
</span>
<a
href={getStripeDashboardCustomerUrl(user.customerId)}
target="_blank"
rel="noopener noreferrer"
className="font-mono text-sm hover:underline hover:underline-offset-4 rounded break-all"
>
{user.customerId}
</a>
</div>
)}
</div>
{/* Timestamps */}
<div className="grid gap-3">
<div className="flex justify-between items-center">
<span className="text-muted-foreground">{t('joined')}:</span>
<span>{formatDate(user.createdAt)}</span>
</div> </div>
<div className="text-muted-foreground"> <div className="flex justify-between items-center">
{t('updated')}: {formatDate(user.updatedAt)} <span className="text-muted-foreground">{t('updated')}:</span>
<span>{formatDate(user.updatedAt)}</span>
</div> </div>
</div> </div>
<Separator /> <Separator />

View File

@ -575,6 +575,7 @@ export async function distributeCreditsToAllUsers() {
}) })
.from(user) .from(user)
.where(eq(user.banned, false)); // Only active users .where(eq(user.banned, false)); // Only active users
console.log('distributing credits to all users, users count:', users.length);
let processedCount = 0; let processedCount = 0;
let errorCount = 0; let errorCount = 0;