diff --git a/src/app/admin/analytics/economy/page.tsx b/src/app/admin/analytics/economy/page.tsx index 2b15f0e3..08795bd5 100644 --- a/src/app/admin/analytics/economy/page.tsx +++ b/src/app/admin/analytics/economy/page.tsx @@ -1,7 +1,8 @@ -import { ArrowLeftRight, Coins, TrendingDown, TrendingUp } from "lucide-react"; +import { ArrowLeftRight, TrendingDown, TrendingUp } from "lucide-react"; import { redirect } from "next/navigation"; import { RevenueChart } from "@/components/admin/revenue-chart"; import { StatsCard } from "@/components/admin/stats-card"; +import { CurrencyIcon } from "@/components/shared/currency-icon"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { canAccess, getAdminContext, PERMS } from "@/lib/permissions"; import { prisma } from "@/lib/prisma"; @@ -161,19 +162,19 @@ export default async function EconomyPage() { title="Credits in Circulation" value={data.totalCredits.toLocaleString()} description="Total credits across all users" - icon={} + icon={} /> } + icon={} /> } + icon={} /> ) : ( -
+
{item.costCredits > 0 && ( - - {item.costCredits}c{" "} + + + {item.costCredits} )} {item.costPoints > 0 && ( - - {item.costPoints} {pts.label}{" "} + + + {item.costPoints} )} {item.costCredits === 0 && diff --git a/src/app/admin/users/[id]/user-quick-actions.tsx b/src/app/admin/users/[id]/user-quick-actions.tsx index e6e72607..38eaffac 100644 --- a/src/app/admin/users/[id]/user-quick-actions.tsx +++ b/src/app/admin/users/[id]/user-quick-actions.tsx @@ -2,7 +2,6 @@ import { Check, - Coins, Copy, KeyRound, MessageCircle, @@ -19,6 +18,7 @@ import { sendCredits, unmuteUser, } from "@/actions/users"; +import { CurrencyIcon } from "@/components/shared/currency-icon"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; @@ -229,7 +229,8 @@ export function UserQuickActions({ disabled={isPending} size="sm" > - Send Credits + {" "} + Send Credits
diff --git a/src/app/admin/users/_components/user-hero.tsx b/src/app/admin/users/_components/user-hero.tsx index 0d00f6dc..99e5b94f 100644 --- a/src/app/admin/users/_components/user-hero.tsx +++ b/src/app/admin/users/_components/user-hero.tsx @@ -1,20 +1,17 @@ import { ArrowLeftRight, - Coins, - Diamond, DoorOpen, Eye, - Gem, MessageSquare, Pencil, Shield, - Sparkles, Wifi, WifiOff, } from "lucide-react"; import Link from "next/link"; import { AdminBreadcrumb } from "@/components/admin/admin-breadcrumb"; import { UserWatchToggle } from "@/components/admin/user-watch-toggle"; +import { CurrencyIcon } from "@/components/shared/currency-icon"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { getAvatarUrl } from "@/lib/imager"; @@ -159,28 +156,28 @@ export function UserHero({ {/* Currency row */}
- + {user.credits.toLocaleString()} credits
- + {diamonds.toLocaleString()} diamonds
- + {duckets.toLocaleString()} duckets
- + {user.pixels.toLocaleString()} diff --git a/src/app/admin/users/users-table.tsx b/src/app/admin/users/users-table.tsx index 22fa03cb..c478f6de 100644 --- a/src/app/admin/users/users-table.tsx +++ b/src/app/admin/users/users-table.tsx @@ -11,6 +11,7 @@ import { bulkUnban, } from "@/actions/bulk-users"; import { DataTable } from "@/components/admin/data-table"; +import { CurrencyIcon } from "@/components/shared/currency-icon"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { @@ -436,9 +437,22 @@ export function UsersTable({ data, canEdit, canBan }: UsersTableProps) { - Credits - Pixels (Duckets) - Points (Diamonds) + + + Credits + + + + + Pixels (Duckets) + + + + + Points + (Diamonds) + +
diff --git a/src/components/admin/catalog/items-shop-preview.tsx b/src/components/admin/catalog/items-shop-preview.tsx index f52b4d87..e39e77a3 100644 --- a/src/components/admin/catalog/items-shop-preview.tsx +++ b/src/components/admin/catalog/items-shop-preview.tsx @@ -3,6 +3,10 @@ import { Crown, Image as ImageIcon, Package, Sparkles } from "lucide-react"; import type { CatalogItemData } from "@/app/admin/catalog/[id]/catalog-items-table/types"; import { getPointsLabel } from "@/app/admin/catalog/[id]/catalog-items-table/types"; +import { + CurrencyIcon, + currencyKindFromPointsType, +} from "@/components/shared/currency-icon"; import { Badge } from "@/components/ui/badge"; import { getHabboCdnIconUrl, getLocalIconUrl } from "@/lib/furni/classname"; import { cn } from "@/lib/utils"; @@ -113,13 +117,20 @@ export function ItemsShopPreview({

{item.costCredits > 0 && ( - - {item.costCredits}c + + + {item.costCredits} )} {item.costPoints > 0 && ( - - {item.costPoints} {points.label.slice(0, 3)} + + + {item.costPoints} )} {item.costCredits === 0 && item.costPoints === 0 && ( diff --git a/src/components/shared/currency-icon.tsx b/src/components/shared/currency-icon.tsx new file mode 100644 index 00000000..59613fbb --- /dev/null +++ b/src/components/shared/currency-icon.tsx @@ -0,0 +1,55 @@ +/** + * Habbo-style currency icons used across admin (and reusable on public). + * Files live at /assets/images/icons/currency/{name}.png + */ + +export type CurrencyKind = + | "credits" + | "duckets" + | "diamonds" + | "pixels" + | "points"; + +const CURRENCY_FILES: Record = { + credits: "credits", + duckets: "duckets", + diamonds: "diamonds", + // No dedicated pixels asset — activity points share the duckets icon. + pixels: "duckets", + points: "duckets", +}; + +/** Map emulator `points_type` (catalog / users_currency) to an icon. */ +export function currencyKindFromPointsType(type: number): CurrencyKind { + if (type === 5) return "diamonds"; + return "duckets"; +} + +export function currencyIconSrc(kind: CurrencyKind): string { + return `/assets/images/icons/currency/${CURRENCY_FILES[kind]}.png`; +} + +export function CurrencyIcon({ + kind, + size = 16, + className = "", + alt, +}: { + kind: CurrencyKind; + size?: number; + className?: string; + alt?: string; +}) { + return ( + // biome-ignore lint/performance/noImgElement: small pixel art asset, not Next Image optimized + {alt + ); +}