@@ -3,8 +3,10 @@ import {
33 useMemo ,
44} from 'react' ;
55import {
6+ isDefined ,
67 isNotDefined ,
78 listToMap ,
9+ randomString ,
810} from '@togglecorp/fujs' ;
911import Map from '@togglecorp/re-map' ;
1012import { removeNull } from '@togglecorp/toggle-form' ;
@@ -47,49 +49,62 @@ function BaseMap(props: Props) {
4749
4850 const { raster : rasterTileServers } = useContext ( TileServerContext ) ;
4951
50- const mapInfo = useMemo ( ( ) => {
51- const rasterTileServerMapping = listToMap (
52- rasterTileServers ,
53- ( { type : tileType } ) => tileType ,
54- ) ;
52+ const rasterTileServerMapping = useMemo ( ( ) => listToMap (
53+ rasterTileServers ,
54+ ( { type : tileType } ) => tileType ,
55+ ) , [ rasterTileServers ] ) ;
56+
57+ const name = baseTileServer ?. name ;
58+ const custom = name === RasterTileServerNameEnum . Custom
59+ ? baseTileServer ?. custom
60+ : undefined ;
61+
62+ const tileUrl = isDefined ( name ) ? rasterTileServerMapping [ name ] ?. url : undefined ;
63+ const tileCredits = isDefined ( name ) ? rasterTileServerMapping [ name ] ?. credits : undefined ;
64+ const minZoom = isDefined ( name ) ? rasterTileServerMapping [ name ] ?. minZoom : undefined ;
65+ const maxZoom = isDefined ( name ) ? rasterTileServerMapping [ name ] ?. maxZoom : undefined ;
66+
67+ const baseTileServerDefined = isDefined ( baseTileServer ) ;
5568
56- if ( isNotDefined ( baseTileServer ) ) {
69+ const mapInfo = useMemo ( ( ) => {
70+ if ( ! baseTileServerDefined ) {
5771 return FALLBACK_TILE_URL ;
5872 }
5973
60- const { name } = baseTileServer ;
61-
6274 if ( isNotDefined ( name ) ) {
63- return {
64- url : undefined ,
65- credits : undefined ,
66- minzoom : undefined ,
67- maxzoom : undefined ,
68- } ;
75+ return undefined ;
6976 }
7077
7178 if ( name === RasterTileServerNameEnum . Custom ) {
79+ if ( isNotDefined ( custom ) ) {
80+ return undefined ;
81+ }
82+
7283 return {
73- url : baseTileServer . custom ? .url ,
74- credits : baseTileServer . custom ? .credits ,
75- minzoom : baseTileServer . custom ? .minZoom ,
76- maxzoom : baseTileServer . custom ? .maxZoom ,
84+ url : custom . url ,
85+ credits : custom . credits ,
86+ minzoom : custom . minZoom ,
87+ maxzoom : custom . maxZoom ,
7788 } ;
7889 }
7990
8091 return {
81- url : rasterTileServerMapping [ name ] ?. url ,
82- credits : rasterTileServerMapping [ name ] ?. credits ,
83- minzoom : baseTileServer . custom ?. minZoom ,
84- maxzoom : baseTileServer . custom ?. maxZoom ,
92+ url : tileUrl ,
93+ credits : tileCredits ,
94+ minzoom : minZoom ,
95+ maxzoom : maxZoom ,
8596 } ;
86- } , [ baseTileServer , rasterTileServers ] ) ;
97+ } , [ baseTileServerDefined , custom , maxZoom , minZoom , name , tileCredits , tileUrl ] ) ;
8798
8899 const mapStyle = useMemo ( ( ) => {
89100 if ( typeof mapInfo === 'string' ) {
90101 return mapInfo ;
91102 }
92103
104+ if ( isNotDefined ( mapInfo ) ) {
105+ return undefined ;
106+ }
107+
93108 const result = type ( 'string.url' ) ( mapInfo . url ) ;
94109
95110 if ( result instanceof type . errors ) {
@@ -128,8 +143,21 @@ function BaseMap(props: Props) {
128143 dragPan : ! disablePan ,
129144 } ) , [ disablePan ] ) ;
130145
146+ const mapKey = useMemo ( ( ) => (
147+ // FIXME(frozenhelium): map key is added here
148+ // to completely destroy and create a new map
149+ // to avoid race condition while recreating layers and sources
150+ randomString ( )
151+ // eslint-disable-next-line react-hooks/exhaustive-deps
152+ ) , [ mapStyle ] ) ;
153+
154+ if ( isNotDefined ( mapStyle ) ) {
155+ return null ;
156+ }
157+
131158 return (
132159 < Map
160+ key = { mapKey }
133161 mapStyle = { mapStyle }
134162 mapOptions = { mapOptions }
135163 >
0 commit comments