Skip to content

Commit 45dd237

Browse files
committed
Refactor LanguageSelectionComponent to use Angular signals and effects
1 parent 000450d commit 45dd237

2 files changed

Lines changed: 41 additions & 32 deletions

File tree

.github/copilot-instructions.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
This is an Angular 19 project, make sure to always use signals and effects. Also always use most modern TypeScript, with async/await.
2+
3+
Make sure to use new flow syntax of latest Angular, which is @if instead of *ngIf, @for instead of *ngFor, and @let instead of *ngLet.

src/app/pages/language-selection/language-selection.component.ts

Lines changed: 38 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,37 @@
1-
import { Component, OnInit, AfterViewInit } from '@angular/core';
1+
import { Component, signal, effect, DestroyRef, inject } from '@angular/core';
22
import { RouterLink } from '@angular/router';
33
import { CommonModule } from '@angular/common';
44
import { LanguageService, Language } from '../../services/language.service';
55
import { trigger, style, animate, transition, query, stagger } from '@angular/animations';
6+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
67

78
@Component({
89
selector: 'app-language-selection',
910
standalone: true,
1011
imports: [CommonModule, RouterLink],
1112
template: `
12-
1313
<script type="text/javascript">
1414
aclib.runInterstitial({
1515
zoneId: '9197070',
1616
});
1717
</script>
1818
1919
<section class="languages">
20-
<div class="grid" [@listAnimation]="languages.length">
21-
<div
22-
*ngFor="let language of languages"
23-
class="card language-card"
24-
[routerLink]="['/learn', fromLanguageCode, language.code, 'words']"
25-
(click)="onLanguageSelect()"
26-
>
27-
<img
28-
[src]="language.flagImage"
29-
[alt]="language.name + ' flag'"
30-
class="flag-image"
31-
/>
32-
<h2>{{ language.name }}</h2>
33-
</div>
20+
<div class="grid" [@listAnimation]="languages().length">
21+
@for (language of languages(); track language.code) {
22+
<div
23+
class="card language-card"
24+
[routerLink]="['/learn', fromLanguageCode(), language.code, 'words']"
25+
(click)="onLanguageSelect()"
26+
>
27+
<img
28+
[src]="language.flagImage"
29+
[alt]="language.name + ' flag'"
30+
class="flag-image"
31+
/>
32+
<h2>{{ language.name }}</h2>
33+
</div>
34+
}
3435
</div>
3536
</section>
3637
`,
@@ -118,30 +119,35 @@ import { trigger, style, animate, transition, query, stagger } from '@angular/an
118119
`,
119120
],
120121
})
121-
export class LanguageSelectionComponent implements OnInit, AfterViewInit {
122-
languages: Language[];
123-
fromLanguageCode: string = 'en';
122+
export class LanguageSelectionComponent {
123+
private readonly languageService = inject(LanguageService);
124+
private readonly destroyRef = inject(DestroyRef);
125+
126+
// Constants
124127
private readonly FROM_LANGUAGE_KEY = 'polytalk-from-language';
125128
private readonly TO_LANGUAGE_KEY = 'polytalk-to-language';
129+
130+
// Convert properties to signals
131+
languages = signal<Language[]>([]);
132+
fromLanguageCode = signal<string>('en');
126133

127-
128-
constructor(private languageService: LanguageService) {
129-
this.languages = this.languageService.getLanguages();
130-
}
131-
132-
ngOnInit() {
133-
// Load saved from language, default to 'en' if not found
134+
constructor() {
135+
// Initialize languages signal
136+
this.languages.set(this.languageService.getLanguages());
137+
138+
// Initialize from language signal from localStorage
134139
const savedFromLanguage = localStorage.getItem(this.FROM_LANGUAGE_KEY);
135140
if (savedFromLanguage) {
136-
this.fromLanguageCode = savedFromLanguage;
141+
this.fromLanguageCode.set(savedFromLanguage);
137142
}
143+
144+
// Setup page initialization effect (replaces ngAfterViewInit)
145+
effect(() => {
146+
window.scrollTo(0, 0);
147+
});
138148
}
139149

140-
ngAfterViewInit() {
141-
window.scrollTo(0, 0);
142-
}
143-
144-
onLanguageSelect() {
150+
onLanguageSelect(): void {
145151
window.scrollTo(0, 0);
146152
}
147153
}

0 commit comments

Comments
 (0)