Fix overnight flag lost on Journal roundtrip

Three gaps in the Planner → Journal → Planner roundtrip:

1. SaveToJournalButton: wasn't including isDayBreak when building
   waypoints for GPX generation
2. PlannerMap GPX import: wasn't setting overnight on Y.Maps when
   importing waypoints with isDayBreak
3. use-yjs initial waypoints: wasn't setting overnight from isDayBreak

Also widened the waypoint type throughout the chain (api.sessions,
session.$id, SessionView, extractWaypoints) to carry isDayBreak.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ullrich Schäfer 2026-04-11 00:27:09 +02:00
parent 2970a460f8
commit 857100ef94
No known key found for this signature in database
GPG key ID: A32FF691A0F752D9
7 changed files with 9 additions and 5 deletions

View file

@ -411,6 +411,8 @@ export function PlannerMap({ yjs, onRouteRequest, highlightPosition, onImportErr
const yMap = new Y.Map();
yMap.set("lat", wp.lat);
yMap.set("lon", wp.lon);
if (wp.name) yMap.set("name", wp.name);
if (wp.isDayBreak) yMap.set("overnight", true);
yjs.waypoints.push([yMap]);
}

View file

@ -45,6 +45,7 @@ export function SaveToJournalButton({ yjs, callbackUrl, callbackToken, returnUrl
lat: yMap.get("lat") as number,
lon: yMap.get("lon") as number,
name: yMap.get("name") as string | undefined,
isDayBreak: yMap.get("overnight") === true ? true : undefined,
}));
const gpx = generateGpx({ name: "trails.cool route", waypoints, tracks, noGoAreas });

View file

@ -180,7 +180,7 @@ interface SessionViewProps {
callbackUrl?: string;
callbackToken?: string;
returnUrl?: string;
initialWaypoints?: Array<{ lat: number; lon: number; name?: string }>;
initialWaypoints?: Array<{ lat: number; lon: number; name?: string; isDayBreak?: boolean }>;
initialNoGoAreas?: Array<{ points: Array<{ lat: number; lon: number }> }>;
}

View file

@ -42,7 +42,7 @@ export interface YjsState {
export function useYjs(
sessionId: string,
initialWaypoints?: Array<{ lat: number; lon: number; name?: string }>,
initialWaypoints?: Array<{ lat: number; lon: number; name?: string; isDayBreak?: boolean }>,
initialNoGoAreas?: Array<{ points: Array<{ lat: number; lon: number }> }>,
): YjsState | null {
const [state, setState] = useState<YjsState | null>(null);
@ -106,6 +106,7 @@ export function useYjs(
yMap.set("lat", wp.lat);
yMap.set("lon", wp.lon);
if (wp.name) yMap.set("name", wp.name);
if (wp.isDayBreak) yMap.set("overnight", true);
waypoints.push([yMap]);
}
if (initialNoGoAreas?.length && noGoAreas.length === 0) {

View file

@ -19,7 +19,7 @@ export async function action({ request }: Route.ActionArgs) {
return withDb(async () => {
const session = await createSession({ callbackUrl, callbackToken });
let initialWaypoints: Array<{ lat: number; lon: number; name?: string }> | undefined;
let initialWaypoints: Array<{ lat: number; lon: number; name?: string; isDayBreak?: boolean }> | undefined;
let initialNoGoAreas: Array<{ points: Array<{ lat: number; lon: number }> }> | undefined;
if (gpx) {
try {

View file

@ -33,7 +33,7 @@ export default function SessionPage({ loaderData }: Route.ComponentProps) {
const [searchParams] = useSearchParams();
const returnUrl = searchParams.get("returnUrl") ?? undefined;
const waypointsParam = searchParams.get("waypoints");
let initialWaypoints: Array<{ lat: number; lon: number; name?: string }> | undefined;
let initialWaypoints: Array<{ lat: number; lon: number; name?: string; isDayBreak?: boolean }> | undefined;
if (waypointsParam) {
try { initialWaypoints = JSON.parse(waypointsParam); } catch { /* ignore */ }
}

View file

@ -5,7 +5,7 @@ import type { GpxData } from "./types.ts";
* Uses explicit <wpt> elements if present, otherwise simplifies the
* track using Douglas-Peucker to find significant turning points.
*/
export function extractWaypoints(gpxData: GpxData): Array<{ lat: number; lon: number; name?: string }> {
export function extractWaypoints(gpxData: GpxData): Array<{ lat: number; lon: number; name?: string; isDayBreak?: boolean }> {
if (gpxData.waypoints.length > 0) return gpxData.waypoints;
if (gpxData.tracks.length === 0) return [];