+ This email belongs to a registered user. Please
+ log in
+ instead to access your bookings and rewards.
+
+ {:else if emailSuggestion === 'check'}
+
+ This email might belong to an existing account. Please double-check or
+ log in.
+
+ {/if}
{/if}
@@ -2000,8 +2109,9 @@
{#if isRequested}
- Please note: Because you included special requests, the cost and duration
- shown are estimates. We may adjust these after reviewing your requirements. You'll receive
+ Please note: Because you included special requests, the cost and
+ duration shown are estimates. We may adjust these after reviewing your requirements.
+ You'll receive
{authStore.isAuthenticated ? ' a notification' : ' an email'} once your booking is approved.
diff --git a/frontend/src/routes/account/+page.svelte b/frontend/src/routes/account/+page.svelte
index da60216..daa43c1 100644
--- a/frontend/src/routes/account/+page.svelte
+++ b/frontend/src/routes/account/+page.svelte
@@ -28,6 +28,7 @@
import { Checkbox } from '$lib/components/ui/checkbox';
import * as Card from '$lib/components/ui/card';
import { Input } from '$lib/components/ui/input';
+ import { PhoneInput } from '$lib/components/ui/phone-input/index.js';
import { Separator } from '$lib/components/ui/separator';
import * as AlertDialog from '$lib/components/ui/alert-dialog';
import { Skeleton } from '$lib/components/ui/skeleton';
@@ -156,6 +157,7 @@
let giftCardCode = $state('');
let redeemingGiftCard = $state(false);
+ let showRedeemConfirm = $state(false);
// Buy Gift Card State
let buyAmount = $state<10 | 20 | 50>(10);
@@ -728,7 +730,7 @@
}
function formatPhoneInput(value: string): string {
- return formatPhoneDisplay(phone);
+ return formatPhoneDisplay(value);
}
function startEditPhone() {
@@ -746,6 +748,8 @@
async function savePhone() {
const formattedPhone = toE164UK(phoneInput);
if (!formattedPhone) {
+ phoneError = 'Invalid UK phone number';
+ toast.error('Please enter a valid UK phone number');
return;
}
@@ -1386,18 +1390,14 @@
Phone
{#if editingPhone}
-
- {#if phoneError}
-
{phoneError}
- {/if}
-
+
+
+
+ Redeem Gift Card
+
+ Claiming this gift card will add its remaining balance directly to your
+ account balance, which can be used toward future bookings.
+
+
+
+
+
+ What happens when I claim?
+
+
+
The gift card value is added to your account balance.
+
+ Account balances do not expire, but gift card codes become invalid once
+ redeemed.
+
+
+ This action is final and cannot be reversed.
+
+
+
+
+
+ Legal & GDPR Information
+
+
+
+ Your personal data (name, email, transaction history) is processed in
+ accordance with UK data protection law.
+
+
+ Financial records are retained for 7 years as required by HMRC, after
+ which personally identifiable information is anonymised.
+
+
+ You can request a full copy of your data or deletion of your account
+ at any time via your account settings.
+
+
+
+
+
+ By redeeming this gift card, you agree to our Terms & Conditions.
+ Link T&Cs here once available.
+
+
+
+ Cancel
+ Confirm & Redeem
+
+
+
+
diff --git a/frontend/src/routes/login/+page.svelte b/frontend/src/routes/login/+page.svelte
index f40bc0c..3b19bb3 100644
--- a/frontend/src/routes/login/+page.svelte
+++ b/frontend/src/routes/login/+page.svelte
@@ -2,11 +2,12 @@
import { resolve } from '$app/paths';
import { Button } from '$lib/components/ui/button/index.js';
import { Input } from '$lib/components/ui/input/index.js';
+ import { PhoneInput } from '$lib/components/ui/phone-input/index.js';
import { Label } from '$lib/components/ui/label/index.js';
import { Separator } from '$lib/components/ui/separator/index.js';
import { Checkbox } from '$lib/components/ui/checkbox/index.js';
import RequiredLabel from '$lib/components/layout/RequiredLabel.svelte';
- import { isValidUKPhone, formatPhoneDisplay, toE164UK } from '$lib/utils/phone';
+ import { isValidUKPhone, toE164UK } from '$lib/utils/phone';
import { SvelteDate } from 'svelte/reactivity';
// zxcvbn-ts imports
@@ -98,17 +99,9 @@
}
function validatePhone(phone: string): boolean {
- return isValidUKPhone(phone);
- }
-
- function formatPhoneInput(value: string): string {
- return formatPhoneDisplay(value);
- }
-
- function handlePhoneInput(e: Event) {
- const target = e.target as HTMLInputElement;
- const rawValue = target.value;
- formData.phone = formatPhoneInput(rawValue);
+ const valid = isValidUKPhone(phone);
+ validationErrors.phone = valid ? '' : 'Please enter a valid UK phone number';
+ return valid;
}
// Age validation (must be 16+)
@@ -498,19 +491,13 @@