import { formatDistanceToNow } from 'date-fns' import { zhCN } from 'date-fns/locale' import React from 'react' import { AiFillPushpin, AiOutlineVideoCamera } from 'react-icons/ai' import { BiImage } from 'react-icons/bi' import { FaMusic, FaTiktok, FaUserGroup } from 'react-icons/fa6' import { MdLightbulbOutline, MdLocationOn } from 'react-icons/md' import { RiUserFollowLine, RiVerifiedBadgeFill } from 'react-icons/ri' import { DefaultLayout } from '../../../components/DefaultLayout' import type { PosterProps } from '../../../types/ctx' import { DouyinCommentIcon, DouyinFavoriteIcon, DouyinLikeIcon, DouyinShareIcon } from '../../components/Icons' import type { DouyinUserVideoListData } from './types' /** * 格式化数字显示 (使用中文单位:万、亿) */ const formatCount = (count: number): string => { if (count >= 100000000) return (count / 100000000).toFixed(1) + '亿' if (count >= 10000) return (count / 10000).toFixed(1) + '万' return count.toString() } /** * 格式化视频时长显示 (如: 6:20) * @param milliseconds 毫秒数 */ const formatDuration = (milliseconds: number): string => { const seconds = Math.floor(milliseconds / 1000) const mins = Math.floor(seconds / 60) const secs = seconds % 60 return `${mins}:${secs.toString().padStart(2, '0')}` } /** * 单个视频卡片组件 */ const VideoCard: React.FC<{ video: DouyinUserVideoListData['videos'][number] }> = ({ video }) => { const titleRef = React.useRef(null) return (
{/* 视频封面 - 固定 3:4 比例 */}
{video.title} {/* 左上角索引标签 */} {video.index && (
{video.index}
)} {/* 视频/图集标签 */}
{video.is_video ? : } {video.is_video ? '视频' : '图集'}
{video.is_top && (
置顶
)}
{/* 时长标签(仅视频显示) */} {video.is_video && (
{formatDuration(video.duration)}
)} {/* 背景音乐图标 */} {video.music && (
{video.music.title}
)}
{/* 视频信息 */}
{/* 标题 */}

{video.title || '无标题'}

{/* 发布时间 */}

{formatDistanceToNow(new Date(video.create_time * 1000), { locale: zhCN, addSuffix: true })}

{/* 统计数据 */}
{formatCount(video.statistics.like_count)}
{formatCount(video.statistics.comment_count)}
{formatCount(video.statistics.collect_count)}
{formatCount(video.statistics.share_count)}
) } /** * 抖音用户视频列表页面组件 */ export const DouyinUserVideoList: React.FC> = (prpos) => { return ( {/* 头部背景图片 - 占满宽度 */} {prpos.data.user.head_image && (
头部背景 {/* 渐变遮罩 - 从图片渐变到 bg-surface */}
)}
{/* 用户信息头部 */}
{/* 上部分:头像、名称、抖音号、IP、用户统计 */}
{/* 用户头像 */} {prpos.data.user.nickname} {/* 用户信息 */}

{prpos.data.user.nickname}

{prpos.data.user.verified && }
{/* 抖音号和 IP 属地 */}
抖音号:{prpos.data.user.short_id} {prpos.data.user.ip_location && ( {prpos.data.user.ip_location} )}
{/* 用户统计 */}
关注 {formatCount(prpos.data.user.following_count)}
粉丝 {formatCount(prpos.data.user.follower_count)}
获赞 {formatCount(prpos.data.user.total_favorited)}
{/* 下部分:用户签名 */}

{prpos.data.user.signature || '这个用户很懒,还没有签名'}

{/* 提示信息卡片 */} {prpos.data.timeoutSeconds && (

请在 {prpos.data.timeoutSeconds} 秒内发送 1~{prpos.data.videos.length}{' '} 之间的数字解析对应作品。例如发送“1”解析第一个作品

)} {/* 视频网格 */} {prpos.data.videos.length > 0 ? ( <>
{prpos.data.videos.map((video) => ( ))}
) : (

暂无视频内容

)}
) }