2025-06-07 04:46:43 +02:00
|
|
|
<script lang="ts">
|
|
|
|
/**
|
|
|
|
* Element that labels the GPS state
|
|
|
|
*/
|
|
|
|
import { fade } from "svelte/transition"
|
|
|
|
import ThemeViewState from "../../Models/ThemeViewState"
|
|
|
|
import Tr from "../Base/Tr.svelte"
|
|
|
|
import { onDestroy } from "svelte"
|
|
|
|
import { Popover } from "flowbite-svelte"
|
|
|
|
|
|
|
|
export let state: ThemeViewState
|
|
|
|
let gpsState = state.geolocationState
|
|
|
|
export let mapIsDragged: Store<void>
|
|
|
|
let open = true
|
|
|
|
|
|
|
|
function showFor(timeoutSeconds: number = 5) {
|
|
|
|
open = true
|
|
|
|
window.setTimeout(() => {
|
2025-06-18 21:40:01 +02:00
|
|
|
open = false
|
|
|
|
}, timeoutSeconds * 1000)
|
2025-06-07 04:46:43 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
mapIsDragged.addCallback(() => {
|
|
|
|
const movingIsAllowed = gpsState.allowMoving.data
|
|
|
|
if (!movingIsAllowed) {
|
|
|
|
showFor(5)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
gpsState.requestMoment.stabilized(50).addCallback(() => {
|
2025-06-18 21:40:01 +02:00
|
|
|
if (gpsState.gpsAvailable.data && gpsState.allowMoving.data) {
|
2025-06-07 04:46:43 +02:00
|
|
|
return
|
|
|
|
}
|
|
|
|
showFor(5)
|
|
|
|
})
|
|
|
|
let explanation = gpsState.gpsStateExplanation
|
|
|
|
onDestroy(
|
2025-06-18 21:40:01 +02:00
|
|
|
explanation.stabilized(50).addCallbackD((expl) => {
|
|
|
|
if (expl) {
|
|
|
|
showFor(5)
|
|
|
|
} else {
|
|
|
|
open = false
|
|
|
|
}
|
|
|
|
})
|
2025-06-07 04:46:43 +02:00
|
|
|
)
|
|
|
|
</script>
|
|
|
|
|
2025-06-18 21:40:01 +02:00
|
|
|
<Popover
|
|
|
|
reference={undefined}
|
|
|
|
trigger="null"
|
|
|
|
placement="left"
|
|
|
|
transition={(e) => fade(e, { duration: 150 })}
|
|
|
|
bind:open
|
|
|
|
>
|
2025-06-07 04:46:43 +02:00
|
|
|
<div class="break-words" style="max-width: calc( 100vw - 8rem)">
|
|
|
|
<Tr t={$explanation} />
|
|
|
|
</div>
|
|
|
|
</Popover>
|