160 lines
4.5 KiB
Svelte
Raw Normal View History

<script lang="ts">
2024-04-30 11:17:06 +01:00
import Header from "$lib/navigation/header.svelte";
import Island from "$lib/islands/island.svelte";
import Nav from "$lib/navigation/nav.svelte";
import { uuid } from "$lib/stores/uuid";
2023-06-13 13:38:59 +01:00
2024-04-30 11:17:06 +01:00
import { onMount } from "svelte";
import TrainDetail from "$lib/train/train-detail.svelte";
import { getApiUrl } from "$lib/scripts/upstream";
2024-06-13 21:59:01 +01:00
import toast from "svelte-french-toast";
import TimeBar from "$lib/navigation/TimeBar.svelte";
import { IconArrowLeft, IconArrowRight, IconCheck } from "@tabler/icons-svelte";
2024-11-15 11:34:02 +00:00
import Error from "../+error.svelte";
2023-06-13 13:38:59 +01:00
2024-04-30 11:17:06 +01:00
let title = "Timetable Results";
let id = "";
let data = [];
let error = false;
let errMsg = "";
2023-06-20 19:22:59 +01:00
2024-11-15 11:34:02 +00:00
let formattedDate = new Date().toISOString().split('T')[0];
2024-04-30 11:17:06 +01:00
$: {
if (id) {
title = id.toUpperCase();
} else {
title = "Querying Timetable";
}
2023-06-13 13:38:59 +01:00
}
2024-04-30 11:17:06 +01:00
async function getHeadcode() {
return new URLSearchParams(window.location.search).get("headcode");
2023-07-07 11:27:28 +01:00
}
function incrementDate() {
2024-11-15 11:34:02 +00:00
let dateInput = new Date(formattedDate)
dateInput.setDate(dateInput.getDate() + 1);
2024-11-15 11:34:02 +00:00
formattedDate = dateInput.toISOString().split('T')[0];
}
function decrementDate() {
2024-11-15 11:34:02 +00:00
let dateInput = new Date(formattedDate)
dateInput.setDate(dateInput.getDate() - 1);
2024-11-15 11:34:02 +00:00
formattedDate = dateInput.toISOString().split('T')[0];
}
2024-04-30 11:17:06 +01:00
onMount(async () => {
id = (await getHeadcode()) || "";
load();
2024-06-13 21:59:01 +01:00
toast("Registration soon required for timetable features.\n\nClick 'Register' in the menu.", {
duration: 3000,
});
2024-04-30 11:17:06 +01:00
});
function load() {
2024-11-15 11:34:02 +00:00
error = false;
const selectedDate = new Date(formattedDate);
const currentDate = new Date();
const difference: number = currentDate.getTime() - selectedDate.getTime();
const differenceDays: number = difference / (1000 * 60 * 60 * 24)
if (differenceDays > 7) {
toast.error("Timetable data is not available for dates older than a week")
return
}
toast.promise(
fetchData(id),
{
loading: 'Searching Timetable',
success: 'Done',
error: 'Error'
}
)
}
2024-04-30 11:17:06 +01:00
async function fetchData(id = "") {
data = [];
2024-04-30 11:17:06 +01:00
const searchType = "headcode";
const options = {
method: "GET",
headers: {
2024-04-30 11:18:21 +01:00
uuid: $uuid,
},
2024-04-30 11:17:06 +01:00
};
const url = `${getApiUrl()}/api/v2/timetable/train/${formattedDate}/${searchType}/${id}`;
2024-04-30 11:17:06 +01:00
try {
const res = await fetch(url, options);
if (res.status == 200) {
let services = await res.json();
if (!services.length) {
error = true;
errMsg = "No services found";
return Promise.reject(new Error(errMsg));
}
data = services
2024-04-30 11:17:06 +01:00
} else if (res.status === 401) {
error = true;
errMsg = "You must be logged into the staff version for this feature";
return Promise.reject(new Error(errMsg));
2024-04-30 11:17:06 +01:00
} else {
error = true;
errMsg = "Unable to connect, check your connection and try again";
return Promise.reject(new Error(errMsg));
2024-04-30 11:17:06 +01:00
}
} catch (err) {
error = true;
errMsg = "Connection error, try again later";
return Promise.reject(new Error(errMsg));
2024-04-30 11:17:06 +01:00
}
2023-07-08 21:54:33 +01:00
}
</script>
2023-06-13 13:38:59 +01:00
<Header {title} />
<TimeBar updatedTime={undefined} />
<div id="dateSelector">
<button on:click={decrementDate}><IconArrowLeft /></button>
<input
type="date"
id="dateInput"
2024-11-15 11:34:02 +00:00
bind:value={formattedDate}
/>
<button on:click={incrementDate}><IconArrowRight /></button>
<button on:click={load}><IconCheck /></button>
</div>
2023-06-27 12:38:41 +01:00
{#if error}
2024-04-30 11:17:06 +01:00
<Island>
<p style="font-weight:600">{errMsg}</p>
</Island>
2023-06-27 12:38:41 +01:00
{/if}
{#each data as service}
2024-04-30 11:17:06 +01:00
{#if service}
2024-11-15 11:34:02 +00:00
<TrainDetail {service} date={new Date(formattedDate)} />
2024-04-30 11:17:06 +01:00
{/if}
{/each}
2023-07-07 11:27:28 +01:00
2023-06-20 19:22:59 +01:00
<Nav />
<style>
2024-04-30 11:17:06 +01:00
p {
color: white;
font-size: 18px;
font-weight: 600;
}
#dateInput {
height: 25px;
2024-11-15 11:34:02 +00:00
transform: translateY(-30px);
transform: translateX(20px);
}
button {
background: none;
border: none;
color: white;
2024-11-15 11:34:02 +00:00
transform: translateX(20px);
}
2023-07-07 11:27:28 +01:00
</style>