240 lines
6.3 KiB
TypeScript
240 lines
6.3 KiB
TypeScript
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 => (
|
|
<MemoryRouter initialEntries={["/accounts"]}>
|
|
<Story />
|
|
</MemoryRouter>
|
|
),
|
|
],
|
|
parameters: {
|
|
docs: {
|
|
description: {
|
|
component:
|
|
"Карточки счетов WealthLedger со сводкой по валютам и числом наименований акций и облигаций. Используйте на экране выбора счёта; отсутствие сводки и отсутствие сумм имеют разные сообщения. Примеры содержат вымышленные данные. Ссылки меняют только локальный маршрут MemoryRouter; страница назначения в этой истории не отображается.",
|
|
},
|
|
},
|
|
},
|
|
tags: ["autodocs"],
|
|
title: "Product/BrokerageAccountList",
|
|
} satisfies Meta<typeof BrokerageAccountList>;
|
|
|
|
export default meta;
|
|
|
|
type Story = StoryObj<typeof meta>;
|
|
|
|
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: "Независимая свежесть и ошибка сводок",
|
|
};
|