import { useState } from 'react'; import { useParams, Link } from 'react-router-dom'; import { usePortfolio, usePortfolioMutations, usePositionMutations, } from '../../entities/portfolio'; import { PortfolioForm } from '../../widgets/portfolio-form'; import { PortfolioSummary } from '../../widgets/portfolio-summary'; import { AnalyticsSummary } from '../../widgets/portfolio-analytics'; import { SharePositionTable } from '../../widgets/share-positions-table'; import { BondPositionTable } from '../../widgets/bond-positions-table'; export function PortfolioDetailPage() { const { id } = useParams<{ id: string }>(); const portfolioId = parseInt(id!, 10); const { data: portfolio, isLoading, error } = usePortfolio(portfolioId); const { update, remove } = usePortfolioMutations(); const { update: updatePosition, remove: removePosition, add: addPosition, } = usePositionMutations(portfolioId); const [editing, setEditing] = useState(false); const [showAddForm, setShowAddForm] = useState(false); const [newSecid, setNewSecid] = useState(''); const [newQty, setNewQty] = useState('1'); const [newPrice, setNewPrice] = useState(''); const [newDate, setNewDate] = useState(new Date().toISOString().split('T')[0]); if (isLoading) { return (
Загрузка...
); } if (error || !portfolio) { return (
Ошибка загрузки портфеля
); } async function handleDelete() { if (window.confirm('Удалить портфель и все позиции?')) { remove.mutate(portfolioId); } } function handleAddPosition() { if (!newSecid.trim() || !parseInt(newQty, 10)) return; addPosition.mutate( { secid: newSecid.trim().toUpperCase(), quantity: parseInt(newQty, 10), buyPrice: newPrice ? parseFloat(newPrice) : undefined, buyDate: newDate || undefined, }, { onSuccess: () => { setShowAddForm(false); setNewSecid(''); setNewQty('1'); setNewPrice(''); }, }, ); } return (
← К списку

{portfolio.name}

{editing && (

Редактировать портфель

update.mutate({ id: portfolioId, data: d })} onCancel={() => setEditing(false)} isLoading={update.isPending} />
)} {portfolio.analytics && }

Позиции

{showAddForm && (
setNewSecid(e.target.value)} placeholder="SBER" style={{ padding: '8px 12px', border: '1px solid #e0e0e0', borderRadius: 'var(--border-radius)', fontSize: 14, width: 120, }} />
setNewQty(e.target.value)} style={{ padding: '8px 12px', border: '1px solid #e0e0e0', borderRadius: 'var(--border-radius)', fontSize: 14, width: 100, }} />
setNewPrice(e.target.value)} placeholder="0.00" style={{ padding: '8px 12px', border: '1px solid #e0e0e0', borderRadius: 'var(--border-radius)', fontSize: 14, width: 120, }} />
setNewDate(e.target.value)} style={{ padding: '8px 12px', border: '1px solid #e0e0e0', borderRadius: 'var(--border-radius)', fontSize: 14, width: 150, }} />
)} p.type === 'share')} onUpdatePosition={(positionId, data) => updatePosition.mutate({ positionId, data })} onDeletePosition={(positionId) => { if (window.confirm('Удалить позицию?')) removePosition.mutate(positionId); }} /> p.type === 'bond')} onUpdatePosition={(positionId, data) => updatePosition.mutate({ positionId, data })} onDeletePosition={(positionId) => { if (window.confirm('Удалить позицию?')) removePosition.mutate(positionId); }} />
); }