diff --git a/web/src/lib/components/summit_log/summit_log_modal.svelte b/web/src/lib/components/summit_log/summit_log_modal.svelte
index 166b568d..b8e82572 100644
--- a/web/src/lib/components/summit_log/summit_log_modal.svelte
+++ b/web/src/lib/components/summit_log/summit_log_modal.svelte
@@ -4,6 +4,7 @@
import { SummitLogCreateSchema } from "$lib/models/api/summit_log_schema";
import GPX from "$lib/models/gpx/gpx";
import { summitLog } from "$lib/stores/summit_log_store";
+ import { fetchGPX } from "$lib/stores/trail_store";
import { cloneDeep } from "$lib/util/deep_util";
import { validator } from "@felte/validator-zod";
import { createForm } from "felte";
@@ -45,10 +46,6 @@
initialValues: $summitLog,
extend: validator({ schema: ClientSummitLogCreateSchema }),
onSubmit: async (form) => {
- if (!form.expand?.gpx_data) {
- form.gpx = "";
- }
-
if (
!form._photos?.length &&
!form.photos?.length &&
@@ -69,8 +66,6 @@
},
});
- let trailData = $derived($data.expand?.gpx_data);
-
$effect(() => {
setFields(cloneDeep($summitLog));
});
@@ -81,12 +76,42 @@
}
});
+ let gpxLoading = $state(false);
+
+ async function ensureGpxDataLoaded() {
+ if (gpxLoading || !$data.id || !$data.gpx || $data.expand?.gpx_data) {
+ return;
+ }
+ gpxLoading = true;
+ try {
+ const gpxData = await fetchGPX($data as any, fetch);
+ if (!gpxData) {
+ return;
+ }
+ if (!$data.expand) {
+ $data.expand = {};
+ }
+ $data.expand.gpx_data = gpxData;
+ } finally {
+ gpxLoading = false;
+ }
+ }
+
+ $effect(() => {
+ void ensureGpxDataLoaded();
+ });
+
async function handleTrailSelection(trailData: string | null) {
if (!trailData) {
$data.duration = undefined;
$data.elevation_gain = undefined;
$data.elevation_loss = undefined;
$data.distance = undefined;
+ $data.gpx = "";
+ if ($data.expand) {
+ $data.expand.gpx_data = undefined;
+ }
+ $data._gpx = null;
return;
}
const gpxObject = GPX.parse(trailData);
@@ -141,7 +166,8 @@
{#if $data.expand}
handleTrailSelection(trail)}
>
diff --git a/web/src/lib/components/trail/trail_picker.svelte b/web/src/lib/components/trail/trail_picker.svelte
index a4cd3162..deb2c46d 100644
--- a/web/src/lib/components/trail/trail_picker.svelte
+++ b/web/src/lib/components/trail/trail_picker.svelte
@@ -7,6 +7,7 @@
interface Props {
trailFile: File | undefined | null;
trailData: string | undefined;
+ hasTrail?: boolean;
label?: string;
onchange: (data: string | null) => void;
}
@@ -14,6 +15,7 @@
let {
trailFile = $bindable(),
trailData = $bindable(),
+ hasTrail = false,
label = "",
onchange
}: Props = $props();
@@ -38,8 +40,12 @@
});
}
+ const hasTrailState = $derived(
+ Boolean(trailFile || trailData || hasTrail),
+ );
+
function openTrailBrowser() {
- if (trailData) {
+ if (hasTrailState) {
trailFile = null;
trailData = undefined;
@@ -151,7 +157,7 @@
class="h-28 aspect-square rounded-xl !bg-background border border-input-border-focus hover:!bg-secondary-hover group"
id="trail-picker-map"
>
- {#if !trailFile && !trailData}
+ {#if !hasTrailState}
{:else}