diff --git a/frontend/components/common/redenvelope/red-envelope-claim.tsx b/frontend/components/common/redenvelope/red-envelope-claim.tsx index 58a672e1..414e4514 100644 --- a/frontend/components/common/redenvelope/red-envelope-claim.tsx +++ b/frontend/components/common/redenvelope/red-envelope-claim.tsx @@ -7,7 +7,6 @@ import { motion, AnimatePresence } from "motion/react" import { toast } from "sonner" import { Gift } from "lucide-react" import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" -import { ScrollArea } from "@/components/ui/scroll-area" import services from "@/lib/services" import { formatDateTime } from "@/lib/utils" import type { RedEnvelopeDetailResponse, RedEnvelopeClaim } from "@/lib/services" @@ -25,6 +24,12 @@ export function RedEnvelopeClaimPage({ id }: RedEnvelopeClaimProps) { const [detail, setDetail] = useState(null) const [claimedAmount, setClaimedAmount] = useState(null) const [error, setError] = useState(null) + const truncateText = (value: string | undefined, maxChars: number) => { + if (!value) return "" + const chars = Array.from(value) + if (chars.length <= maxChars) return value + return `${ chars.slice(0, maxChars).join("") }…` + } const bestClaimId = React.useMemo(() => { const claims = detail?.claims @@ -176,6 +181,12 @@ export function RedEnvelopeClaimPage({ id }: RedEnvelopeClaimProps) { } const envelope = detail?.red_envelope + const claimedCount = detail?.claims?.length ?? 0 + const totalCount = envelope?.total_count ?? claimedCount + const totalAmount = parseFloat(envelope?.total_amount || "0").toLocaleString(undefined, { + minimumFractionDigits: 2, + maximumFractionDigits: 2 + }) return (
@@ -262,24 +273,29 @@ export function RedEnvelopeClaimPage({ id }: RedEnvelopeClaimProps) {
{/* 个人信息 */} -
+
- - - + + + {envelope?.creator_username?.charAt(0).toUpperCase()} - {envelope?.creator_username} 发出的红包 +
+ + {truncateText(envelope?.creator_username, 12)} + + 发出的红包 +
{envelope?.type === 'random' && ( )}
-

{envelope?.greeting || "新年快乐,恭喜发财"}

+

{envelope?.greeting || "新年快乐,恭喜发财"}

{/* 金额区域 */} -
+
{claimedAmount ? (
@@ -290,7 +306,7 @@ export function RedEnvelopeClaimPage({ id }: RedEnvelopeClaimProps) {
) : ( -
+

手慢了,红包派完了

)} @@ -298,38 +314,48 @@ export function RedEnvelopeClaimPage({ id }: RedEnvelopeClaimProps) { {/* 列表区域 */}
-
- {detail?.claims.length || 0}个红包共{parseFloat(envelope?.total_amount || "0").toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} LDC,{ - envelope?.remaining_count === 0 ? "已被抢光" : "继续等待领取" - } +
+
+ 共 {totalAmount} LDC +
+
+ {claimedCount} + / + {totalCount} + +
- +
{detail?.claims.map((claim: RedEnvelopeClaim) => (
-
- - - +
+ + + {claim.username.charAt(0).toUpperCase()} -
- {claim.username} - +
+ + {truncateText(claim.username, 12)} + + {formatClaimedAt(claim.claimed_at)}
-
- {parseFloat(claim.amount).toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} LDC +
+ + {parseFloat(claim.amount).toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} LDC + {/* 最佳手气 */} {bestClaimId === claim.id && ( -
+
手气最佳
)} @@ -337,7 +363,7 @@ export function RedEnvelopeClaimPage({ id }: RedEnvelopeClaimProps) {
))}
- +
)}