import { Injectable, signal } from '@angular/core'; import { Observable } from 'rxjs'; export interface DialogRequest { title: string; message?: string; confirmLabel?: string; danger?: boolean; /** Set — the dialog asks for a text (prompt); the value is the initial text. */ input?: string; inputLabel?: string; required?: boolean; } interface OpenDialog extends DialogRequest { resolve: (value: string | null) => void; } /** One glass dialog at a time: confirm (resolves '' or null) and prompt (the text or null). */ @Injectable({ providedIn: 'root' }) export class DialogService { readonly current = signal(null); ask(request: DialogRequest): Observable { return new Observable(subscriber => { this.current()?.resolve(null); this.current.set({ ...request, resolve: value => { this.current.set(null); subscriber.next(value); subscriber.complete(); } }); }); } confirm(title: string, message: string, confirmLabel = 'Confirm', danger = false): Observable { return this.ask({ title, message, confirmLabel, danger }); } prompt(title: string, inputLabel: string, value = '', confirmLabel = 'Save'): Observable { return this.ask({ title, inputLabel, input: value, confirmLabel, required: true }); } }