import type { ChangeEvent, FC } from "react"; import { Alert, Anchor, Avatar, Badge, Button, Card, Fieldset, Group, NumberInput, Pagination, Select, SimpleGrid, Stack, Text, TextInput, Title, } from "@mantine/core"; import { useTranslation } from "react-i18next"; import { Link } from "react-router"; import { formatSnapshotTime, instrumentLogoUrl } from "@/shared/lib"; import type { Criteria, StocksPageVm } from "./StocksPage.vm"; import { useStocksPagePresentationVm } from "./StocksPagePresentation.vm"; type CriteriaField = { label: keyof Criteria; options?: readonly string[]; type?: "number"; }; type StockCardProps = { item: StocksPageVm["items"][number] }; type StockCriteriaFieldProps = { criteria: Criteria; field: CriteriaField; onChange: (name: keyof Criteria, value: string) => void; }; type StocksPageViewProps = { vm: StocksPageVm }; const criteriaFields: CriteriaField[] = [ { label: "query" }, { label: "sector", options: [ "consumer", "energy", "financial", "health_care", "industrials", "it", "materials", "real_estate", "telecom", "utilities", ], }, { label: "shareType", options: [ "SHARE_TYPE_ADR", "SHARE_TYPE_COMMON", "SHARE_TYPE_GDR", "SHARE_TYPE_PREFERRED", ], }, { label: "currency", options: ["RUB", "USD", "EUR", "CNY", "HKD", "TRY"] }, { label: "realExchange", options: [ "REAL_EXCHANGE_MOEX", "REAL_EXCHANGE_RTS", "REAL_EXCHANGE_OTC", "REAL_EXCHANGE_DEALER", ], }, { label: "countryOfRisk", options: ["RU", "US", "CN", "KZ", "HK", "TR"] }, { label: "maxLot", type: "number" }, ]; function numberChange( field: keyof Criteria, onChange: StockCriteriaFieldProps["onChange"], ) { return (value: number | string) => onChange(field, String(value)); } function selectChange( field: keyof Criteria, onChange: StockCriteriaFieldProps["onChange"], ) { return (value: null | string) => onChange(field, value ?? ""); } function selectOptions(field: CriteriaField, translate: ReturnType["t"]) { return field.options?.map(value => ({ label: translate(`stock.screener.options.${field.label}.${value}`, { defaultValue: value, }), value, })); } function textChange( field: keyof Criteria, onChange: StockCriteriaFieldProps["onChange"], ) { return (event: ChangeEvent) => onChange(field, event.currentTarget.value); } const StockCriteriaField: FC = (props) => { const { criteria, field, onChange } = props; const { t } = useTranslation(); const options = selectOptions(field, t); if (field.type === "number") return ( ); if (options) return (