-
Notifications
You must be signed in to change notification settings - Fork 0
/
Answer.svelte
132 lines (125 loc) · 4.75 KB
/
Answer.svelte
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
<script lang="ts">
import { base } from '$app/paths';
import type Step from '$lib/quiz.json';
import { createEventDispatcher } from 'svelte';
import {
Card,
CardBody,
CardFooter,
CardHeader,
CardSubtitle,
CardText,
CardTitle,
Container,
Button,
Icon,
Row,
Col,
Toast,
Spinner
} from '@sveltestrap/sveltestrap';
const dispatch = createEventDispatcher();
export let question: Step;
export let check: boolean;
let src = question.answerImg;
let curLocation = { lat: 0, lng: 0 };
let closeEnough: boolean = false;
let isOpen = false;
function measure(lat1: number, lon1: number, lat2: number, lon2: number){ // generally used geo measurement function
var R = 6378.137; // Radius of earth in KM
var dLat = lat2 * Math.PI / 180 - lat1 * Math.PI / 180;
var dLon = lon2 * Math.PI / 180 - lon1 * Math.PI / 180;
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
Math.sin(dLon/2) * Math.sin(dLon/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c;
return d * 1000; // meters
}
function nextStep() {
dispatch('next', { step: true });
}
function canProceed() {
return measure(curLocation.lat, curLocation.lng, question.loc.lat, question.loc.lng) < 10;
}
function round(num: number, fractionDigits: number): number {
return Number(num.toFixed(fractionDigits));
}
let distance = 0.0;
function getPos() {
isOpen = true;
navigator.geolocation.getCurrentPosition((position) => {
curLocation.lat = position.coords.latitude;
curLocation.lng = position.coords.longitude;
distance = round(measure(curLocation.lat, curLocation.lng, question.loc.lat, question.loc.lng), 2);
closeEnough = !check || canProceed();
},
(error) => {
console.log(error);
// who cares, if they don't allow gps just let them go
closeEnough = true;
},
{maximumAge:5000, timeout:5000, enableHighAccuracy: true}
);
}
function onload(el: HTMLElement) {
getPos();
};
</script>
<Container fluid>
<Card class="mb-5">
<CardHeader>
<CardTitle style="text-align:center;">🌟 Perfekt! 🌟</CardTitle>
<CardText>{question.answerText}</CardText>
</CardHeader>
<CardBody class="py-0">
<Row class="border-bottom py-2">
<Col xs="6" class="align-self-center"><b>næste sted</b></Col>
<Col xs="auto"><CardText><Row>{question.loc.lat}</Row><Row>{question.loc.lng}</Row></CardText></Col>
</Row>
<Row class="py-2">
<Col xs="6">
<Row>
<b>du er her</b>
</Row>
<Row>
<span use:onload>
({distance} m)
</span>
</Row>
</Col>
<Col xs="3">
<CardText>
<Row>{curLocation.lat}</Row>
<Row>{curLocation.lng}</Row>
</CardText>
</Col>
<Col xs="2" class="align-self-center"><!-- autohide -->
<Button on:click={getPos} color="success"><Icon name="recycle"/></Button>
</Col>
<Col xs="1" class="align-self-center">
<Toast class="border-0 shadow-none" color="info" autohide delay={2000} fade {isOpen} on:close={() => (isOpen = false)}>
<Spinner size="sm" color="info" />
</Toast>
</Col>
</Row>
</CardBody>
<CardFooter>
<Row>
<Col xs="8">
<Icon name="pin-map-fill" /> åbne kortet:
<Button href="http://maps.apple.com/maps?q={question.loc.lat},{question.loc.lng}" target="_blank">
<Icon name="apple" />
</Button>
<Button href="http://maps.google.com/maps?q={question.loc.lat},{question.loc.lng}" target="_blank">
<Icon name="android" />
</Button>
</Col>
<Col xs="4" style="text-align: right;"><Button color="primary" on:click={nextStep} disabled={!closeEnough}>Næste</Button></Col>
</Row>
</CardFooter>
</Card>
</Container>
<Container fluid>
<img src={base + src} alt="..." class="img-fluid" />
</Container>