feat: добавить уровень риска для крипто-холдингов

Риск (низкий/средний/высокий) задаётся при добавлении монеты и
редактируется прямо в таблице холдингов. Добавлена вкладка "Уровни
риска" в карточке портфеля с разбивкой % по риск-тирам, только для
крипты. Заодно поправлено округление процентов в риск-карточках.
This commit is contained in:
ZProger
2026-09-08 21:46:09 +03:00
parent e4b163df21
commit fcbd217915
13 changed files with 335 additions and 47 deletions

View File

@@ -17,10 +17,11 @@ import {
useCryptoPortfolios,
useDeleteCryptoHolding,
useRefreshCryptoPrices,
useUpdateCryptoHoldingRisk,
} from "@/hooks/useCrypto";
import { getIntlLocale } from "@/lib/format";
import { useTranslation } from "@/lib/i18n";
import type { CryptoHolding, CryptoPortfolio, CryptoRange, CryptoTransaction } from "@/types";
import type { CryptoHolding, CryptoPortfolio, CryptoRange, CryptoTransaction, RiskLevel } from "@/types";
function formatSyncedAt(iso: string): string {
return new Intl.DateTimeFormat(getIntlLocale(), { dateStyle: "medium", timeStyle: "short" }).format(new Date(iso));
@@ -44,6 +45,7 @@ export function CryptoPage() {
const { data: performance90d, isLoading: isPerformance90dLoading } = useCrypto90dPerformance(range, portfolioFilter);
const refresh = useRefreshCryptoPrices();
const deleteHolding = useDeleteCryptoHolding();
const updateRisk = useUpdateCryptoHoldingRisk();
const [addOpen, setAddOpen] = useState(false);
const [editingPortfolio, setEditingPortfolio] = useState<CryptoPortfolio | null>(null);
@@ -80,6 +82,10 @@ export function CryptoPage() {
}
}
function handleRiskChange(holding: CryptoHolding, riskLevel: RiskLevel) {
updateRisk.mutate({ assetId: holding.asset_id, riskLevel });
}
function handleEditTransaction(transaction: CryptoTransaction) {
setEditingTransaction(transaction);
setTradingHolding(historyHolding);
@@ -160,6 +166,7 @@ export function CryptoPage() {
onTrade={openTradeModal}
onViewHistory={setHistoryHolding}
onDelete={handleDelete}
onRiskChange={handleRiskChange}
portfoliosById={portfolioFilter === null ? portfoliosById : undefined}
/>
</>