Files
trouvetonprofile/src/app/shared/features/my-profile-map/my-profile-map.component.ts
2025-12-21 09:14:39 +01:00

96 lines
2.9 KiB
TypeScript

import { Component, effect, inject, input, OnInit, signal } from '@angular/core';
import { MapComponent, MapMarker } from '@app/shared/components/map/map.component';
import { Coordinates, CoordinatesValidator } from '@app/domain/localisation/coordinates.model';
import { LocationFacade } from '@app/ui/location/location.facade';
import { ProfileFacade } from '@app/ui/profiles/profile.facade';
import { ProfileViewModel } from '@app/ui/profiles/profile.presenter.model';
import { ActionType } from '@app/domain/action-type.util';
@Component({
selector: 'app-my-profile-map',
standalone: true,
imports: [MapComponent],
providers: [LocationFacade],
templateUrl: './my-profile-map.component.html',
styleUrl: './my-profile-map.component.scss',
})
export class MyProfileMapComponent implements OnInit {
readonly profile = input<ProfileViewModel>();
private readonly locationFacade = inject(LocationFacade);
private readonly profileFacade = inject(ProfileFacade);
private readonly loading = this.profileFacade.loading;
private readonly error = this.profileFacade.error;
protected readonly locationState = this.locationFacade.locationState;
protected readonly markers = signal<MapMarker[]>([]);
private initializedFromProfile = false;
constructor() {
effect(
() => {
const profile = this.profile();
const state = this.locationState();
// Initialiser une seule fois quand profile est disponible
if (!this.initializedFromProfile && profile?.coordonnees) {
this.initializedFromProfile = true;
this.locationState.set({
...state,
coordinates: profile.coordonnees,
});
}
// Mettre à jour les markers quand les coordonnées changent
if (state.coordinates) {
this.updateMarkers(state.coordinates);
}
if (!this.loading().isLoading) {
switch (this.loading().action) {
case ActionType.UPDATE:
if (!this.error().hasError) {
}
break;
}
}
},
{ allowSignalWrites: true }
);
}
ngOnInit() {}
onSaveLocation() {
const currentLocation = this.locationState().coordinates;
if (currentLocation === null) return;
this.profileFacade.updateCoordinate(
this.profile()!.id!,
currentLocation.latitude,
currentLocation.longitude
);
}
onLocationSelected(coordinates: Coordinates): void {
this.locationState.set({ ...this.locationState(), coordinates: coordinates });
}
onGetCurrentLocation(): void {
this.locationFacade.getCurrentLocation();
}
private updateMarkers(coordinates: Coordinates): void {
const marker: MapMarker[] = [
{
id: this.profile()!.id,
coordinates: coordinates,
title: this.profile()!.fullName,
description: CoordinatesValidator.format(coordinates),
profile: this.profile()!,
},
];
this.markers.set(marker);
}
}