1- import { For , createSignal , createEffect , onMount , Component } from "solid-js" ;
1+ import { For , createSignal , createEffect , createResource , onMount , Component , Show } from "solid-js" ;
22import "maplibre-gl/dist/maplibre-gl.css" ;
33import "./App.css" ;
44import maplibregl from "maplibre-gl" ;
55import { StyleSpecification } from "maplibre-gl" ;
66import { Flavor , layers } from "@protomaps/basemaps" ;
77
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 => {
359 return {
3610 version : 8 ,
3711 glyphs :
@@ -42,13 +16,13 @@ const getStyle = (index: number, showLabels: boolean): StyleSpecification => {
4216 url : "https://api.protomaps.com/tiles/v4.json?key=1003762824b9687f" ,
4317 } ,
4418 } ,
45- layers : layers ( "protomaps" , nameToFlavor . get ( flavorName ) ! , { lang : showLabels ? "en" : undefined } ) ,
19+ layers : flavor ? layers ( "protomaps" , flavor , { lang : showLabels ? "en" : undefined } ) : [ ]
4620 } ;
4721} ;
4822
49- const FlavorRow : Component < { name : string , flavor : Flavor } > = ( props ) => {
23+ const FlavorRow : Component < { name : string } > = ( props ) => {
5024 return (
51- < div class = "flavorRow" style = { { "background-color" : props . flavor . background , "color" : props . flavor . city_label } } >
25+ < div class = "flavorRow" >
5226 { props . name }
5327 </ div >
5428 )
@@ -57,7 +31,7 @@ const FlavorRow: Component<{ name: string, flavor: Flavor }> = (props) => {
5731function App ( ) {
5832 let map : maplibregl . Map ;
5933
60- const [ selectedIndex , setSelectedIndex ] = createSignal ( 0 ) ;
34+ const [ selectedFlavorName , setSelectedFlavorName ] = createSignal ( ) ;
6135 const [ showLabels , setShowLabels ] = createSignal ( true ) ;
6236
6337 onMount ( async ( ) => {
@@ -68,17 +42,25 @@ function App() {
6842
6943 map = new maplibregl . Map ( {
7044 container : "map" ,
71- style : getStyle ( selectedIndex ( ) , showLabels ( ) ) ,
45+ style : getStyle ( undefined , showLabels ( ) ) ,
7246 } ) ;
7347 } ) ;
7448
75- createEffect ( ( ) => {
76- map . setStyle ( getStyle ( selectedIndex ( ) , showLabels ( ) ) ) ;
49+ const [ flavorList ] = createResource ( async ( ) => {
50+ const resp = await fetch ( "/flavors.json" ) ;
51+ const j = await resp . json ( ) ;
52+ setSelectedFlavorName ( j [ 0 ] ) ;
53+ return j ;
54+ } )
55+
56+ const [ flavorJson ] = createResource ( selectedFlavorName , async ( ) => {
57+ const resp = await fetch ( `/flavors/${ selectedFlavorName ( ) } .json` ) ;
58+ return await resp . json ( ) ;
7759 } ) ;
7860
79- const selectFlavor = ( i : number ) => {
80- setSelectedIndex ( i ) ;
81- }
61+ createEffect ( ( ) => {
62+ map . setStyle ( getStyle ( flavorJson ( ) , showLabels ( ) ) ) ;
63+ } ) ;
8264
8365 const handleShowLabelsChange = ( event : Event ) => {
8466 const target = event . target as HTMLInputElement ;
@@ -88,7 +70,9 @@ function App() {
8870 return (
8971 < div id = "container" >
9072 < div class = "sidebar" >
91- < For each = { FLAVORS } > { ( flavorName , i ) => < div onClick = { ( ) => selectFlavor ( i ( ) ) } > < FlavorRow name = { flavorName } flavor = { nameToFlavor . get ( flavorName ) ! } /> </ div > } </ For >
73+ < Show when = { flavorList ( ) } >
74+ < For each = { flavorList ( ) } > { ( flavorName ) => < div onClick = { ( ) => setSelectedFlavorName ( flavorName ) } > < FlavorRow name = { flavorName } /> </ div > } </ For >
75+ </ Show >
9276 < input
9377 id = "showLabels"
9478 type = "checkbox"
0 commit comments