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


import { ChangeEventHandler, useRef } from 'react';
import { Flex } from 'exchange-elements/v2';

import { MaIndicatorSettings, MaSource } from '@src/core/Indicators/settings';

import styles from './index.module.scss';

interface IndicatorSettingsModalProps {
  initialSettings: MaIndicatorSettings;
  onSettingsChange?: (settings: MaIndicatorSettings) => void;
}

const sourceOptions: { label: string; value: MaSource }[] = [
  { label: 'Цена открытия', value: 'open' },
  { label: 'Максимум', value: 'high' },
  { label: 'Минимум', value: 'low' },
  { label: 'Цена закрытия', value: 'close' },
];

export function IndicatorSettingsModal({
  initialSettings,
  onSettingsChange,
}: IndicatorSettingsModalProps) {
  const draftSettingsRef = useRef<MaIndicatorSettings>({ ...initialSettings });

  const updateDraftSettings = (patch: Partial<MaIndicatorSettings>): void => {
    draftSettingsRef.current = {
      ...draftSettingsRef.current,
      ...patch,
    };

    onSettingsChange?.({ ...draftSettingsRef.current });
  };

  const handleLengthChange: ChangeEventHandler<HTMLInputElement> = (event) => {
    const normalizedValue = event.currentTarget.value.replace(/[^\d]/g, '');
    const nextLength = Number(normalizedValue);

    updateDraftSettings({
      length: Number.isFinite(nextLength) && nextLength > 0 ? nextLength : 1,
    });
  };

  const handleOffsetChange: ChangeEventHandler<HTMLInputElement> = (event) => {
    const normalizedValue = event.currentTarget.value.replace(/[^\d-]/g, '');
    const nextOffset = Number(normalizedValue);

    updateDraftSettings({
      offset: Number.isFinite(nextOffset) ? nextOffset : 0,
    });
  };

  const handleSourceChange: ChangeEventHandler<HTMLSelectElement> = (event) => {
    updateDraftSettings({
      source: event.currentTarget.value as MaSource,
    });
  };

  return (
    <Flex
      direction="column"
      divider={null}
      spacing="0500"
      wrap="nowrap"
    >
      <label className={styles.field}>
        <span className={styles.label}>Длина</span>
        <input
          className={styles.input}
          type="text"
          defaultValue={String(initialSettings.length)}
          onChange={handleLengthChange}
        />
      </label>

      <label className={styles.field}>
        <span className={styles.label}>Данные</span>
        <select
          className={styles.select}
          defaultValue={initialSettings.source}
          onChange={handleSourceChange}
        >
          {sourceOptions.map((option) => (
            <option
              key={option.value}
              value={option.value}
            >
              {option.label}
            </option>
          ))}
        </select>
      </label>

      <label className={styles.field}>
        <span className={styles.label}>Отступ</span>
        <input
          className={styles.input}
          type="text"
          defaultValue={String(initialSettings.offset)}
          onChange={handleOffsetChange}
        />
      </label>
    </Flex>
  );
}