You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
157 lines
4.0 KiB
157 lines
4.0 KiB
import { CommonModule, NgIf } from '@angular/common';
|
|
import { Component, OnInit } from '@angular/core';
|
|
import {
|
|
FormBuilder,
|
|
FormControl,
|
|
FormGroup,
|
|
ReactiveFormsModule,
|
|
} from '@angular/forms';
|
|
import {
|
|
ActivatedRoute,
|
|
NavigationEnd,
|
|
Router,
|
|
RouterLink,
|
|
} from '@angular/router';
|
|
import {
|
|
catchError,
|
|
debounceTime,
|
|
distinctUntilChanged,
|
|
of,
|
|
switchMap,
|
|
} from 'rxjs';
|
|
import { Pin } from '../../model/Pin';
|
|
import { LocalStorageService } from '../../services/local-storage/local-storage.service';
|
|
import { PinService } from '../../services/pin/pin.service';
|
|
import { AddPinPopupComponent } from '../add-pin-popup/add-pin-popup.component';
|
|
import { FriendPageComponent } from '../friend-page/friend-page.component';
|
|
|
|
@Component({
|
|
selector: 'app-navbar',
|
|
imports: [
|
|
AddPinPopupComponent,
|
|
NgIf,
|
|
FriendPageComponent,
|
|
CommonModule,
|
|
ReactiveFormsModule,
|
|
RouterLink,
|
|
],
|
|
templateUrl: './navbar.component.html',
|
|
})
|
|
export class NavbarComponent implements OnInit {
|
|
showTimeline: boolean = false;
|
|
|
|
isSearchOpen: boolean = false;
|
|
isNavbarOpen: boolean = false;
|
|
|
|
toggleNavbar() {
|
|
this.isNavbarOpen = !this.isNavbarOpen;
|
|
this.isSearchOpen = false;
|
|
}
|
|
|
|
toggleSearch() {
|
|
this.isSearchOpen = !this.isSearchOpen;
|
|
this.isNavbarOpen = false;
|
|
}
|
|
|
|
pins: Pin[] = [];
|
|
pinsFiltered: Pin[] = [];
|
|
inputFocus: Boolean = false;
|
|
searchForm: FormGroup;
|
|
|
|
constructor(
|
|
private router: Router,
|
|
private route: ActivatedRoute,
|
|
private localStorageService: LocalStorageService,
|
|
private pinService: PinService,
|
|
private fb: FormBuilder
|
|
) {
|
|
this.searchForm = this.fb.group({
|
|
searchControl: new FormControl(''),
|
|
});
|
|
}
|
|
|
|
ngOnInit(): void {
|
|
this.pins = this.pinService.getPins().subscribe((pins: Pin[]) => {
|
|
this.pins = pins;
|
|
});
|
|
|
|
this.showTimeline = this.router.url !== '/timeline' && this.router.url !== '/';
|
|
this.router.events.subscribe((event) => {
|
|
if (event instanceof NavigationEnd) {
|
|
this.showTimeline = event.url !== '/timeline' && this.router.url !== '/';
|
|
}
|
|
});
|
|
|
|
// Initialise la barre de recherche avec debounce et distinctUntilChanged
|
|
this.searchForm
|
|
.get('searchControl')
|
|
?.valueChanges.pipe(
|
|
debounceTime(300), // Attendre 300ms après la dernière frappe
|
|
distinctUntilChanged(), // Ignorer si la nouvelle valeur est la même que la précédente
|
|
switchMap((searchTerm) => {
|
|
const trimmedQuery = searchTerm?.trim();
|
|
if (trimmedQuery && trimmedQuery.length > 1) {
|
|
return of(this.filterPins(trimmedQuery));
|
|
}
|
|
return of([]);
|
|
}),
|
|
catchError((error) => {
|
|
console.error(
|
|
'Erreur lors de la récupération des suggestions :',
|
|
error
|
|
);
|
|
return of([]);
|
|
})
|
|
)
|
|
.subscribe((filteredPins) => {
|
|
this.pinsFiltered = filteredPins;
|
|
});
|
|
}
|
|
|
|
filterPins(searchTerm: string): Pin[] {
|
|
const filteredPins: Pin[] = [];
|
|
|
|
if (this.pins.length === 0) {
|
|
this.pins = this.pinService.getPins();
|
|
}
|
|
|
|
this.pins.forEach((pin: Pin) => {
|
|
if (
|
|
pin.title &&
|
|
pin.title.toLowerCase().includes(searchTerm.toLowerCase())
|
|
) {
|
|
filteredPins.push(pin);
|
|
}
|
|
});
|
|
|
|
return filteredPins;
|
|
}
|
|
|
|
clickSuggestion(pin: Pin): void {
|
|
this.searchForm.reset();
|
|
|
|
const queryParams = { pin: pin.id }; // Remplacer "id" par la bonne propriété si nécessaire
|
|
this.router.navigate([], {
|
|
relativeTo: this.route,
|
|
queryParams: queryParams,
|
|
queryParamsHandling: 'merge', // Conserve les autres paramètres de requête
|
|
});
|
|
}
|
|
|
|
onFocus(): void {
|
|
this.inputFocus = true;
|
|
}
|
|
|
|
onBlur(): void {
|
|
setTimeout(() => {
|
|
this.inputFocus = false;
|
|
}, 200); // Petit délai pour laisser l'utilisateur cliquer
|
|
}
|
|
|
|
public logout() {
|
|
this.localStorageService.removeToken();
|
|
this.localStorageService.removeUsername();
|
|
this.router.navigate(['/']);
|
|
}
|
|
}
|