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


import classNames from 'classnames';
import { Button, Divider, Tooltip } from 'exchange-elements/v2';

import { Dispatch, SetStateAction, useRef, useState } from 'react';

import { MenuList } from '@src/components/Menu';
import SplitDropdown from '@src/components/SplitDropdown';

import { geometricShapes, measurementTools, trendLines } from '@src/components/Toolbar/constants';

import { DrawingsNames } from '@src/constants';
import { ensureDefined } from '@src/utils';

import {
  CrossIcon,
  EyeBrushIcon,
  HeartIcon,
  LayersIcon,
  MagnetIcon,
  PencilLockerIcon,
  RulerIcon,
  SlidersCircleIcon,
  SplineCurveIcon,
  TrashIcon,
  TypeIcon,
  UnlockIcon,
  ZoomInIcon,
} from '../Icon';

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

interface ToolbarProps {
  toggleDOM: () => void;
  addDrawing: (name: DrawingsNames) => void;
}

const implemented = {
  crosshair: true,
  lines: true,
  fib: false,
  rectangle: true,
  text: false,
  XABCD: false,
  position: true,
  icons: false,
};

export default function Toolbar({ toggleDOM, addDrawing }: ToolbarProps) {
  const [selectedLineType, setSelectedLineType] = useState<DrawingsNames>(DrawingsNames.trendLine);
  const [selectedMeasurementTool, setSelectedMeasurementTool] = useState(DrawingsNames.fixedProfile);
  const [selectedGeometricShape, setSelectedGeometricShape] = useState(DrawingsNames.rectangle);

  const toolbarRef = useRef<HTMLDivElement | null>(null);

  const createDrawingHandler = (setter: Dispatch<SetStateAction<DrawingsNames>>) => (value: DrawingsNames) => {
    setter(value);
    addDrawing(value);
  };

  const findOptionByValue = <T extends { value: string }>(options: T[], selectedValue: T['value']): T | undefined =>
    options.find((item) => item.value === selectedValue);

  const selectedTrendLineOption = findOptionByValue(trendLines, selectedLineType);
  const selectedMeasurementToolOption = findOptionByValue(measurementTools, selectedMeasurementTool);
  const selectedGeometricShapeOption = findOptionByValue(geometricShapes, selectedGeometricShape);

  return (
    <div
      ref={toolbarRef}
      className={styles.toolbar}
    >
      <div className={classNames(styles.group)}>
        {implemented.crosshair && (
          <Tooltip
            tooltipClassName={styles.tooltipHint}
            showMessageOnFocus
            label="Перекрестие"
            location="right"
          >
            <Button
              size="sm"
              className={`${styles.button} ${styles.pressed}`}
              label={<CrossIcon />}
            />
          </Tooltip>
        )}
        {implemented.lines && (
          <SplitDropdown
            anchorRef={toolbarRef}
            mainContent={ensureDefined(selectedTrendLineOption?.icon)}
            mainTooltip={ensureDefined(selectedTrendLineOption).label}
            onMainClick={() => addDrawing(selectedLineType)}
            menuTooltip="Линии тренда"
          >
            <MenuList
              mode="single"
              value={selectedLineType}
              options={trendLines}
              onClick={createDrawingHandler(setSelectedLineType)}
            />
          </SplitDropdown>
        )}
        {implemented.fib && (
          <Tooltip
            tooltipClassName={styles.tooltipHint}
            showMessageOnFocus
            label="Коррекция по Фибоначчи"
            location="right"
          >
            <Button
              size="sm"
              className={styles.button}
              onClick={() => {}}
              label={<SlidersCircleIcon />}
            />
          </Tooltip>
        )}
        {implemented.rectangle && (
          <SplitDropdown
            anchorRef={toolbarRef}
            mainContent={ensureDefined(selectedGeometricShapeOption?.icon)}
            mainTooltip={ensureDefined(selectedGeometricShapeOption).label}
            onMainClick={() => addDrawing(selectedGeometricShape)}
            menuTooltip="Геометрические фигуры"
          >
            <MenuList
              mode="single"
              value={selectedGeometricShape}
              options={geometricShapes}
              onClick={createDrawingHandler(setSelectedGeometricShape)}
            />
          </SplitDropdown>
        )}
        {implemented.text && (
          <Tooltip
            tooltipClassName={styles.tooltipHint}
            showMessageOnFocus
            label="Текст"
            location="right"
          >
            <Button
              size="sm"
              className={styles.button}
              onClick={() => {}}
              label={<TypeIcon />}
            />
          </Tooltip>
        )}
        {implemented.XABCD && (
          <Tooltip
            tooltipClassName={styles.tooltipHint}
            showMessageOnFocus
            label="Шаблон XABCD"
            location="right"
          >
            <Button
              size="sm"
              className={styles.button}
              onClick={() => {}}
              label={<SplineCurveIcon />}
            />
          </Tooltip>
        )}
        {implemented.position && (
          <SplitDropdown
            anchorRef={toolbarRef}
            mainContent={ensureDefined(selectedMeasurementToolOption?.icon)}
            mainTooltip={ensureDefined(selectedMeasurementToolOption).label}
            menuTooltip="Инструменты для измерения и прогнозирования"
            onMainClick={() => addDrawing(selectedMeasurementTool)}
          >
            <MenuList
              mode="single"
              value={selectedMeasurementTool}
              options={measurementTools}
              onClick={createDrawingHandler(setSelectedMeasurementTool)}
            />
          </SplitDropdown>
        )}
        {implemented.icons && (
          <Tooltip
            label="Значок"
            location="right"
            tooltipClassName={styles.tooltipHint}
            showMessageOnFocus
          >
            <Button
              size="sm"
              className={styles.button}
              onClick={() => {}}
              label={<HeartIcon />}
            />
          </Tooltip>
        )}
      </div>
      <Divider
        direction="horizontal"
        pt={{ divider: { className: styles.divider } }}
      />
      <div className={classNames(styles.group)}>
        <Tooltip
          tooltipClassName={styles.tooltipHint}
          showMessageOnFocus
          label="Линейка"
          location="right"
        >
          <Button
            size="sm"
            className={styles.button}
            onClick={() => addDrawing(DrawingsNames.ruler)}
            label={<RulerIcon />}
          />
        </Tooltip>

        <Tooltip
          tooltipClassName={styles.tooltipHint}
          showMessageOnFocus
          label="Увеличить масштаб"
          location="right"
          className={styles.notImplemented}
        >
          <Button
            size="sm"
            className={styles.button}
            onClick={() => {}}
            label={<ZoomInIcon />}
          />
        </Tooltip>
      </div>
      <Divider
        direction="horizontal"
        pt={{ divider: { className: classNames(styles.divider, styles.notImplemented) } }}
      />
      <div className={classNames(styles.group, styles.notImplemented)}>
        <Tooltip
          tooltipClassName={styles.tooltipHint}
          showMessageOnFocus
          label="Магнит позволяет притягивать точки объектов к ближайшим ценам (откр., макс., мин., закр.) баров"
          location="right"
        >
          <Button
            size="sm"
            className={styles.button}
            onClick={() => {}}
            label={<MagnetIcon />}
          />
        </Tooltip>

        <Tooltip
          tooltipClassName={styles.tooltipHint}
          showMessageOnFocus
          label="Продолжить в режиме рисования"
          location="right"
        >
          <Button
            size="sm"
            className={styles.button}
            onClick={() => {}}
            label={<PencilLockerIcon />}
          />
        </Tooltip>

        <Tooltip
          tooltipClassName={styles.tooltipHint}
          showMessageOnFocus
          label="Зафиксировать все объекты"
          location="right"
        >
          <Button
            size="sm"
            className={styles.button}
            onClick={() => {}}
            label={<UnlockIcon />}
          />
        </Tooltip>

        <Tooltip
          tooltipClassName={styles.tooltipHint}
          showMessageOnFocus
          label="Скрыть все объекты рисования"
          location="right"
        >
          <Button
            size="sm"
            className={styles.button}
            onClick={() => {}}
            label={<EyeBrushIcon />}
          />
        </Tooltip>
      </div>
      <Divider
        direction="horizontal"
        pt={{ divider: { className: classNames(styles.divider, styles.notImplemented) } }}
      />
      <div className={classNames(styles.group)}>
        <Tooltip
          tooltipClassName={styles.tooltipHint}
          showMessageOnFocus
          label="Удалить объекты"
          location="right"
          className={styles.notImplemented}
        >
          <Button
            size="sm"
            className={styles.button}
            onClick={() => {}}
            label={<TrashIcon />}
          />
        </Tooltip>

        <Tooltip
          tooltipClassName={styles.tooltipHint}
          showMessageOnFocus
          label="Дерево объектов"
          location="right"
        >
          <Button
            size="sm"
            className={styles.button}
            onClick={() => toggleDOM()}
            label={<LayersIcon />}
          />
        </Tooltip>
      </div>
    </div>
  );
}