@@ -5,26 +5,30 @@ import {deepEqual} from '../utils/deep-equal';
5
5
6
6
import type { MapboxMap , AnyLayer } from '../types' ;
7
7
8
- export type LayerProps = AnyLayer & {
8
+ export type DeprecatedLayerProps = AnyLayer & {
9
9
id ?: string ;
10
10
/** If set, the layer will be inserted before the specified layer */
11
11
beforeId ?: string ;
12
12
} ;
13
13
14
+ export type LayerProps =
15
+ | {
16
+ layer : AnyLayer ;
17
+ beforeId ?: string ;
18
+ }
19
+ | DeprecatedLayerProps ;
20
+
14
21
/* eslint-disable complexity, max-statements */
15
- function updateLayer ( map : MapboxMap , id : string , props : LayerProps , prevProps : LayerProps ) {
22
+ function updateLayer ( map : MapboxMap , id : string , props : AnyLayer , prevProps : AnyLayer ) {
16
23
assert ( props . id === prevProps . id , 'layer id changed' ) ;
17
24
assert ( props . type === prevProps . type , 'layer type changed' ) ;
18
25
19
26
if ( props . type === 'custom' || prevProps . type === 'custom' ) {
20
27
return ;
21
28
}
22
29
23
- const { layout = { } , paint = { } , filter, minzoom, maxzoom, beforeId } = props ;
30
+ const { layout = { } , paint = { } , filter, minzoom, maxzoom} = props ;
24
31
25
- if ( beforeId !== prevProps . beforeId ) {
26
- map . moveLayer ( id , beforeId ) ;
27
- }
28
32
if ( layout !== prevProps . layout ) {
29
33
const prevLayout = prevProps . layout || { } ;
30
34
for ( const key in layout ) {
@@ -59,27 +63,40 @@ function updateLayer(map: MapboxMap, id: string, props: LayerProps, prevProps: L
59
63
}
60
64
}
61
65
62
- function createLayer ( map : MapboxMap , id : string , props : LayerProps ) {
66
+ function isMapStyleLoaded ( map : MapboxMap ) {
63
67
// @ts -ignore
64
- if ( map . style && map . style . _loaded && ( ! ( 'source' in props ) || map . getSource ( props . source ) ) ) {
65
- const options : LayerProps = { ...props , id} ;
66
- delete options . beforeId ;
68
+ return map . style && map . style . _loaded ;
69
+ }
67
70
71
+ function createLayer ( map : MapboxMap , id : string , layerProps : LayerProps , beforeId : string ) {
72
+ // @ts -ignore
73
+ if ( isMapStyleLoaded ( map ) && ( ! ( 'source' in layerProps ) || map . getSource ( layerProps . source ) ) ) {
68
74
// @ts -ignore
69
- map . addLayer ( options , props . beforeId ) ;
75
+ map . addLayer ( layerProps , beforeId ) ;
70
76
}
71
77
}
72
78
73
79
/* eslint-enable complexity, max-statements */
74
80
75
81
let layerCounter = 0 ;
76
82
77
- function Layer ( props : LayerProps ) {
83
+ function Layer ( props : LayerProps & { layer ?: AnyLayer } ) {
78
84
const map : MapboxMap = useContext ( MapContext ) . map . getMap ( ) ;
79
- const propsRef = useRef ( props ) ;
85
+
86
+ const layerProps = useMemo ( ( ) => {
87
+ if ( props . layer ) {
88
+ return props . layer ;
89
+ }
90
+ const res = { ...props } ;
91
+ delete res . beforeId ;
92
+ return res as DeprecatedLayerProps ;
93
+ } , [ props . layer , props ] ) ;
94
+
95
+ const layerPropsRef = useRef ( layerProps ) ;
80
96
const [ , setStyleLoaded ] = useState ( 0 ) ;
97
+ const beforeId = props . beforeId ;
81
98
82
- const id = useMemo ( ( ) => props . id || `jsx-layer-${ layerCounter ++ } ` , [ ] ) ;
99
+ const id = useMemo ( ( ) => layerProps . id || `jsx-layer-${ layerCounter ++ } ` , [ ] ) ;
83
100
84
101
useEffect ( ( ) => {
85
102
if ( map ) {
@@ -102,16 +119,22 @@ function Layer(props: LayerProps) {
102
119
const layer = map && map . style && map . getLayer ( id ) ;
103
120
if ( layer ) {
104
121
try {
105
- updateLayer ( map , id , props , propsRef . current ) ;
122
+ updateLayer ( map , id , layerProps , layerPropsRef . current ) ;
106
123
} catch ( error ) {
107
124
console . warn ( error ) ; // eslint-disable-line
108
125
}
109
126
} else {
110
- createLayer ( map , id , props ) ;
127
+ createLayer ( map , id , layerProps , beforeId ) ;
111
128
}
112
129
130
+ useEffect ( ( ) => {
131
+ if ( beforeId && isMapStyleLoaded ( map ) ) {
132
+ map . moveLayer ( id , beforeId ) ;
133
+ }
134
+ } , [ beforeId ] ) ;
135
+
113
136
// Store last rendered props
114
- propsRef . current = props ;
137
+ layerPropsRef . current = layerProps ;
115
138
116
139
return null ;
117
140
}
0 commit comments