Загрузка данных


import {
  ChartSeriesType,
  Intervals,
  IntervalsToTimeframe,
  SymbolInfo,
  SymbolInfoInput,
  TimeFormat,
} from '@src/types';
import { Timeframes } from '@src/types/timeframes';
import { DateFormat, normalizeSymbolInfo } from '@src/utils';

export interface ChartSettings {
  symbolInfo: SymbolInfo;
  timeframe: Timeframes;
  seriesSelected: ChartSeriesType;
  timeFormat: TimeFormat;
  dateFormat: DateFormat;
  interval: Intervals | null;
}

export type ChartSettingsSourceObject = Omit<Partial<ChartSettings>, 'symbolInfo'> & {
  symbolInfo?: SymbolInfoInput;
};

export type ChartSettingsSource = ChartSettingsSourceObject | string;

function parseJsonIfString(value: unknown): unknown {
  if (typeof value !== 'string') {
    return value;
  }

  try {
    return JSON.parse(value);
  } catch {
    return undefined;
  }
}

function asPlainObject(value: unknown): Record<string, unknown> | undefined {
  if (typeof value !== 'object' || value === null || Array.isArray(value)) {
    return undefined;
  }

  return value as Record<string, unknown>;
}

function asString(value: unknown): string | undefined {
  return typeof value === 'string' ? value : undefined;
}

function asSymbolInfo(value: unknown): SymbolInfo | undefined {
  const symbolInfoObject = asPlainObject(value);

  if (!symbolInfoObject) {
    return undefined;
  }

  const symbolId = asString(symbolInfoObject.symbolId);

  if (symbolId === undefined) {
    return undefined;
  }

  return normalizeSymbolInfo({
    symbolId,
    symbol: asString(symbolInfoObject.symbol),
    symbolName: asString(symbolInfoObject.symbolName),
  });
}

function asInterval(value: unknown): Intervals | null | undefined {
  if (value === null) {
    return null;
  }

  const intervalString = asString(value);

  if (intervalString === undefined) {
    return undefined;
  }

  return intervalString in IntervalsToTimeframe ? (intervalString as Intervals) : undefined;
}

export function parseChartSettings(value: unknown): Partial<ChartSettings> {
  const parsedValue = parseJsonIfString(value);
  const settingsObject = asPlainObject(parsedValue);

  if (!settingsObject) {
    return {};
  }

  return {
    symbolInfo: asSymbolInfo(settingsObject.symbolInfo),
    timeframe: asString(settingsObject.timeframe) as Timeframes | undefined,
    seriesSelected: asString(settingsObject.seriesSelected) as ChartSeriesType | undefined,
    timeFormat: asString(settingsObject.timeFormat) as TimeFormat | undefined,
    dateFormat: asString(settingsObject.dateFormat) as DateFormat | undefined,
    interval: asInterval(settingsObject.interval),
  };
}