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: `
`,
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, '*');
}
}