import { useLocale } from '@/contexts/LocaleContext'; import { useState, useEffect, Card, Tabs, Table, Tag, Statistic, Row, Col, Spin, message, Select, Button, Tooltip, Badge, Input, Modal, Progress, Rate, Empty, Typography, Space, Divider, ShopOutlined, ThunderboltOutlined, FireOutlined, StarOutlined, SearchOutlined, RocketOutlined, DollarOutlined, PercentageOutlined, BarChartOutlined, SettingOutlined, PlayCircleOutlined, PauseCircleOutlined, CheckCircleOutlined, CloseCircleOutlined, BulbOutlined, TagOutlined, Option, Search, Title, Text, Paragraph, FC, } from '@/imports'; import type { ColumnsType } from 'antd/es/table'; interface Strategy { id: string; name: string; description: string; category: 'PRICING' | 'ADVERTISING' | 'PRODUCT_SELECTION' | 'INVENTORY' | 'LOGISTICS' | 'MARKETING'; risk_level: 'LOW' | 'MEDIUM' | 'HIGH'; price: number; billing_type: 'FREE' | 'ONE_TIME' | 'SUBSCRIPTION' | 'USAGE_BASED'; avg_roi: number; usage_count: number; success_rate: number; tags: string[]; is_active: boolean; is_featured: boolean; } interface MerchantStrategy { id: string; strategy_id: string; status: 'ACTIVE' | 'PAUSED' | 'COMPLETED' | 'FAILED'; roi_achieved: number; revenue_generated: number; activated_at: string; strategy: Strategy; } interface Recommendation { strategy: Strategy; score: number; reasons: string[]; expectedRoi: number; confidence: number; priority: 'HIGH' | 'MEDIUM' | 'LOW'; } const categoryColors: Record = { PRICING: 'blue', ADVERTISING: 'orange', PRODUCT_SELECTION: 'green', INVENTORY: 'purple', LOGISTICS: 'cyan', MARKETING: 'magenta' }; const categoryIcons: Record = { PRICING: , ADVERTISING: , PRODUCT_SELECTION: , INVENTORY: , LOGISTICS: , MARKETING: }; const riskColors: Record = { LOW: 'success', MEDIUM: 'warning', HIGH: 'error' }; const StrategyMarketplacePage: FC = () => { const { t } = useLocale(); const [loading, setLoading] = useState(true); const [activeTab, setActiveTab] = useState('marketplace'); const [categoryFilter, setCategoryFilter] = useState('all'); const [searchQuery, setSearchQuery] = useState(''); const [strategies, setStrategies] = useState([]); const [featuredStrategies, setFeaturedStrategies] = useState([]); const [trendingStrategies, setTrendingStrategies] = useState([]); const [recommendations, setRecommendations] = useState([]); const [myStrategies, setMyStrategies] = useState([]); const [selectedStrategy, setSelectedStrategy] = useState(null); const [detailModalVisible, setDetailModalVisible] = useState(false); useEffect(() => { fetchInitialData(); }, []); const fetchInitialData = async () => { setLoading(true); try { const [strategiesRes, featuredRes, trendingRes, recommendationsRes, myStrategiesRes] = await Promise.all([ fetch('/api/v1/strategy/strategies?isActive=true').then(r => r.json()), fetch('/api/v1/strategy/strategies/featured').then(r => r.json()), fetch('/api/v1/strategy/strategies/trending').then(r => r.json()), fetch('/api/v1/strategy/recommendations').then(r => r.json()), fetch('/api/v1/strategy/my-strategies').then(r => r.json()) ]); if (strategiesRes.success) setStrategies(strategiesRes.data); if (featuredRes.success) setFeaturedStrategies(featuredRes.data); if (trendingRes.success) setTrendingStrategies(trendingRes.data); if (recommendationsRes.success) setRecommendations(recommendationsRes.data); if (myStrategiesRes.success) setMyStrategies(myStrategiesRes.data); } catch (error) { message.error('Failed to load strategies'); } finally { setLoading(false); } }; const handleSearch = async (value: string) => { if (!value.trim()) { fetchInitialData(); return; } setLoading(true); try { const res = await fetch(`/api/v1/strategy/strategies/search?q=${encodeURIComponent(value)}`); const data = await res.json(); if (data.success) { setStrategies(data.data); setActiveTab('marketplace'); } } catch (error) { message.error('Search failed'); } finally { setLoading(false); } }; const handleActivateStrategy = async (strategyId: string, config?: Record) => { try { const res = await fetch(`/api/v1/strategy/strategies/${strategyId}/activate`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ config }) }); const data = await res.json(); if (data.success) { message.success('Strategy activated successfully!'); fetchInitialData(); setDetailModalVisible(false); } else { message.error(data.message || 'Failed to activate strategy'); } } catch (error) { message.error('Failed to activate strategy'); } }; const handlePauseStrategy = async (merchantStrategyId: string) => { try { const res = await fetch(`/api/v1/strategy/my-strategies/${merchantStrategyId}/pause`, { method: 'POST' }); const data = await res.json(); if (data.success) { message.success('Strategy paused'); fetchInitialData(); } else { message.error(data.message || 'Failed to pause strategy'); } } catch (error) { message.error('Failed to pause strategy'); } }; const handleResumeStrategy = async (merchantStrategyId: string) => { try { const res = await fetch(`/api/v1/strategy/my-strategies/${merchantStrategyId}/resume`, { method: 'POST' }); const data = await res.json(); if (data.success) { message.success('Strategy resumed'); fetchInitialData(); } else { message.error(data.message || 'Failed to resume strategy'); } } catch (error) { message.error('Failed to resume strategy'); } }; const showStrategyDetail = (strategy: Strategy) => { setSelectedStrategy(strategy); setDetailModalVisible(true); }; const filteredStrategies = categoryFilter === 'all' ? strategies : strategies.filter(s => s.category === categoryFilter); const renderStrategyCard = (strategy: Strategy, showActions: boolean = true) => ( showStrategyDetail(strategy)} > {strategy.name} {strategy.is_featured && } color="gold">{t('strategyMarketplace.featured')}} {t(`strategyMarketplace.categories.${strategy.category.toLowerCase()}`)} {t(`strategyMarketplace.risk.${strategy.risk_level.toLowerCase()}`)} {strategy.price === 0 ? ( {t('strategyMarketplace.price.free')} ) : ( ${strategy.price.toFixed(2)} )} {strategy.description} {t('strategyMarketplace.stats.avgRoi')}: {(strategy.avg_roi * 100).toFixed(1)}% {t('strategyMarketplace.stats.success')}: {strategy.success_rate}% {t('strategyMarketplace.stats.used')}: {strategy.usage_count} {showActions && ( )} ); const renderRecommendationCard = (rec: Recommendation) => ( showStrategyDetail(rec.strategy)} > {rec.strategy.name} {t(`strategyMarketplace.priority.${rec.priority.toLowerCase()}`)} {rec.reasons.map((reason, idx) => ( } color="processing">{reason} ))} {t('strategyMarketplace.expectedRoi')}: {(rec.expectedRoi * 100).toFixed(1)}% {t('strategyMarketplace.confidence')}: ); const myStrategiesColumns: ColumnsType = [ { title: t('strategyMarketplace.columns.strategy'), dataIndex: ['strategy', 'name'], key: 'name', render: (name: string, record) => ( {t(`strategyMarketplace.categories.${record.strategy.category.toLowerCase()}`)} {name} ) }, { title: t('strategyMarketplace.columns.status'), dataIndex: 'status', key: 'status', render: (status: string) => { const statusConfig: Record = { ACTIVE: { color: 'success', icon: }, PAUSED: { color: 'warning', icon: }, COMPLETED: { color: 'processing', icon: }, FAILED: { color: 'error', icon: } }; const config = statusConfig[status]; return {t(`strategyMarketplace.status.${status.toLowerCase()}`)}; } }, { title: t('strategyMarketplace.columns.roiAchieved'), dataIndex: 'roi_achieved', key: 'roi', render: (roi: number) => ( 0 ? '#52c41a' : '#ff4d4f' }}> {(roi * 100).toFixed(1)}% ) }, { title: t('strategyMarketplace.columns.revenueGenerated'), dataIndex: 'revenue_generated', key: 'revenue', render: (revenue: number) => `$${revenue.toFixed(2)}` }, { title: t('strategyMarketplace.columns.activated'), dataIndex: 'activated_at', key: 'activated_at', render: (date: string) => new Date(date).toLocaleDateString() }, { title: t('strategyMarketplace.columns.actions'), key: 'actions', render: (_, record) => ( {record.status === 'ACTIVE' && ( )} {record.status === 'PAUSED' && ( )} ) } ]; const renderDetailModal = () => ( {selectedStrategy?.name} {selectedStrategy?.is_featured && } color="gold">{t('strategyMarketplace.featured')}} } open={detailModalVisible} onCancel={() => setDetailModalVisible(false)} width={700} footer={[ , ]} > {selectedStrategy && ( {selectedStrategy.description} {t('strategyMarketplace.category')}: {t(`strategyMarketplace.categories.${selectedStrategy.category.toLowerCase()}`)} {t('strategyMarketplace.riskLevel')}: {t(`strategyMarketplace.risk.${selectedStrategy.risk_level.toLowerCase()}`)} {t('strategyMarketplace.price.title')}: {selectedStrategy.price === 0 ? ( {t('strategyMarketplace.price.free')} ) : ( ${selectedStrategy.price.toFixed(2)} )} ({t(`strategyMarketplace.billingType.${selectedStrategy.billing_type.toLowerCase()}`)})
{t('strategyMarketplace.tags')}: {selectedStrategy.tags.map((tag, idx) => ( }>{tag} ))}
)}
); if (loading) { return (
); } return (
<ShopOutlined /> {t('strategyMarketplace.title')} {t('strategyMarketplace.description')} } style={{ width: 300 }} onSearch={handleSearch} /> {t('strategyMarketplace.tabs.marketplace')}, children: ( <> {filteredStrategies.length === 0 ? ( ) : ( filteredStrategies.map(strategy => renderStrategyCard(strategy)) )} )}, { key: 'featured', label: {t('strategyMarketplace.tabs.featured')}, children: ( featuredStrategies.length === 0 ? ( ) : ( featuredStrategies.map(strategy => renderStrategyCard(strategy)) ) )}, { key: 'trending', label: {t('strategyMarketplace.tabs.trending')}, children: ( trendingStrategies.length === 0 ? ( ) : ( trendingStrategies.map(strategy => renderStrategyCard(strategy)) ) )}, { key: 'recommendations', label: {t('strategyMarketplace.tabs.recommendations')}, children: ( recommendations.length === 0 ? ( ) : ( recommendations.map(rec => renderRecommendationCard(rec)) ) )}, { key: 'my-strategies', label: {t('strategyMarketplace.tabs.myStrategies')}, children: ( )}, ]} /> {renderDetailModal()} ); }; export default StrategyMarketplacePage;