124 lines
4.0 KiB
TypeScript
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)
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|