App

Bundles

Stats
BundleMinifiedGzipBrotli
index.js8.41 kB3.49 kB3.13 kB

Source

<script>
	export let label;
	export let date;
	export let errorMsg;
	export let disabled = false;

	const inputId = `${label}-date`;
</script>

<div class="form-group {errorMsg ? 'has-error' : ''}">
	<label class="form-label" for="{inputId}">{label}</label
	><input
		id="{inputId}"
		class="form-input"
		type="text"
		bind:value="{date}"
		disabled="{disabled}"
	/>
	{#if errorMsg}
	<p class="form-input-hint">{errorMsg}</p>
	{/if}
</div>
<script>
	import { today, validateDate } from "../../../../lib/date";
	import TripType from "./TripType.html";
	import DateEntry from "./DateEntry.html";

	const oneWayFlight = "one-way";
	const returnFlight = "return";

	let departing = today();
	let returning = departing;

	$: departingError = getErrorMessage(departing);
	$: returningError = getErrorMessage(returning);
	$: if (
		departingError == null &&
		returningError == null &&
		tripType == returnFlight &&
		returning < departing
	) {
		returningError = "Returning date must be on or after departing date.";
	}

	let tripType = oneWayFlight;

	$: isBookDisabled = departingError || returningError;

	function getErrorMessage(date) {
		try {
			validateDate(date);
			return null;
		} catch (error) {
			return error.message;
		}
	}

	function bookFlight() {
		const type = tripType == returnFlight ? "return" : "one-way";

		let message = `You have booked a ${type} flight, leaving ${departing}`;
		if (type === "return") {
			message += ` and returning ${returning}`;
		}

		alert(message);
	}
</script>

<TripType bind:tripType="{tripType}"></TripType>
<DateEntry
	label="Departing"
	bind:date="{departing}"
	errorMsg="{departingError}"
></DateEntry>
<DateEntry
	label="Returning"
	bind:date="{returning}"
	errorMsg="{returningError}"
	disabled="{tripType == oneWayFlight}"
></DateEntry>

<div class="form-group">
	<button
		class="btn btn-primary"
		on:click="{bookFlight}"
		disabled="{isBookDisabled}"
	>
		book
	</button>
</div>
<script>
	import { oneWayFlight, returnFlight } from "./constants";
	export let tripType;
</script>

<div class="form-group">
	<label class="form-label" for="trip-type">Trip type</label
	><select id="trip-type" class="form-select" bind:value="{tripType}">
		<option value="{oneWayFlight}">one-way flight</option>
		<option value="{returnFlight}">return flight</option>
	</select>
</div>
export const oneWayFlight = "one-way";
export const returnFlight = "return";
import App from "./FlightBooker.html";

new App({
	target: document.getElementById("app")
});