import {ChangeDetectionStrategy, Component, inject, OnInit, signal, computed} from '@angular/core'; import {CommonModule} from '@angular/common'; import {MatIconModule} from '@angular/material/icon'; import {RouterModule, Router} from '@angular/router'; import {ReactiveFormsModule, FormBuilder, FormGroup, Validators, FormControl} from '@angular/forms'; import {GroupService} from '../../services/group'; import {UserService} from '../../services/user'; import {User, Group} from '../../models/data.models'; import {debounceTime, distinctUntilChanged, switchMap, of} from 'rxjs'; @Component({ selector: 'app-create-group', standalone: true, imports: [CommonModule, MatIconModule, RouterModule, ReactiveFormsModule], templateUrl: './create-group.html', styleUrl: './create-group.css', changeDetection: ChangeDetectionStrategy.OnPush, }) export class CreateGroup implements OnInit { private fb = inject(FormBuilder); private router = inject(Router); private groupService = inject(GroupService); private userService = inject(UserService); groupForm: FormGroup = this.fb.group({ name: ['', [Validators.required]], description: [''], isPrivate: [false], avatarUrl: ['https://picsum.photos/seed/avatar/200/200'] }); searchControl = new FormControl(''); searchResults = signal([]); selectedMembers = signal([]); groupAvatar = computed(() => this.groupForm.get('avatarUrl')?.value); isEditing = false; editingId: number | null = null; ngOnInit() { // Ricerca utenti per i membri this.searchControl.valueChanges.pipe( debounceTime(300), distinctUntilChanged(), switchMap(query => { if (!query || query.length < 2) return of([]); return this.userService.searchUsers(query); }) ).subscribe(users => { this.searchResults.set(users); }); const navigation = this.router.getCurrentNavigation(); const state = navigation?.extras.state as { group: Group }; const historyState = typeof window !== 'undefined' ? window.history.state as { group?: Group } : null; const group = state?.group || historyState?.group; if (group) { this.isEditing = true; this.editingId = group.id; this.groupForm.patchValue({ name: group.name, description: group.description, isPrivate: group.isPrivate, avatarUrl: group.avatarUrl }); if (group.members) { this.selectedMembers.set(group.members); } } } addMember(user: User) { if (!this.selectedMembers().find(m => m.id === user.id)) { this.selectedMembers.update(prev => [...prev, user]); } this.searchControl.setValue(''); this.searchResults.set([]); } removeMember(userId: string) { this.selectedMembers.update(prev => prev.filter(m => m.id !== userId)); } onSubmit() { if (this.groupForm.valid) { const formValue = this.groupForm.value; const memberIds = this.selectedMembers().map(m => m.id); const payload = { name: formValue.name, description: formValue.description, isPrivate: formValue.isPrivate, avatarUrl: formValue.avatarUrl, members: memberIds }; if (this.isEditing && this.editingId) { this.groupService.updateGroup(this.editingId, payload).subscribe({ next: () => this.router.navigate(['/groups']), error: (err) => console.error('Error updating group:', err) }); } else { this.groupService.createGroup(payload).subscribe({ next: () => this.router.navigate(['/groups']), error: (err) => console.error('Error creating group:', err) }); } } } }