Files
ScommettiApp/frontend-angular/src/app/components/create-bet/create-bet.ts
T

124 lines
4.0 KiB
TypeScript

import {ChangeDetectionStrategy, Component, inject, OnInit, signal} 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 {BetService} from '../../services/bet';
import {UserService} from '../../services/user';
import {GroupService} from '../../services/group';
import {User, Group, CreateBetPayload, BetParticipant} from '../../models/data.models';
import {debounceTime, distinctUntilChanged, switchMap, of} from 'rxjs';
@Component({
selector: 'app-create-bet',
standalone: true,
imports: [CommonModule, MatIconModule, RouterModule, ReactiveFormsModule],
templateUrl: './create-bet.html',
styleUrl: './create-bet.css',
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class CreateBet implements OnInit {
private fb = inject(FormBuilder);
private router = inject(Router);
private betService = inject(BetService);
private userService = inject(UserService);
private groupService = inject(GroupService);
betForm: FormGroup = this.fb.group({
title: ['', [Validators.required]],
description: [''],
stake: ['10.00', [Validators.required]],
isPublic: [true],
groupId: [''],
});
searchControl = new FormControl('');
searchResults = signal<User[]>([]);
selectedParticipants = signal<User[]>([]);
availableGroups = signal<Group[]>([]);
isEditing = false;
editingId: string | null = null;
ngOnInit() {
// Carica gruppi disponibili
this.groupService.getGroups().subscribe(groups => {
this.availableGroups.set(groups);
});
// Ricerca utenti
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 { bet: any }; // Usiamo any per flessibilità durante la transizione
const historyState = typeof window !== 'undefined' ? window.history.state as { bet?: any } : null;
const bet = state?.bet || historyState?.bet;
if (bet) {
this.isEditing = true;
this.editingId = bet.id;
this.betForm.patchValue({
title: bet.title,
description: bet.description,
stake: bet.stake,
isPublic: bet.isPublic,
groupId: bet.groupId
});
// Nota: i partecipanti dovrebbero essere popolati se il backend li ritorna come oggetti User
}
}
addParticipant(user: User) {
if (!this.selectedParticipants().find(p => p.id === user.id)) {
this.selectedParticipants.update(prev => [...prev, user]);
}
this.searchControl.setValue('');
this.searchResults.set([]);
}
removeParticipant(userId: string) {
this.selectedParticipants.update(prev => prev.filter(p => p.id !== userId));
}
onSubmit() {
if (this.betForm.valid) {
const formValue = this.betForm.value;
const participants: BetParticipant[] = this.selectedParticipants().map(user => ({
user: user.id,
role: 'PARTICIPANT'
}));
const payload: CreateBetPayload = {
title: formValue.title,
description: formValue.description,
stake: formValue.stake,
isPublic: formValue.isPublic,
groupId: formValue.groupId || undefined,
participants: participants
};
if (this.isEditing && this.editingId) {
this.betService.updateBet(this.editingId, payload).subscribe({
next: () => this.router.navigate(['/']),
error: (err) => console.error('Error updating bet:', err)
});
} else {
this.betService.createBet(payload).subscribe({
next: () => this.router.navigate(['/']),
error: (err) => console.error('Error creating bet:', err)
});
}
}
}
}