@@ -12,19 +12,26 @@ export type LayerProps = AnyLayer & {
1212} ;
1313
1414/* eslint-disable complexity, max-statements */
15- function updateLayer ( map : MapboxMap , id : string , props : LayerProps , prevProps : LayerProps ) {
15+ function updateLayer (
16+ map : MapboxMap ,
17+ id : string ,
18+ props : LayerProps ,
19+ prevProps : LayerProps ,
20+ beforeId ?: string
21+ ) {
1622 assert ( props . id === prevProps . id , 'layer id changed' ) ;
1723 assert ( props . type === prevProps . type , 'layer type changed' ) ;
1824
25+ if ( beforeId !== prevProps . beforeId ) {
26+ map . moveLayer ( id , beforeId ) ;
27+ }
28+
1929 if ( props . type === 'custom' || prevProps . type === 'custom' ) {
2030 return ;
2131 }
2232
23- const { layout = { } , paint = { } , filter, minzoom, maxzoom, beforeId } = props ;
33+ const { layout = { } , paint = { } , filter, minzoom, maxzoom} = props ;
2434
25- if ( beforeId !== prevProps . beforeId ) {
26- map . moveLayer ( id , beforeId ) ;
27- }
2835 if ( layout !== prevProps . layout ) {
2936 const prevLayout = prevProps . layout || { } ;
3037 for ( const key in layout ) {
@@ -59,27 +66,35 @@ function updateLayer(map: MapboxMap, id: string, props: LayerProps, prevProps: L
5966 }
6067}
6168
62- function createLayer ( map : MapboxMap , id : string , props : LayerProps ) {
69+ function createLayer ( map : MapboxMap , id : string , props : LayerProps , beforeId : string ) {
6370 // @ts -ignore
6471 if ( map . style && map . style . _loaded && ( ! ( 'source' in props ) || map . getSource ( props . source ) ) ) {
65- const options : LayerProps = { ...props , id} ;
66- delete options . beforeId ;
67-
6872 // @ts -ignore
69- map . addLayer ( options , props . beforeId ) ;
73+ map . addLayer ( props , beforeId ) ;
7074 }
7175}
7276
7377/* eslint-enable complexity, max-statements */
7478
7579let layerCounter = 0 ;
7680
77- function Layer ( props : LayerProps ) {
81+ function Layer ( props : LayerProps & { layer ?: LayerProps } ) {
7882 const map : MapboxMap = useContext ( MapContext ) . map . getMap ( ) ;
79- const propsRef = useRef ( props ) ;
83+
84+ const layerProps = useMemo ( ( ) => {
85+ if ( props . layer ) {
86+ return props . layer ;
87+ }
88+ const res = { ...props } ;
89+ delete res . beforeId ;
90+ return res ;
91+ } , [ props . layer , props ] ) ;
92+
93+ const layerPropsRef = useRef ( layerProps ) ;
8094 const [ , setStyleLoaded ] = useState ( 0 ) ;
95+ const beforeId = props . beforeId ;
8196
82- const id = useMemo ( ( ) => props . id || `jsx-layer-${ layerCounter ++ } ` , [ ] ) ;
97+ const id = useMemo ( ( ) => layerProps . id || `jsx-layer-${ layerCounter ++ } ` , [ ] ) ;
8398
8499 useEffect ( ( ) => {
85100 if ( map ) {
@@ -102,16 +117,16 @@ function Layer(props: LayerProps) {
102117 const layer = map && map . style && map . getLayer ( id ) ;
103118 if ( layer ) {
104119 try {
105- updateLayer ( map , id , props , propsRef . current ) ;
120+ updateLayer ( map , id , layerProps , layerPropsRef . current , beforeId ) ;
106121 } catch ( error ) {
107122 console . warn ( error ) ; // eslint-disable-line
108123 }
109124 } else {
110- createLayer ( map , id , props ) ;
125+ createLayer ( map , id , layerProps , beforeId ) ;
111126 }
112127
113128 // Store last rendered props
114- propsRef . current = props ;
129+ layerPropsRef . current = layerProps ;
115130
116131 return null ;
117132}
0 commit comments