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;
}
}