forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			94 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Svelte
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Svelte
		
	
	
	
	
	
| <script lang="ts">
 | |
|     import {Translation} from "../i18n/Translation"
 | |
|     import * as personal from "../../assets/themes/personal/personal.json"
 | |
|     import {ImmutableStore, Store, UIEventSource} from "../../Logic/UIEventSource"
 | |
|     import UserDetails, {OsmConnection} from "../../Logic/Osm/OsmConnection"
 | |
|     import Constants from "../../Models/Constants"
 | |
|     import type Loc from "../../Models/Loc"
 | |
|     import type {LayoutInformation} from "../../Models/ThemeConfig/LayoutConfig"
 | |
|     import Tr from "../Base/Tr.svelte"
 | |
|     import SubtleLink from "../Base/SubtleLink.svelte";
 | |
| 
 | |
|     export let theme: LayoutInformation
 | |
|     export let isCustom: boolean = false
 | |
|     export let userDetails: UIEventSource<UserDetails>
 | |
|     export let state: { osmConnection: OsmConnection; locationControl?: UIEventSource<Loc> }
 | |
| 
 | |
|     $: title = new Translation(
 | |
|         theme.title,
 | |
|         !isCustom && !theme.mustHaveLanguage ? "themes:" + theme.id + ".title" : undefined
 | |
|     )
 | |
|     $: description = new Translation(theme.shortDescription)
 | |
| 
 | |
|     // TODO: Improve this function
 | |
|     function createUrl(
 | |
|         layout: { id: string; definition?: string },
 | |
|         isCustom: boolean,
 | |
|         state?: { locationControl?: UIEventSource<{ lat; lon; zoom }>; layoutToUse?: { id } }
 | |
|     ): Store<string> {
 | |
|         if (layout === undefined) {
 | |
|             return undefined
 | |
|         }
 | |
|         if (layout.id === undefined) {
 | |
|             console.error("ID is undefined for layout", layout)
 | |
|             return undefined
 | |
|         }
 | |
| 
 | |
|         if (layout.id === state?.layoutToUse?.id) {
 | |
|             return undefined
 | |
|         }
 | |
| 
 | |
|         const currentLocation = state?.locationControl
 | |
| 
 | |
|         let path = window.location.pathname
 | |
|         // Path starts with a '/' and contains everything, e.g. '/dir/dir/page.html'
 | |
|         path = path.substr(0, path.lastIndexOf("/"))
 | |
|         // Path will now contain '/dir/dir', or empty string in case of nothing
 | |
|         if (path === "") {
 | |
|             path = "."
 | |
|         }
 | |
| 
 | |
|         let linkPrefix = `${path}/${layout.id.toLowerCase()}.html?`
 | |
|         if (location.hostname === "localhost" || location.hostname === "127.0.0.1" || location.port === "1234") {
 | |
|             // Redirect to 'theme.html?layout=* instead of 'layout.html'. This is probably a debug run, where the routing does not work
 | |
|             linkPrefix = `${path}/theme.html?layout=${layout.id}&`
 | |
|         }
 | |
| 
 | |
|         if (isCustom) {
 | |
|             linkPrefix = `${path}/theme.html?userlayout=${layout.id}&`
 | |
|         }
 | |
| 
 | |
|         let hash = ""
 | |
|         if (layout.definition !== undefined) {
 | |
|             hash = "#" + btoa(JSON.stringify(layout.definition))
 | |
|         }
 | |
| 
 | |
|         return (
 | |
|             currentLocation?.map((currentLocation) => {
 | |
|                 const params = [
 | |
|                     ["z", currentLocation?.zoom],
 | |
|                     ["lat", currentLocation?.lat],
 | |
|                     ["lon", currentLocation?.lon],
 | |
|                 ]
 | |
|                     .filter((part) => part[1] !== undefined)
 | |
|                     .map((part) => part[0] + "=" + part[1])
 | |
|                     .join("&")
 | |
|                 return `${linkPrefix}${params}${hash}`
 | |
|             }) ?? new ImmutableStore<string>(`${linkPrefix}`)
 | |
|         )
 | |
|     }
 | |
| 
 | |
|     let href = createUrl(theme, isCustom, state)
 | |
| </script>
 | |
| 
 | |
| {#if theme.id !== personal.id || $userDetails.csCount > Constants.userJourney.personalLayoutUnlock}
 | |
|     <SubtleLink href={ $href  }>
 | |
|         <img slot="image" src={theme.icon} class="block h-11 w-11 bg-red mx-4" alt=""/>
 | |
|         <span class="flex flex-col text-ellipsis overflow-hidden">
 | |
|           <Tr t={title}/>
 | |
|           <span class="subtle max-h-12">
 | |
|             <Tr t={description}/>
 | |
|           </span>
 | |
|       </span>
 | |
|     </SubtleLink>
 | |
| {/if}
 |