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


export type ChartViewMode = 'standard' | 'seasonality';

export interface SeasonalityViewInstance {
  destroy(): void;
}

export interface OpenSeasonalityParams {
  symbolId: string;
}

interface MountSeasonalityParams extends OpenSeasonalityParams {
  onBack: () => void;
}

interface ChartViewControllerParams {
  mountSeasonality: (
    params: MountSeasonalityParams,
  ) => SeasonalityViewInstance;

  setActiveMode: (mode: ChartViewMode) => void;
}

export class ChartViewController {
  private mode: ChartViewMode = 'standard';

  private seasonalityView: SeasonalityViewInstance | null = null;

  private destroyed = false;

  constructor(
    private readonly params: ChartViewControllerParams,
  ) {}

  public openSeasonality({ symbolId }: OpenSeasonalityParams): void {
    if (this.destroyed || this.mode === 'seasonality' || !symbolId) {
      return;
    }

    const view = this.params.mountSeasonality({
      symbolId,
      onBack: this.goBack,
    });

    try {
      this.params.setActiveMode('seasonality');
    } catch (error) {
      view.destroy();
      throw error;
    }

    this.seasonalityView = view;
    this.mode = 'seasonality';
  }

  public closeSeasonality(): void {
    if (this.destroyed || this.mode !== 'seasonality') {
      return;
    }

    this.mode = 'standard';
    this.params.setActiveMode('standard');

    const view = this.seasonalityView;
    this.seasonalityView = null;

    view?.destroy();
  }

  public goBack = (): void => {
    this.closeSeasonality();
  };

  public getMode(): ChartViewMode {
    return this.mode;
  }

  public destroy(): void {
    if (this.destroyed) {
      return;
    }

    this.closeSeasonality();
    this.destroyed = true;
  }
}