life-towers/src/app/services/modal.service.ts
schmelczerandras e992152a75 Fix bugs
2019-08-25 15:49:51 +02:00

91 lines
2 KiB
TypeScript

import { Injectable } from '@angular/core';
import { Tower } from '../model/tower';
import { top } from '../utils/top';
import { CancelService } from './cancel.service';
export enum ModalType {
createBlock,
editBlock,
removeBlock,
settings,
removeTower,
removePage,
getStarted
}
interface Modal {
type: ModalType;
input: any;
resolve: (output: any) => void;
reject: () => void;
}
@Injectable({
providedIn: 'root'
})
export class ModalService {
private modalStack: Modal[] = [];
constructor(private cancelService: CancelService) {}
showCreateBlock(input: {
options: string[];
isTask: boolean;
}): Promise<{ selected: string; description: string; isDone: boolean }> {
return this.createPromiseAndPushToStack(input, ModalType.createBlock);
}
showEditBlock(data: {
default: string;
options: string[];
description: string;
isDone: boolean;
}): Promise<{ selected: string; description: string; isDone: boolean }> {
return this.createPromiseAndPushToStack(data, ModalType.editBlock);
}
showSettings(): Promise<void> {
return this.createPromiseAndPushToStack(null, ModalType.settings);
}
showRemoveTower(tower: Tower): Promise<void> {
return this.createPromiseAndPushToStack(tower, ModalType.removeTower);
}
showRemovePage(name: string): Promise<void> {
return this.createPromiseAndPushToStack(name, ModalType.removePage);
}
get active(): Modal {
return top(this.modalStack);
}
submit(output?: any) {
const { resolve } = this.modalStack.pop();
resolve(output);
}
cancel() {
const { reject } = this.modalStack.pop();
reject();
}
private createPromiseAndPushToStack(input: any, type: ModalType): Promise<any> {
this.cancelService.cancelAll();
const modal = {
input,
type,
resolve: () => {},
reject: () => {}
};
const modalPromise = new Promise((resolve, reject) => {
modal.resolve = resolve;
modal.reject = reject;
});
this.modalStack.push(modal);
return modalPromise;
}
}