import { FormGroup, FormControl } from '@angular/forms'; import { Observable, BehaviorSubject } from 'rxjs'; import { storage } from 'firebase/app'; export type TranslationFactory = (...args: any[]) => Observable; export interface PersistenceService { readonly value$: Observable; readonly saving$: BehaviorSubject; resume(): void; restore(page: string, group: FormGroup): Promise; save(page: string, group: FormGroup, answersToDelete: string[], finished?: boolean): Promise; // TODO(jamesdaniels) generalize so it's not Firebase specific upload(file: File): Observable } export interface PersistedDate { year: number, day: number, month: number } interface DependentValidations { greaterThan?: number|PersistedDate, lessThan?: number|PersistedDate, equals?: any, notEquals?: any, regexp?: string, } type ControlTypes = 'checkbox'|'date'|'select'|'radio'|'email'|'number'|'password'|'tel'|'text'|'file'|undefined; interface BaseManifestSettings { page: string, required?: boolean, type: ControlTypes, confirmationOf?: string, dependentOn?: [string, DependentValidations?][]; } interface CheckboxManifest extends BaseManifestSettings { type: 'checkbox', default?: boolean, } interface DateManifest extends BaseManifestSettings { type: 'date', min?: PersistedDate, max?: PersistedDate, default?: PersistedDate, placeholder?: string, } interface SelectManifest extends BaseManifestSettings { type: 'select'|'radio', regexp?: string, options?: Array, min?: number, max?: number, default?: any, } interface NumberManifest extends BaseManifestSettings { type: 'number', min?: number, max?: number, default?: number, } interface FileManifest extends BaseManifestSettings { type: 'file', acceptedTypes?: string } interface StringManifest extends BaseManifestSettings { type: 'email'|'password'|'tel'|'text'|undefined, regexp?: string, minLength?: number, maxLength?: number, default?: string, } export interface TableOfContentsStrict extends Array<[ string, CheckboxManifest | DateManifest | SelectManifest | NumberManifest | StringManifest | FileManifest ]> { } // TODO figure out how to type this best type ManifestSettings = CheckboxManifest & DateManifest & SelectManifest & NumberManifest & StringManifest & FileManifest; export interface TableOfContents extends Array<[string, ManifestSettings]> {} export type FormControls = { [key:string]: FormControl|FormGroup };