1
- import { For , createSignal , createEffect , onMount , Component } from "solid-js" ;
1
+ import { For , createSignal , createEffect , createResource , onMount , Component , Show } from "solid-js" ;
2
2
import "maplibre-gl/dist/maplibre-gl.css" ;
3
3
import "./App.css" ;
4
4
import maplibregl from "maplibre-gl" ;
5
5
import { StyleSpecification } from "maplibre-gl" ;
6
6
import { Flavor , layers } from "@protomaps/basemaps" ;
7
7
8
- const FLAVORS = [ "bio" , "dusk_rose" , "iris_bloom" , "rainforest" , "seafoam" , "flat" ] ;
9
-
10
- const nameToFlavor = new Map < string , Flavor > ( ) ;
11
-
12
- import bio from "../flavors/bio.ts" ;
13
- nameToFlavor . set ( "bio" , bio ) ;
14
-
15
- import iris_bloom from "../flavors/iris_bloom.ts" ;
16
- nameToFlavor . set ( "iris_bloom" , iris_bloom ) ;
17
-
18
- import seafoam from "../flavors/seafoam.ts" ;
19
- nameToFlavor . set ( "seafoam" , seafoam ) ;
20
-
21
- // import sol from "../flavors/sol.ts";
22
- // nameToFlavor.set("sol", sol);
23
-
24
- import flat from "../flavors/flat.ts" ;
25
- nameToFlavor . set ( "flat" , flat ) ;
26
-
27
- import dusk_rose from "../flavors/dusk_rose.ts" ;
28
- nameToFlavor . set ( "dusk_rose" , dusk_rose ) ;
29
-
30
- import rainforest from "../flavors/rainforest.ts" ;
31
- nameToFlavor . set ( "rainforest" , rainforest ) ;
32
-
33
- const getStyle = ( index : number , showLabels : boolean ) : StyleSpecification => {
34
- let flavorName = FLAVORS [ index ] ;
8
+ const getStyle = ( flavor : Flavor | undefined , showLabels : boolean ) : StyleSpecification => {
35
9
return {
36
10
version : 8 ,
37
11
glyphs :
@@ -42,13 +16,13 @@ const getStyle = (index: number, showLabels: boolean): StyleSpecification => {
42
16
url : "https://api.protomaps.com/tiles/v4.json?key=1003762824b9687f" ,
43
17
} ,
44
18
} ,
45
- layers : layers ( "protomaps" , nameToFlavor . get ( flavorName ) ! , { lang : showLabels ? "en" : undefined } ) ,
19
+ layers : flavor ? layers ( "protomaps" , flavor , { lang : showLabels ? "en" : undefined } ) : [ ]
46
20
} ;
47
21
} ;
48
22
49
- const FlavorRow : Component < { name : string , flavor : Flavor } > = ( props ) => {
23
+ const FlavorRow : Component < { name : string } > = ( props ) => {
50
24
return (
51
- < div class = "flavorRow" style = { { "background-color" : props . flavor . background , "color" : props . flavor . city_label } } >
25
+ < div class = "flavorRow" >
52
26
{ props . name }
53
27
</ div >
54
28
)
@@ -57,7 +31,7 @@ const FlavorRow: Component<{ name: string, flavor: Flavor }> = (props) => {
57
31
function App ( ) {
58
32
let map : maplibregl . Map ;
59
33
60
- const [ selectedIndex , setSelectedIndex ] = createSignal ( 0 ) ;
34
+ const [ selectedFlavorName , setSelectedFlavorName ] = createSignal ( ) ;
61
35
const [ showLabels , setShowLabels ] = createSignal ( true ) ;
62
36
63
37
onMount ( async ( ) => {
@@ -68,17 +42,23 @@ function App() {
68
42
69
43
map = new maplibregl . Map ( {
70
44
container : "map" ,
71
- style : getStyle ( selectedIndex ( ) , showLabels ( ) ) ,
45
+ style : getStyle ( undefined , showLabels ( ) ) ,
72
46
} ) ;
73
47
} ) ;
74
48
75
- createEffect ( ( ) => {
76
- map . setStyle ( getStyle ( selectedIndex ( ) , showLabels ( ) ) ) ;
49
+ const [ flavorList ] = createResource ( async ( ) => {
50
+ const resp = await fetch ( "/flavors.json" ) ;
51
+ return await resp . json ( ) ;
52
+ } )
53
+
54
+ const [ flavorJson ] = createResource ( selectedFlavorName , async ( ) => {
55
+ const resp = await fetch ( `/flavors/${ selectedFlavorName ( ) } .json` ) ;
56
+ return await resp . json ( ) ;
77
57
} ) ;
78
58
79
- const selectFlavor = ( i : number ) => {
80
- setSelectedIndex ( i ) ;
81
- }
59
+ createEffect ( ( ) => {
60
+ map . setStyle ( getStyle ( flavorJson ( ) , showLabels ( ) ) ) ;
61
+ } ) ;
82
62
83
63
const handleShowLabelsChange = ( event : Event ) => {
84
64
const target = event . target as HTMLInputElement ;
@@ -88,7 +68,9 @@ function App() {
88
68
return (
89
69
< div id = "container" >
90
70
< div class = "sidebar" >
91
- < For each = { FLAVORS } > { ( flavorName , i ) => < div onClick = { ( ) => selectFlavor ( i ( ) ) } > < FlavorRow name = { flavorName } flavor = { nameToFlavor . get ( flavorName ) ! } /> </ div > } </ For >
71
+ < Show when = { flavorList ( ) } >
72
+ < For each = { flavorList ( ) } > { ( flavorName ) => < div onClick = { ( ) => setSelectedFlavorName ( flavorName ) } > < FlavorRow name = { flavorName } /> </ div > } </ For >
73
+ </ Show >
92
74
< input
93
75
id = "showLabels"
94
76
type = "checkbox"
0 commit comments