import { Component, inject } from '@angular/core'; import { toSignal } from '@angular/core/rxjs-interop'; import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute } from '@angular/router'; import type { GenerationTypes, PluginMessageEvent, PluginUIEvent, } from '../model'; import { filter, fromEvent, map, merge, take } from 'rxjs'; @Component({ imports: [ReactiveFormsModule], selector: 'app-root', template: `

Select a text field to replace it with a placeholder text.

`, styleUrl: './app.component.css', host: { '[attr.data-theme]': 'theme()', }, }) export class AppComponent { route = inject(ActivatedRoute); messages$ = fromEvent>(window, 'message'); initialTheme$ = this.route.queryParamMap.pipe( map((params) => params.get('theme')), filter((theme) => !!theme), take(1), ); theme = toSignal( merge( this.initialTheme$, this.messages$.pipe( filter((event) => event.data.type === 'theme'), map((event) => { return event.data.content; }), ), ), ); form = new FormGroup({ num: new FormControl(1, { nonNullable: true }), type: new FormControl('paragraphs', { nonNullable: true }), startWith: new FormControl(true, { nonNullable: true }), autoClose: new FormControl(false, { nonNullable: true }), }); constructor() { this.#sendMessage({ type: 'ready' }); } generate() { const formValue = this.form.getRawValue(); this.#sendMessage({ type: 'text', generationType: formValue.type, startWithLorem: formValue.startWith, size: formValue.num, autoClose: formValue.autoClose, }); } #sendMessage(message: PluginUIEvent) { parent.postMessage(message, '*'); } }