import { useEffect, useState, useMemo } from 'react' import { useParams, Link } from 'react-router-dom' import { Layout, Typography, Space, Input, Radio, Card, Tag, Button, Modal, Empty, Spin, Badge, message, Descriptions, Divider, } from 'antd' import { ShopOutlined, SearchOutlined, SafetyCertificateOutlined, ThunderboltOutlined, CustomerServiceOutlined, CopyOutlined, CheckCircleOutlined, RightCircleOutlined, RocketOutlined, FireOutlined, } from '@ant-design/icons' import { fetchPublicSiteListings, formatMoney, type PublicDistributionListing, } from '../api' function formatGameName(gameName?: string): string { if (!gameName) return '' const lower = gameName.toLowerCase().trim() if ( lower === 'delta_force' || lower === 'deltaforce' || lower === 'delta' || lower.includes('delta_force') || lower.includes('delta') || gameName.includes('三角洲') ) { return '三角洲' } if (lower.includes('honor') || gameName.includes('王者')) { return '王者荣耀' } if (lower.includes('genshin') || gameName.includes('原神')) { return '原神' } if (lower.includes('cs') || lower.includes('csgo')) { return 'CS2' } return gameName } function formatLoginPlatform(platform?: string): string { if (!platform) return '' const lower = platform.toLowerCase().trim() if (lower === 'qq') return 'QQ' if (lower === 'wechat' || lower === 'wx') return '微信' if (lower === 'steam') return 'Steam' if (lower === 'epic') return 'Epic' if (lower === 'wegame') return 'WeGame' if (lower === 'mobile') return '手游端' if (lower === 'pc') return 'PC端' return platform } export default function Storefront() { const { siteCode = 'demo' } = useParams<{ siteCode: string }>() const [loading, setLoading] = useState(true) const [items, setItems] = useState([]) const [siteName, setSiteName] = useState('') const [keyword, setKeyword] = useState('') const [gameFilter, setGameFilter] = useState('all') const [sortOrder, setSortOrder] = useState<'default' | 'price_asc' | 'price_desc'>('default') const [selectedListing, setSelectedListing] = useState(null) const [csModalVisible, setCsModalVisible] = useState(false) useEffect(() => { let active = true setLoading(true) fetchPublicSiteListings(siteCode, 1, 100) .then((res) => { if (!active) return setItems(res.items || []) if (res.items && res.items.length > 0) { setSiteName(res.items[0].site_name) } }) .catch(() => { if (active) { message.error('加载分销商城商品失败,请检查站点标识') } }) .finally(() => { if (active) setLoading(false) }) return () => { active = false } }, [siteCode]) const displayName = siteName || `${siteCode.toUpperCase()} 专属分销商城` const filteredItems = useMemo(() => { let list = [...items] if (gameFilter !== 'all') { list = list.filter((i) => (i.game_name || '').toLowerCase() === gameFilter.toLowerCase()) } const kw = keyword.trim().toLowerCase() if (kw) { list = list.filter( (i) => (i.title && i.title.toLowerCase().includes(kw)) || (i.listing_no && i.listing_no.toLowerCase().includes(kw)) || (i.server_region && i.server_region.toLowerCase().includes(kw)) || (i.login_platform && i.login_platform.toLowerCase().includes(kw)) || (i.rank_level && i.rank_level.toLowerCase().includes(kw)), ) } if (sortOrder === 'price_asc') { list.sort((a, b) => a.price_cent - b.price_cent) } else if (sortOrder === 'price_desc') { list.sort((a, b) => b.price_cent - a.price_cent) } return list }, [items, gameFilter, keyword, sortOrder]) function handleCopyListingNo(no: string) { navigator.clipboard?.writeText(no) message.success(`已复制商品编号:${no}`) } function handleRentNow(listing: PublicDistributionListing) { setSelectedListing(listing) } function openMainCheckout(listing: PublicDistributionListing) { const mainHost = window.location.hostname // 默认主站前台运行在 5189 端口,生产环境通过域名反代 const mainUrl = window.location.port ? `http://${mainHost}:5189/orders/create?listing_id=${listing.listing_id}&site_code=${listing.site_code}` : `/orders/create?listing_id=${listing.listing_id}&site_code=${listing.site_code}` window.open(mainUrl, '_blank') } return ( {/* 顶部导航栏 */}
{displayName} 官方合作分销
站点标识:{siteCode} · 主站直营货源保障
{/* Hero Banner */}
} style={{ padding: '2px 10px', fontSize: 12 }}> 实时同步主站精品号源 · 一键租号 【{displayName}】精选游戏账号商城 高阶战备 · 王者段位 · 百万哈夫币 · 极速自动交接 · 押金秒退担保
秒级自动交接上号
主站资金与资产存管
租期结束秒退押金
{/* 筛选与内容主体 */} {/* 筛选栏 */}
setGameFilter(e.target.value)} buttonStyle="solid" > 全部游戏 三角洲 王者荣耀 setSortOrder(e.target.value)} size="middle" > 默认推荐 租金从低到高 租金从高到低 } allowClear value={keyword} onChange={(e) => setKeyword(e.target.value)} style={{ width: 260, background: '#0f172a', borderColor: 'rgba(255,255,255,0.1)', color: '#fff' }} />
{/* 列表区域 */} {loading ? (
) : filteredItems.length === 0 ? ( {items.length === 0 ? '当前分销站点暂无在售商品。全网新审核通过的商品会自动上架到本站货架。' : '未找到符合条件的账号商品,请更换搜索词重试。'} } /> ) : (
{filteredItems.map((item) => ( handleRentNow(item)} > {/* 卡片头部 */}
#{item.listing_no} {item.in_transaction ? ( 出租中} /> ) : ( 可租用} /> )}
{/* 账号标题 */} {item.title} {/* 标签属性 */} {formatGameName(item.game_name)} {item.server_region && ( {item.server_region} )} {item.login_platform && ( {formatLoginPlatform(item.login_platform)} )} {item.rank_level && ( {item.rank_level} )} {/* 资产特色 */} {item.haf_coin_amount > 0 && (
🪙 哈夫币:{item.haf_coin_amount.toLocaleString()}
)}
{formatMoney(item.price_cent)}
押金:{formatMoney(item.deposit_amount_cent)}
))}
)}
{/* 商品详情 & 租号下单弹窗 */} 账号租赁详情 } open={Boolean(selectedListing)} onCancel={() => setSelectedListing(null)} footer={null} width={620} destroyOnClose > {selectedListing && (
{selectedListing.title} 商品唯一编号:{selectedListing.listing_no} · 所属分销商:{selectedListing.site_name} {formatGameName(selectedListing.game_name)} {selectedListing.server_region || '全区通用'} {formatLoginPlatform(selectedListing.login_platform) || 'PC端'} {selectedListing.rank_level || '暂未定级'} {selectedListing.haf_coin_amount > 0 ? `${selectedListing.haf_coin_amount.toLocaleString()} 币` : '无'} 自动快速交接 {formatMoney(selectedListing.price_cent)} {' '} / 小时 {formatMoney(selectedListing.deposit_amount_cent)}
租号官方保障须知
  • 本账号经平台安全审核,支持密码自动交接或专属上号器直连。
  • 严禁在游戏内使用任何作弊辅助、脚本外挂,违规将扣除全部押金并封停账户。
  • 租期结束并安全下线后,系统将自动结算并全额退还押金。
)}
{/* 专属客服弹窗 */} setCsModalVisible(false)} footer={[ , ]} >
【{displayName}】专属客服通道 如有换号、上号异常、咨询租号或批量合作需求,请联系本站值班客服。
分销站点标识: {siteCode}
主站 7x24 小时技术保障支持
) }