forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			167 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			Svelte
		
	
	
	
	
	
			
		
		
	
	
			167 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			Svelte
		
	
	
	
	
	
| <script lang="ts">
 | |
|   import { OsmConnectionFeatureSwitches } from "../Logic/State/FeatureSwitchState"
 | |
|   import { OsmConnection } from "../Logic/Osm/OsmConnection"
 | |
|   import { QueryParameters } from "../Logic/Web/QueryParameters"
 | |
|   import UserRelatedState from "../Logic/State/UserRelatedState"
 | |
|   import LanguagePicker from "./InputElement/LanguagePicker.svelte"
 | |
|   import Translations from "./i18n/Translations"
 | |
|   import Logo from "../assets/svg/Logo.svelte"
 | |
|   import Tr from "./Base/Tr.svelte"
 | |
|   import MoreScreen from "./BigComponents/MoreScreen"
 | |
|   import LoginToggle from "./Base/LoginToggle.svelte"
 | |
|   import Pencil from "../assets/svg/Pencil.svelte"
 | |
|   import Login from "../assets/svg/Login.svelte"
 | |
|   import Constants from "../Models/Constants"
 | |
|   import { Store, UIEventSource } from "../Logic/UIEventSource"
 | |
|   import { placeholder } from "../Utils/placeholder"
 | |
|   import { SearchIcon } from "@rgossiaux/svelte-heroicons/solid"
 | |
|   import ThemesList from "./BigComponents/ThemesList.svelte"
 | |
|   import { LayoutInformation } from "../Models/ThemeConfig/LayoutConfig"
 | |
|   import * as themeOverview from "../assets/generated/theme_overview.json"
 | |
|   import UnofficialThemeList from "./BigComponents/UnofficialThemeList.svelte"
 | |
|   import Eye from "../assets/svg/Eye.svelte"
 | |
| 
 | |
|   const featureSwitches = new OsmConnectionFeatureSwitches()
 | |
|   const osmConnection = new OsmConnection({
 | |
|     fakeUser: featureSwitches.featureSwitchFakeUser.data,
 | |
|     oauth_token: QueryParameters.GetQueryParameter(
 | |
|       "oauth_token",
 | |
|       undefined,
 | |
|       "Used to complete the login"
 | |
|     ),
 | |
|   })
 | |
|   const state = new UserRelatedState(osmConnection)
 | |
|   const t = Translations.t.index
 | |
|   const tr = Translations.t.general.morescreen
 | |
| 
 | |
|   let userLanguages = osmConnection.userDetails.map((ud) => ud.languages)
 | |
|   let themeSearchText: UIEventSource<string | undefined> = new UIEventSource<string>(undefined)
 | |
| 
 | |
|   document.addEventListener("keydown", function (event) {
 | |
|     if (event.ctrlKey && event.code === "KeyF") {
 | |
|       document.getElementById("theme-search")?.focus()
 | |
|       event.preventDefault()
 | |
|     }
 | |
|   })
 | |
| 
 | |
|   let visitedHiddenThemes: Store<LayoutInformation[]>
 | |
|   const hiddenThemes: LayoutInformation[] =
 | |
|     (themeOverview["default"] ?? themeOverview)?.filter((layout) => layout.hideFromOverview) ?? []
 | |
|   {
 | |
|     const prefix = "mapcomplete-hidden-theme-"
 | |
|     const userPreferences = state.osmConnection.preferencesHandler.preferences
 | |
|     visitedHiddenThemes = userPreferences.map((preferences) => {
 | |
|       const knownIds = new Set<string>(
 | |
|         Object.keys(preferences)
 | |
|           .filter((key) => key.startsWith(prefix))
 | |
|           .map((key) => key.substring(prefix.length, key.length - "-enabled".length))
 | |
|       )
 | |
|       return hiddenThemes.filter(
 | |
|         (theme) =>
 | |
|           knownIds.has(theme.id) ||
 | |
|           state.osmConnection.userDetails.data.name === "Pieter Vander Vennet"
 | |
|       )
 | |
|     })
 | |
|   }
 | |
| </script>
 | |
| 
 | |
| <div class="m-4 flex flex-col">
 | |
|   <LanguagePicker
 | |
|     clss="self-end max-w-full"
 | |
|     assignTo={state.language}
 | |
|     availableLanguages={t.title.SupportedLanguages()}
 | |
|     preferredLanguages={userLanguages}
 | |
|   />
 | |
| 
 | |
|   <div class="mt-4 flex">
 | |
|     <div class="m-3 flex-none">
 | |
|       <Logo alt="MapComplete Logo" class="h-12 w-12 sm:h-24 sm:w-24" />
 | |
|     </div>
 | |
| 
 | |
|     <div class="flex flex-col">
 | |
|       <h1 class="m-0 font-extrabold tracking-tight md:text-6xl">
 | |
|         <Tr t={t.title} />
 | |
|       </h1>
 | |
|       <Tr
 | |
|         cls="my-4 mr-4 text-base font-semibold sm:text-lg md:mt-5 md:text-xl lg:mx-0"
 | |
|         t={Translations.t.index.intro}
 | |
|       />
 | |
|     </div>
 | |
|   </div>
 | |
| 
 | |
|   <form
 | |
|     class="flex justify-center"
 | |
|     on:submit|preventDefault={(_) => MoreScreen.applySearch(themeSearchText.data)}
 | |
|   >
 | |
|     <label
 | |
|       class="neutral-label my-2 flex w-full items-center rounded-full border-2 border-black sm:w-1/2"
 | |
|     >
 | |
|       <SearchIcon aria-hidden="true" class="h-8 w-8" />
 | |
|       <input
 | |
|         autofocus
 | |
|         bind:value={$themeSearchText}
 | |
|         class="mr-4 w-full"
 | |
|         id="theme-search"
 | |
|         type="search"
 | |
|         use:placeholder={tr.searchForATheme}
 | |
|       />
 | |
|     </label>
 | |
|   </form>
 | |
| 
 | |
|   <ThemesList search={themeSearchText} {state} themes={MoreScreen.officialThemes} />
 | |
| 
 | |
|   <LoginToggle {state}>
 | |
|     <ThemesList
 | |
|       hideThemes={false}
 | |
|       isCustom={false}
 | |
|       search={themeSearchText}
 | |
|       {state}
 | |
|       themes={$visitedHiddenThemes}
 | |
|     >
 | |
|       <svelte:fragment slot="title">
 | |
|         <h3>
 | |
|           <Tr t={tr.previouslyHiddenTitle} />
 | |
|         </h3>
 | |
|         <p>
 | |
|           <Tr
 | |
|             t={tr.hiddenExplanation.Subs({
 | |
|               hidden_discovered: $visitedHiddenThemes.length.toString(),
 | |
|               total_hidden: hiddenThemes.length.toString(),
 | |
|             })}
 | |
|           />
 | |
|         </p>
 | |
|       </svelte:fragment>
 | |
|     </ThemesList>
 | |
| 
 | |
|     <UnofficialThemeList search={themeSearchText} {state} />
 | |
| 
 | |
|     <div slot="not-logged-in">
 | |
|       <button class="w-full" on:click={() => osmConnection.AttemptLogin()}>
 | |
|         <Login class="mr-2 h-6 w-6 " />
 | |
|         <Tr t={Translations.t.index.logIn} />
 | |
|       </button>
 | |
|     </div>
 | |
|     <a
 | |
|       class="button h-fit w-full"
 | |
|       href={window.location.protocol + "//" + window.location.host + "/studio.html"}
 | |
|     >
 | |
|       <Pencil class="mr-2 h-6 w-6" />
 | |
|       <Tr t={Translations.t.general.morescreen.createYourOwnTheme} />
 | |
|     </a>
 | |
| 
 | |
|     <a
 | |
|       class="button h-fit w-full"
 | |
|       href={window.location.protocol + "//" + window.location.host + "/privacy.html"}
 | |
|     >
 | |
|       <Eye class="mr-2 h-6 w-6" />
 | |
|       <Tr t={Translations.t.privacy.title} />
 | |
|     </a>
 | |
|   </LoginToggle>
 | |
| 
 | |
|   <Tr cls="link-underline" t={Translations.t.general.aboutMapComplete.intro} />
 | |
|   <Tr t={tr.streetcomplete} />
 | |
| 
 | |
|   <div class="subtle mb-16 self-end">
 | |
|     v{Constants.vNumber}
 | |
|   </div>
 | |
| </div>
 |