Improve mobile layout for admin users list

- Stack name and username vertically on mobile
- Move Telegram ID to separate line
- Make status badges wrap when needed
- Reduce font sizes and spacing on small screens
- Hide purchase count on mobile
- Hide chevron icon on mobile, keep only action menu
This commit is contained in:
c0mrade
2026-02-03 23:15:24 +03:00
parent ef6863081e
commit d826277247

View File

@@ -302,24 +302,31 @@ function UserRow({ user, onClick, onAction, formatAmount }: UserRowProps) {
return ( return (
<div <div
onClick={onClick} onClick={onClick}
className="flex cursor-pointer items-center gap-4 rounded-xl border border-dark-700 bg-dark-800/50 p-4 transition-all hover:border-dark-600 hover:bg-dark-800" className="flex cursor-pointer items-start gap-3 rounded-xl border border-dark-700 bg-dark-800/50 p-3 transition-all hover:border-dark-600 hover:bg-dark-800 sm:items-center sm:gap-4 sm:p-4"
> >
{/* Avatar */} {/* Avatar */}
<div className="flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-gradient-to-br from-accent-500 to-accent-700 font-medium text-white"> <div className="flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-gradient-to-br from-accent-500 to-accent-700 text-sm font-medium text-white sm:text-base">
{user.first_name?.[0] || user.username?.[0] || '?'} {user.first_name?.[0] || user.username?.[0] || '?'}
</div> </div>
{/* Info */} {/* Info - flex column on mobile, row on desktop */}
<div className="min-w-0 flex-1"> <div className="min-w-0 flex-1">
<div className="mb-1 flex items-center gap-2"> {/* Name and username */}
<div className="mb-1 flex flex-col gap-0.5 sm:flex-row sm:items-center sm:gap-2">
<span className="truncate font-medium text-dark-100">{user.full_name}</span> <span className="truncate font-medium text-dark-100">{user.full_name}</span>
{user.username && <span className="text-xs text-dark-500">@{user.username}</span>} {user.username && (
<span className="truncate text-xs text-dark-500 sm:text-xs">@{user.username}</span>
)}
</div> </div>
<div className="flex items-center gap-3 text-xs text-dark-400">
<span className="flex items-center gap-1"> {/* Telegram ID - full width on mobile */}
<div className="mb-1 flex items-center gap-1 text-xs text-dark-400 sm:mb-0">
<TelegramIcon /> <TelegramIcon />
{user.telegram_id} <span className="truncate">{user.telegram_id}</span>
</span> </div>
{/* Status badges - wrap on mobile */}
<div className="mt-1 flex flex-wrap items-center gap-1.5">
{user.status !== 'active' && <StatusBadge status={user.status} />} {user.status !== 'active' && <StatusBadge status={user.status} />}
{user.has_subscription && user.subscription_status && ( {user.has_subscription && user.subscription_status && (
<span <span
@@ -341,21 +348,25 @@ function UserRow({ user, onClick, onAction, formatAmount }: UserRowProps) {
</div> </div>
</div> </div>
{/* Balance */} {/* Balance - smaller on mobile, show inline */}
<div className="shrink-0 text-right"> <div className="shrink-0 text-right">
<div className="font-medium text-dark-100">{formatAmount(user.balance_rubles)}</div> <div className="text-sm font-medium text-dark-100 sm:text-base">
<div className="text-xs text-dark-500"> {formatAmount(user.balance_rubles)}
</div>
<div className="hidden text-xs text-dark-500 sm:block">
{user.purchase_count > 0 {user.purchase_count > 0
? t('admin.users.purchaseCount', { count: user.purchase_count }) ? t('admin.users.purchaseCount', { count: user.purchase_count })
: t('admin.users.noPurchases')} : t('admin.users.noPurchases')}
</div> </div>
</div> </div>
{/* Actions Menu */} {/* Actions Menu - hide chevron on mobile, show only dots */}
<UserActionsMenu user={user} onAction={onAction} /> <UserActionsMenu user={user} onAction={onAction} />
<div className="hidden sm:block">
<ChevronRightIcon /> <ChevronRightIcon />
</div> </div>
</div>
); );
} }