-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Ajout des tuiles vectorielles et des events lors du clique sur un collège #15
base: master
Are you sure you want to change the base?
Conversation
cedric-famibelle-pronzola
commented
Mar 3, 2023
- Ajout des tuiles vectorielles
- Ajout des layers
- Ajout des events lors du clique sur un collège
8022ae5
to
888f100
Compare
888f100
to
b8acade
Compare
8244932
to
4e3f5e7
Compare
Attention les autres collèges sont masqués automatiquement par MapLibre s'ils chevauchent la limite d'une zone. Il faut les mettre au dessus en terme de priorité. |
@@ -1,2 +1,16 @@ | |||
/* eslint n/prefer-global/process: off */ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pas utile je pense.
const Map = dynamic( | ||
() => import('./map.js'), | ||
{ssr: false} | ||
) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Il n'est pas utile d'importer dynamiquement ce composant. La création de la carte se fait dans un componentDidMount
, le code sera donc bien exécuté côté client. Ici, c'est le fait que les sources soient calculées à l'aide de window
qui elles sont calculées côté serveur qui pose un problème.
|
||
return ( | ||
<> | ||
<Legend /> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
La légende n'est pas vraiment adaptée à l'affichage mobile. Je propose de ne l'afficher que sur desktop.
const itineraireLayer = { | ||
id: 'itineraire-line', | ||
type: 'line', | ||
source: 'itineraire', | ||
layout: { | ||
'line-join': 'round', | ||
'line-cap': 'round' | ||
}, | ||
paint: { | ||
'line-color': colors.darkGrey, | ||
'line-width': 4 | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pourquoi garder ce layer indépendant des autres ?
const sourcesLoaded = useRef(false) | ||
const layersLoaded = useRef(false) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Tu peux utiliser map.isSourceLoaded({sourceId})
. C'est plus sûr qu'une référence ici, car la source peut être rechargée et ta ref ne prévoit pas de suivre le cycle de vie.
if (selectedCollegeIdRef.current) { | ||
map.current.setLayoutProperty('secteurs-lines', 'visibility', 'visible') | ||
map.current.setLayoutProperty('secteurs-fill', 'visibility', 'visible') | ||
} else { | ||
map.current.setLayoutProperty('secteurs-lines', 'visibility', 'none') | ||
map.current.setLayoutProperty('secteurs-fill', 'visibility', 'none') | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if (selectedCollegeIdRef.current) { | |
map.current.setLayoutProperty('secteurs-lines', 'visibility', 'visible') | |
map.current.setLayoutProperty('secteurs-fill', 'visibility', 'visible') | |
} else { | |
map.current.setLayoutProperty('secteurs-lines', 'visibility', 'none') | |
map.current.setLayoutProperty('secteurs-fill', 'visibility', 'none') | |
} | |
const visibilityState = selectedCollegeIdRef.current ? 'visible' : 'none' | |
map.current.setLayoutProperty('secteurs-lines', 'visibility', visibilityState) | |
map.current.setLayoutProperty('secteurs-fill', 'visibility', visibilityState) |
useEffect(() => { | ||
if (!map.current) { | ||
return | ||
} | ||
|
||
map.current.on('click', 'colleges', e => handleCollegeClick(e, selectedCollegeFeatureRef)) | ||
map.current.on('mousemove', 'colleges', onCollegeHover) | ||
map.current.on('mouseleave', 'colleges', onCollegeLeave) | ||
|
||
return () => { | ||
map.current.off('click', 'colleges', e => handleCollegeClick(e, selectedCollegeFeatureRef)) | ||
map.current.off('mousemove', 'colleges', onCollegeHover) | ||
map.current.off('mouseleave', 'colleges', onCollegeLeave) | ||
} | ||
}, [map, handleCollegeClick, selectedCollegeFeatureRef]) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Les ajouts d'évènement devraient se faire dans le même useEffect
que la création de la carte.
Le risque dans ce genre de cas, c'est d'ajouter plusieurs fois les évènements sans les supprimer, car le useEffect
va ajouter des évènements à chaque fois qu'une modification est détecté dans ses hooks
.
Le piège ici, c'est que tu as "wrappé" tes méthodes inutilement des dans useCallback
donc en les utilisant ici, le useEffect
les demandes dans les hooks
.
Je te conseille donc de retirer les useCallback
inutile et déclarer même tes fonctions en dehors du composant quand cela a du sens et de gérer tes évènements de carte dans le même useEffect
que la carte.