From 4af12dac4048ff334b9b80a20dd97c9388afd6de Mon Sep 17 00:00:00 2001 From: "Federico Pasqua (eisterman)" Date: Tue, 25 Mar 2025 17:55:47 +0100 Subject: [PATCH] Status route, preparing to make Overlay/Portal component --- src/lib/icons/BatteryIcon.svelte | 69 +++++++++++++++++++++++++ src/lib/types/ChargeController.ts | 58 +++++++++++++++++++++ src/lib/types/User.ts | 9 ++++ src/routes/+layout.ts | 5 +- src/routes/[qrcode]/+layout.ts | 7 ++- src/routes/[qrcode]/+page.svelte | 22 ++++++-- src/routes/[qrcode]/status/+page.svelte | 52 +++++++++++++++++-- 7 files changed, 210 insertions(+), 12 deletions(-) create mode 100644 src/lib/icons/BatteryIcon.svelte create mode 100644 src/lib/types/ChargeController.ts create mode 100644 src/lib/types/User.ts diff --git a/src/lib/icons/BatteryIcon.svelte b/src/lib/icons/BatteryIcon.svelte new file mode 100644 index 0000000..6e868a9 --- /dev/null +++ b/src/lib/icons/BatteryIcon.svelte @@ -0,0 +1,69 @@ +
+
+
+
+
+
+
+
+ + \ No newline at end of file diff --git a/src/lib/types/ChargeController.ts b/src/lib/types/ChargeController.ts new file mode 100644 index 0000000..feec924 --- /dev/null +++ b/src/lib/types/ChargeController.ts @@ -0,0 +1,58 @@ +export type ChargeUser = { + id: number; + username: string; +}; + +export type LastPower = { + chargingstation: number; + power: number; + timestamp: string; // ISO 8601 datetime string +}; + +export type ActiveCharge = { + id: number; + start: string; // ISO 8601 datetime string + stop: string | null; // ISO 8601 datetime string + user: ChargeUser; + last_nonzero_power_time: string | null; // ISO 8601 datetime string + energy_wh: number; + last_power: LastPower | null; + // coupon: string; +}; + +// custom_message_fallback_lang is guaranteed to exist +export type CustomMessage = { + en?: string, + it?: string, + de?: string, + fr?: string, + nl?: string, +} + +export type ChargeController = { + qrcodeid: number; + active_charge: ActiveCharge | null; + park: number; + park_bnum: number; + evse_id: string; + latitude: number; + longitude: number; + accept_guests: boolean; + is_payment_configured: boolean; + price: number; + override_logo_url: string; + show_phrases_frontend: boolean; + logged_user: ChargeUser | null; + has_charge_permission: boolean; + show_custom_message: boolean; + custom_message: CustomMessage; + country_alpha2: string; + custom_message_fallback_lang: string; + imprint_cents: number; + google_pay: boolean; + coupon_enabled: boolean; + last_power_timestamp: string | null; // ISO 8601 datetime string + suspended: boolean; + test_mode: boolean; + mandatory_email: boolean; +}; \ No newline at end of file diff --git a/src/lib/types/User.ts b/src/lib/types/User.ts new file mode 100644 index 0000000..af5802f --- /dev/null +++ b/src/lib/types/User.ts @@ -0,0 +1,9 @@ +export type User = { + id: number; + username: string; + email: string; + is_active: boolean; + is_staff: boolean; + is_superuser: boolean; + is_readonly: boolean; +}; \ No newline at end of file diff --git a/src/routes/+layout.ts b/src/routes/+layout.ts index 2a37154..a46f868 100644 --- a/src/routes/+layout.ts +++ b/src/routes/+layout.ts @@ -1,4 +1,5 @@ import type { LayoutLoad } from './$types'; +import type { User } from '$lib/types/User'; export const load: LayoutLoad = async ({ fetch }) => { const userRes = await fetch('/api/public/1/auth/myself/', { @@ -9,9 +10,9 @@ export const load: LayoutLoad = async ({ fetch }) => { }); if (!userRes.ok) return { user: null, - chargePermission: [], + chargePermission: [] as number[], }; - const user = await userRes.json(); + const user: User = await userRes.json(); const chargePermissionRes = await fetch(`/api/v3/users/${user['id']}/charge_permissions/`); const chargePermission: number[] = chargePermissionRes.ok ? (await chargePermissionRes.json())['authorized_qrcode'] : []; return { diff --git a/src/routes/[qrcode]/+layout.ts b/src/routes/[qrcode]/+layout.ts index a0c050c..29fe884 100644 --- a/src/routes/[qrcode]/+layout.ts +++ b/src/routes/[qrcode]/+layout.ts @@ -1,10 +1,11 @@ import type { LayoutLoad } from './$types'; import { error } from "@sveltejs/kit"; import { type } from "arktype"; +import type { ChargeController } from "$lib/types/ChargeController"; const QrcodeType = type("string.integer.parse"); -export const load: LayoutLoad = async ({ params, fetch, parent }) => { +export const load: LayoutLoad = async ({ params, fetch, parent, depends }) => { const qrcode = QrcodeType(params.qrcode); if (qrcode instanceof type.errors) error(400, 'invalid qrcode'); const cc = await fetch(`/api/v2/chargecontroller/${qrcode}/`, { @@ -13,10 +14,12 @@ export const load: LayoutLoad = async ({ params, fetch, parent }) => { 'Accept': 'application/json', } }); + depends('app:chargecontroller'); const parentData = await parent(); + const chargecontroller: ChargeController = await cc.json(); return { ...parentData, qrcode: qrcode, - chargecontroller: await cc.json(), + chargecontroller: chargecontroller, }; }; \ No newline at end of file diff --git a/src/routes/[qrcode]/+page.svelte b/src/routes/[qrcode]/+page.svelte index 77bb934..faab8ef 100644 --- a/src/routes/[qrcode]/+page.svelte +++ b/src/routes/[qrcode]/+page.svelte @@ -1,6 +1,8 @@
-
+
-
+ {#if showOverlay} + + {/if} +
{#if showOverlay} -
diff --git a/src/routes/[qrcode]/status/+page.svelte b/src/routes/[qrcode]/status/+page.svelte index 0faa8f9..8c65e80 100644 --- a/src/routes/[qrcode]/status/+page.svelte +++ b/src/routes/[qrcode]/status/+page.svelte @@ -1,3 +1,49 @@ -
- STATUS CARD -
\ No newline at end of file + + +
+
+ +
+
+

Energia erogata a {data.user.username}:

+

{energykWh} kWh

+

Potenza misurata: {powerkWh} kW

+
+
+ +
+
+

+ «Ciò che sta accadendo ci pone di fronte all’urgenza di procedere in una coraggiosa rivoluzione culturale.» +

+

+ Papa Francesco, Enciclica Laudato Si’ +

+
+