forked from MapComplete/MapComplete
		
	Fix build
This commit is contained in:
		
							parent
							
								
									fdf38daf5e
								
							
						
					
					
						commit
						3327c02217
					
				
					 2 changed files with 116 additions and 0 deletions
				
			
		| 
						 | 
					@ -0,0 +1,113 @@
 | 
				
			||||||
 | 
					<script lang="ts">
 | 
				
			||||||
 | 
					  import { UIEventSource } from "../../../Logic/UIEventSource"
 | 
				
			||||||
 | 
					  import { ArrowUpIcon } from "@babeard/svelte-heroicons/mini"
 | 
				
			||||||
 | 
					  import Translations from "../../i18n/Translations"
 | 
				
			||||||
 | 
					  import Tr from "../../Base/Tr.svelte"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  export let value: UIEventSource<string>
 | 
				
			||||||
 | 
					  export let mode: "degrees" | "percentage" = "percentage"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  export let preview: UIEventSource<string> = new UIEventSource<string>(undefined)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let previewMode: "degrees" | "percentage" = mode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  function oppMode(m: "degrees" | "percentage"): "percentage" | "degrees" {
 | 
				
			||||||
 | 
					    if (m === "degrees") {
 | 
				
			||||||
 | 
					      return "percentage"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return "degrees"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  function degreesToPercentage(beta: number): string {
 | 
				
			||||||
 | 
					    const perc = Math.tan(beta * Math.PI / 180) * 100
 | 
				
			||||||
 | 
					    const rounded = Math.round(perc / 5) * 5
 | 
				
			||||||
 | 
					    return rounded + "%"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  export let safetyMargin: number = 10
 | 
				
			||||||
 | 
					  if (safetyMargin < 5) {
 | 
				
			||||||
 | 
					    throw "Safetymargin should be at least 5, it is " + JSON.stringify(safetyMargin)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let alpha = new UIEventSource<number>(undefined)
 | 
				
			||||||
 | 
					  let beta = new UIEventSource<number>(undefined)
 | 
				
			||||||
 | 
					  let gamma = new UIEventSource<number>(45)
 | 
				
			||||||
 | 
					  let abs = new UIEventSource<number>(undefined)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let gotMeasurement = false
 | 
				
			||||||
 | 
					  let arrowDirection: number = undefined
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  function handleOrientation(event) {
 | 
				
			||||||
 | 
					    gotMeasurement = true
 | 
				
			||||||
 | 
					    // IF the phone is lying flat, then:
 | 
				
			||||||
 | 
					    // alpha is the compass direction (but not absolute)
 | 
				
			||||||
 | 
					    // beta is tilt if you would lift the phone towards you
 | 
				
			||||||
 | 
					    // gamma is rotation if you rotate the phone along the long axis
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    alpha.setData(Math.floor(event.alpha))
 | 
				
			||||||
 | 
					    beta.setData(Math.floor(event.beta))
 | 
				
			||||||
 | 
					    gamma.setData(Math.floor(event.gamma))
 | 
				
			||||||
 | 
					    abs.setData((event.absolute))
 | 
				
			||||||
 | 
					    if (beta.data < 0) {
 | 
				
			||||||
 | 
					      arrowDirection = gamma.data + 180
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      arrowDirection = -gamma.data
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  window.addEventListener("deviceorientation", handleOrientation)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  beta.map(beta => {
 | 
				
			||||||
 | 
					    if (-safetyMargin < arrowDirection && arrowDirection < safetyMargin) {
 | 
				
			||||||
 | 
					      if (mode === "degrees") {
 | 
				
			||||||
 | 
					        value.setData("" + beta + "°")
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        value.setData(degreesToPercentage(beta))
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (previewMode === "degrees") {
 | 
				
			||||||
 | 
					        preview.setData("" + beta + "°")
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        preview.setData(degreesToPercentage(beta))
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      value.setData(undefined)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }, [beta])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					{#if gotMeasurement}
 | 
				
			||||||
 | 
					  <div class="flex flex-col m-2">
 | 
				
			||||||
 | 
					    <div class="flex w-full">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      <div class="shrink-0 relative w-32 h-32 p-0 m-0 overflow-hidden"
 | 
				
			||||||
 | 
					           style="border-radius: 9999px; background: greenyellow">
 | 
				
			||||||
 | 
					        <div class="absolute top-0 left-0 w-16 h-16 interactive"
 | 
				
			||||||
 | 
					             style={`transform: rotate( ${-safetyMargin}deg ); transform-origin: 100% 100%`} />
 | 
				
			||||||
 | 
					        <div class="absolute top-0 left-0 w-16 h-16 interactive"
 | 
				
			||||||
 | 
					             style={`transform: rotate( ${90+safetyMargin}deg ); transform-origin: 100% 100%`} />
 | 
				
			||||||
 | 
					        <div class="absolute top-0 mt-8 left-0 w-32 h-32 interactive" />
 | 
				
			||||||
 | 
					        <div class="absolute w-30 h-30 top-0 left-0 rounded-full">
 | 
				
			||||||
 | 
					          <ArrowUpIcon class="" style={`transform: rotate( ${arrowDirection}deg )`} />
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      <div class="font-bold w-full flex justify-center items-center">
 | 
				
			||||||
 | 
					        {#if $value}
 | 
				
			||||||
 | 
					          <div class="text-5xl" on:click={() => {previewMode = oppMode(previewMode)}}>
 | 
				
			||||||
 | 
					            {$preview}
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					        {:else}
 | 
				
			||||||
 | 
					          <Tr cls="alert" t={Translations.t.validation.slope.inputIncorrect} />
 | 
				
			||||||
 | 
					        {/if}
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <div>
 | 
				
			||||||
 | 
					      <Tr t={Translations.t.validation.slope.inputExplanation} />
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					{/if}
 | 
				
			||||||
| 
						 | 
					@ -26,6 +26,7 @@ import FediverseValidator from "./Validators/FediverseValidator"
 | 
				
			||||||
import IconValidator from "./Validators/IconValidator"
 | 
					import IconValidator from "./Validators/IconValidator"
 | 
				
			||||||
import TagValidator from "./Validators/TagValidator"
 | 
					import TagValidator from "./Validators/TagValidator"
 | 
				
			||||||
import IdValidator from "./Validators/IdValidator"
 | 
					import IdValidator from "./Validators/IdValidator"
 | 
				
			||||||
 | 
					import SlopeValidator from "./Validators/SlopeValidator"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export type ValidatorType = (typeof Validators.availableTypes)[number]
 | 
					export type ValidatorType = (typeof Validators.availableTypes)[number]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -56,6 +57,7 @@ export default class Validators {
 | 
				
			||||||
        "tag",
 | 
					        "tag",
 | 
				
			||||||
        "fediverse",
 | 
					        "fediverse",
 | 
				
			||||||
        "id",
 | 
					        "id",
 | 
				
			||||||
 | 
					        "slope",
 | 
				
			||||||
    ] as const
 | 
					    ] as const
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public static readonly AllValidators: ReadonlyArray<Validator> = [
 | 
					    public static readonly AllValidators: ReadonlyArray<Validator> = [
 | 
				
			||||||
| 
						 | 
					@ -83,6 +85,7 @@ export default class Validators {
 | 
				
			||||||
        new IconValidator(),
 | 
					        new IconValidator(),
 | 
				
			||||||
        new FediverseValidator(),
 | 
					        new FediverseValidator(),
 | 
				
			||||||
        new IdValidator(),
 | 
					        new IdValidator(),
 | 
				
			||||||
 | 
					        new SlopeValidator(),
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static _byType = Validators._byTypeConstructor()
 | 
					    private static _byType = Validators._byTypeConstructor()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue