import type { Meta, StoryObj } from "@storybook/react-vite"; import { MemoryRouter } from "react-router"; import type { BrokerageAccount } from "../../api/useBrokerageAccounts"; import { brokerageAccountCards } from "../../model/display"; import { BrokerageAccountList } from "./BrokerageAccountList"; const syntheticAccount = { id: "storybook-account", name: "Учебный брокерский счёт", openedOn: "2025-03-15", portfolioSummary: { bondPositionCount: 12, stockPositionCount: 5, totalsByCurrency: [ { currency: "RUB", value: "125000.50" }, { currency: "USD", value: "320" }, { currency: "EUR", value: "210" }, ], }, type: "BROKERAGE", } satisfies BrokerageAccount; const meta = { args: { accounts: brokerageAccountCards([syntheticAccount]) }, argTypes: { accounts: { control: false }, }, component: BrokerageAccountList, decorators: [ Story => ( ), ], parameters: { docs: { description: { component: "Карточки счетов WealthLedger со сводкой по валютам и числом наименований акций и облигаций. Используйте на экране выбора счёта; отсутствие сводки и отсутствие сумм имеют разные сообщения. Примеры содержат вымышленные данные. Ссылки меняют только локальный маршрут MemoryRouter; страница назначения в этой истории не отображается.", }, }, }, tags: ["autodocs"], title: "Product/BrokerageAccountList", } satisfies Meta; export default meta; type Story = StoryObj; export const Available: Story = { name: "Сводка по нескольким валютам", parameters: { docs: { description: { story: "Показываются первые две валюты и количество остальных. Суммы разных валют не складываются в общий итог.", }, }, }, }; export const Unavailable: Story = { args: { accounts: brokerageAccountCards([ { ...syntheticAccount, openedOn: null, portfolioSummary: null }, ]), }, name: "Сводка недоступна", parameters: { docs: { description: { story: "Счёт остаётся доступен для открытия, даже если сводка временно недоступна. Неизвестные суммы не заменяются нулём; отсутствующая дата открытия не отображается.", }, }, }, }; export const Empty: Story = { args: { accounts: brokerageAccountCards([ { ...syntheticAccount, portfolioSummary: { bondPositionCount: 0, stockPositionCount: 0, totalsByCurrency: [], }, }, ]), }, name: "Нет текущих сумм", parameters: { docs: { description: { story: "Успешно полученная пустая сводка отличается от ошибки получения данных. Карточка сохраняет название, тип счёта и переход.", }, }, }, }; export const LongName: Story = { args: { accounts: brokerageAccountCards([ { ...syntheticAccount, name: "Учебный индивидуальный инвестиционный счёт для долгосрочных накоплений", type: "INDIVIDUAL_INVESTMENT", }, ]), }, name: "Длинное название счёта", parameters: { docs: { description: { story: "Проверьте перенос длинного названия на узком экране и доступность всей карточки с клавиатуры.", }, }, }, }; export const AccountGrid: Story = { args: { accounts: brokerageAccountCards([ { ...syntheticAccount, name: "Основной", portfolioSummary: { bondPositionCount: 14, stockPositionCount: 8, totalsByCurrency: [{ currency: "RUB", value: "1256430.50" }], }, }, { ...syntheticAccount, id: "storybook-iis", name: "Долгосрочные инвестиции", portfolioSummary: { bondPositionCount: 6, stockPositionCount: 0, totalsByCurrency: [{ currency: "RUB", value: "480250" }], }, type: "INDIVIDUAL_INVESTMENT", }, ]), }, name: "Несколько счетов", }; export const UnvaluedPositions: Story = { args: { accounts: brokerageAccountCards([ { ...syntheticAccount, portfolioSummary: { bondPositionCount: 1, stockPositionCount: 2, totalsByCurrency: [], }, }, ]), }, name: "Бумаги без текущей оценки", }; export const LargeValues: Story = { args: { accounts: brokerageAccountCards([ { ...syntheticAccount, portfolioSummary: { bondPositionCount: 105, stockPositionCount: 21, totalsByCurrency: [ { currency: "RUB", value: "1234567890123456789.50" }, { currency: "USD", value: "-9876543210987654321.50" }, ], }, }, ]), }, name: "Длинные суммы", }; export const IndependentFreshness: Story = { args: { accounts: brokerageAccountCards( [ syntheticAccount, { ...syntheticAccount, id: "waiting", name: "Новый счёт", portfolioSummary: null, }, ], [ { availability: "available", completeness: "complete", dataRevision: "1", freshness: "stale", lastAttempt: { finishedAt: "2026-09-24T10:31:00Z", problems: [], startedAt: "2026-09-24T10:30:00Z", state: "failed", }, lastSuccessfulAt: "2026-09-24T10:30:00Z", resourceKey: "portfolio/storybook-account", }, { availability: "initial-loading", completeness: "incomplete", dataRevision: "0", freshness: "unknown", lastAttempt: { finishedAt: null, problems: [], startedAt: "2026-09-24T10:30:00Z", state: "running", }, lastSuccessfulAt: null, resourceKey: "portfolio/waiting", }, ], ), }, name: "Независимая свежесть и ошибка сводок", };