4e35a2c855
CI/CD Pipeline / Check if frontend-only change (push) Has been skipped
CI/CD Pipeline / Frontend Lint (push) Has been skipped
CI/CD Pipeline / PR Build API Image (push) Has been skipped
CI/CD Pipeline / PR Build Web Image (push) Has been skipped
CI/CD Pipeline / PR Build Worker Image (push) Has been skipped
CI/CD Pipeline / Validate - Migration (alembic) (push) Successful in 57s
CI/CD Pipeline / Validate - Type Check (mypy) (push) Successful in 1m20s
CI/CD Pipeline / Build Staging Worker Image (push) Successful in 3m27s
CI/CD Pipeline / Frontend Unit Tests (push) Successful in 3m29s
CI/CD Pipeline / Build Staging Web Image (push) Successful in 5m12s
CI/CD Pipeline / Validate - Code Quality (push) Successful in 5m48s
CI/CD Pipeline / Integration Tests (push) Successful in 1m29s
CI/CD Pipeline / Unit Tests (push) Successful in 8m38s
CI/CD Pipeline / Build Production API Image (push) Has been skipped
CI/CD Pipeline / Build Production Web Image (push) Has been skipped
CI/CD Pipeline / Build Production Worker Image (push) Has been skipped
CI/CD Pipeline / CI Gate (push) Has been skipped
CI/CD Pipeline / Deploy Production (push) Has been skipped
CI/CD Pipeline / Production Browser E2E (push) Has been skipped
CI/CD Pipeline / Build Staging API Image (push) Successful in 12m19s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Successful in 1m6s
CI/CD Pipeline / ACR Image Cleanup (push) Successful in 36s
CI/CD Pipeline / Staging E2E Tests (push) Successful in 1m24s
CI/CD Pipeline / Staging API Integration Tests (push) Successful in 3m40s
CI/CD Pipeline / Canary Release to Production (push) Has been skipped
Co-authored-by: xiaoxia <dev@xiaoxiajianji.com> Co-committed-by: xiaoxia <dev@xiaoxiajianji.com>
53 lines
1.5 KiB
TypeScript
53 lines
1.5 KiB
TypeScript
/**
|
|
* 智能匹配卡片(Q5 简化版)
|
|
* 只展示素材缩略图、名称、时长,无匹配分数
|
|
*/
|
|
import React from "react"
|
|
import { PlayCircleOutlined, CheckCircleFilled } from "@ant-design/icons"
|
|
import type { AssetItem } from "@/api/assets"
|
|
|
|
interface SmartMatchCardProps {
|
|
asset: AssetItem
|
|
selected: boolean
|
|
onClick: () => void
|
|
formatDuration: (seconds: number) => string
|
|
}
|
|
|
|
const SmartMatchCard: React.FC<SmartMatchCardProps> = ({
|
|
asset,
|
|
selected,
|
|
onClick,
|
|
formatDuration,
|
|
}) => {
|
|
return (
|
|
<div className={`xx-smart-match-card ${selected ? "selected" : ""}`} onClick={onClick}>
|
|
{/* 缩略图 */}
|
|
<div className="xx-smart-match-thumb">
|
|
{asset.thumbnail_url ? (
|
|
<img src={asset.thumbnail_url} alt={asset.name} />
|
|
) : (
|
|
<div className="xx-smart-match-thumb-placeholder">
|
|
<PlayCircleOutlined style={{ fontSize: 32, opacity: 0.5 }} />
|
|
</div>
|
|
)}
|
|
{selected && (
|
|
<div className="xx-smart-match-check">
|
|
<CheckCircleFilled style={{ fontSize: 20, color: "#fff" }} />
|
|
</div>
|
|
)}
|
|
{asset.duration && (
|
|
<div className="xx-smart-match-duration">{formatDuration(asset.duration)}</div>
|
|
)}
|
|
</div>
|
|
{/* 名称 */}
|
|
<div className="xx-smart-match-info">
|
|
<div className="xx-smart-match-name" title={asset.name}>
|
|
{asset.name}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
export default SmartMatchCard
|