/
githubmirror
/
ydb-embedded-ui
Обзор
Документация
Войти
/
githubmirror
/
ydb-embedded-ui
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/components/InfoViewer/utils.ts
57 строк
2 KB
Valerii Sidorenko
feat!: update to uikit 6 (#789)
10 апр 2024, 16:48
Не верифицирован
10 апр 2024, 16:48
1a3154d
Код
Авторство
О чём код?
import type React from 'react'; import type {InfoViewerItem} from './InfoViewer'; type LabelMap<T> = { [label in keyof T]?: string; }; type ValueFormatters<T> = { [label in keyof T]?: (value: T[label]) => React.ReactNode; }; function formatLabel<Shape>(label: keyof Shape, map: LabelMap<Shape>) { return map[label] ?? label; } function formatValue<Shape, Key extends keyof Shape>( label: Key, value: Shape[Key], formatters: ValueFormatters<Shape>, defaultFormatter?: (value: Shape[Key]) => React.ReactNode, ) { const formatter = formatters[label] || defaultFormatter; const formattedValue = formatter ? formatter(value) : value; return formattedValue; } interface CreateInfoFormatterOptions<Shape> { values?: ValueFormatters<Shape>; labels?: LabelMap<Shape>; defaultValueFormatter?: (value: Shape[keyof Shape]) => React.ReactNode; } export function createInfoFormatter<Shape extends Record<string, any>>({ values: valueFormatters, labels: labelMap, defaultValueFormatter, }: CreateInfoFormatterOptions<Shape>) { return <Key extends keyof Shape>(label: Key, value: Shape[Key]) => ({ label: formatLabel(label, labelMap || {}), value: formatValue(label, value, valueFormatters || {}, defaultValueFormatter), }); } export const formatObject = <Shape extends Record<string, any>>( formatter: <Key extends keyof Shape>(value: Key, label: Shape[Key]) => InfoViewerItem, obj?: Partial<Shape>, ): InfoViewerItem[] => { if (!obj) { return []; } return Object.entries(obj) .map(([label, value]) => formatter(label, value)) .filter(({value}) => Boolean(value)); };