import { Component, inject, signal } from '@angular/core'; import { RouterLink, ActivatedRoute } from '@angular/router'; import { FormsModule } from '@angular/forms'; import { MailService } from '../../services/mail.service'; import { Message, Folder } from '../../models/mail.models'; import { DatePipe, SlicePipe } from '@angular/common'; import { map, switchMap } from 'rxjs/operators'; import { of } from 'rxjs'; @Component({ selector: 'app-inbox', standalone: true, imports: [RouterLink, FormsModule, DatePipe, SlicePipe], providers: [MailService], template: `

{{ folderName() }} {{ messages()?.length || 0 }} messages

@if (!messages() || messages().length === 0) {

No messages yet

} @else { }
@if (totalPages() > 1) {
@for (p of pageNumbers; track p) { } Page {{ page() + 1 }} of {{ totalPages() }}
}
`, styles: `` }) export default class InboxComponent { private route = inject(ActivatedRoute); private mailService = inject(MailService); messages = signal([]); folderName = signal('INBOX'); searchQuery = ''; folderId = signal(1); page = signal(0); totalPages = signal(1); pageSize = 20; constructor() { // Подписываемся на изменения folderId в queryParams this.route.queryParams.subscribe(params => { const newFolderId = params['folderId'] ? Number(params['folderId']) : 1; if (newFolderId !== this.folderId()) { this.folderId.set(newFolderId); this.loadFolderName(newFolderId); this.loadMessages(); } }); // Начальная загрузка const initialFolderId = this.route.snapshot.queryParams['folderId'] ? Number(this.route.snapshot.queryParams['folderId']) : 1; this.folderId.set(initialFolderId); this.loadFolderName(initialFolderId); this.loadMessages(); } loadFolderName(folderId: number): void { this.mailService.getFolders().subscribe({ next: (folders) => { const folder = folders.find(f => f.id === folderId); this.folderName.set(folder ? folder.name : 'INBOX'); }, error: () => this.folderName.set('INBOX') }); } loadMessages(): void { const currentFolderId = this.folderId(); const currentPage = this.page(); if (this.searchQuery.trim()) { this.mailService.searchMessages(currentFolderId, this.searchQuery.trim()).subscribe({ next: (msgs) => this.messages.set(msgs), error: () => console.error('Search failed') }); } else { this.mailService.getMessages(currentFolderId, currentPage, this.pageSize).subscribe({ next: (result) => { this.messages.set(result.content); this.totalPages.set(result.totalPages); }, error: () => console.error('Failed to load messages') }); } } goToPage(page: number): void { if (page >= 0 && page < this.totalPages()) { this.page.set(page); this.loadMessages(); } } get pageNumbers(): number[] { const pages: number[] = []; const total = this.totalPages(); const current = this.page(); const start = Math.max(0, current - 2); const end = Math.min(total - 1, current + 2); for (let i = start; i <= end; i++) { pages.push(i); } return pages; } }