Merge pull request #20 from trails-cool/fix-automerge-ready-state

This commit is contained in:
github-actions[bot] 2026-03-22 23:51:37 +00:00 committed by GitHub
commit b83384ab17
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 96 additions and 45 deletions

View file

@ -30,4 +30,5 @@ jobs:
MERGE_LABELS: "automerge" MERGE_LABELS: "automerge"
MERGE_METHOD: "merge" MERGE_METHOD: "merge"
MERGE_DELETE_BRANCH: "true" MERGE_DELETE_BRANCH: "true"
MERGE_READY_STATE: "clean"
UPDATE_METHOD: "rebase" UPDATE_METHOD: "rebase"

View file

@ -0,0 +1,17 @@
import { useState, useEffect, type ReactNode } from "react";
export function ClientOnly({
children,
fallback = null,
}: {
children: () => ReactNode;
fallback?: ReactNode;
}) {
const [mounted, setMounted] = useState(false);
useEffect(() => {
setMounted(true);
}, []);
return mounted ? <>{children()}</> : <>{fallback}</>;
}

View file

@ -0,0 +1,62 @@
import { Suspense, lazy } from "react";
import { useYjs } from "~/lib/use-yjs";
import { useRouting } from "~/lib/use-routing";
const PlannerMap = lazy(() =>
import("~/components/PlannerMap").then((m) => ({ default: m.PlannerMap })),
);
const WaypointSidebar = lazy(() =>
import("~/components/WaypointSidebar").then((m) => ({ default: m.WaypointSidebar })),
);
export function SessionView({ sessionId }: { sessionId: string }) {
const yjs = useYjs(sessionId);
const { isHost, computing, routeStats, requestRoute } = useRouting(yjs);
if (!yjs) {
return (
<div className="flex h-full items-center justify-center">
<p className="text-gray-500">Connecting...</p>
</div>
);
}
return (
<>
<header className="flex items-center justify-between border-b border-gray-200 px-4 py-2">
<h1 className="text-lg font-semibold text-gray-900">trails.cool Planner</h1>
<div className="flex items-center gap-3">
{computing && (
<span className="text-xs text-blue-600">Computing route...</span>
)}
{isHost && (
<span className="rounded-full bg-green-100 px-2 py-0.5 text-xs text-green-700">
Host
</span>
)}
<span className="text-sm text-gray-500">
{yjs.connected ? "Connected" : "Connecting..."} · {sessionId.slice(0, 8)}
</span>
</div>
</header>
<div className="flex flex-1 overflow-hidden">
<main className="flex-1">
<Suspense
fallback={
<div className="flex h-full items-center justify-center bg-gray-100 text-gray-500">
Loading map...
</div>
}
>
<PlannerMap yjs={yjs} onRouteRequest={requestRoute} />
</Suspense>
</main>
<aside className="w-72 border-l border-gray-200 bg-white">
<Suspense fallback={null}>
<WaypointSidebar yjs={yjs} routeStats={routeStats} />
</Suspense>
</aside>
</div>
</>
);
}

View file

@ -2,15 +2,11 @@ import { useParams } from "react-router";
import type { Route } from "./+types/session.$id"; import type { Route } from "./+types/session.$id";
import { getSession } from "~/lib/sessions"; import { getSession } from "~/lib/sessions";
import { data } from "react-router"; import { data } from "react-router";
import { useYjs } from "~/lib/use-yjs"; import { ClientOnly } from "~/components/ClientOnly";
import { useRouting } from "~/lib/use-routing";
import { lazy, Suspense } from "react"; import { lazy, Suspense } from "react";
const PlannerMap = lazy(() => const SessionView = lazy(() =>
import("~/components/PlannerMap").then((m) => ({ default: m.PlannerMap })), import("~/components/SessionView").then((m) => ({ default: m.SessionView })),
);
const WaypointSidebar = lazy(() =>
import("~/components/WaypointSidebar").then((m) => ({ default: m.WaypointSidebar })),
); );
export function meta(_args: Route.MetaArgs) { export function meta(_args: Route.MetaArgs) {
@ -30,53 +26,28 @@ export async function loader({ params }: Route.LoaderArgs) {
export default function SessionPage() { export default function SessionPage() {
const { id } = useParams(); const { id } = useParams();
const yjs = useYjs(id!);
const { isHost, computing, routeStats, requestRoute } = useRouting(yjs);
if (!yjs) {
return (
<div className="flex h-full items-center justify-center">
<p className="text-gray-500">Connecting...</p>
</div>
);
}
return ( return (
<div className="flex h-full flex-col"> <div className="flex h-full flex-col">
<header className="flex items-center justify-between border-b border-gray-200 px-4 py-2"> <ClientOnly
<h1 className="text-lg font-semibold text-gray-900">trails.cool Planner</h1> fallback={
<div className="flex items-center gap-3"> <div className="flex h-full items-center justify-center">
{computing && ( <p className="text-gray-500">Loading planner...</p>
<span className="text-xs text-blue-600">Computing route...</span> </div>
)} }
{isHost && ( >
<span className="rounded-full bg-green-100 px-2 py-0.5 text-xs text-green-700"> {() => (
Host
</span>
)}
<span className="text-sm text-gray-500">
{yjs.connected ? "Connected" : "Connecting..."} · {id?.slice(0, 8)}
</span>
</div>
</header>
<div className="flex flex-1 overflow-hidden">
<main className="flex-1">
<Suspense <Suspense
fallback={ fallback={
<div className="flex h-full items-center justify-center bg-gray-100 text-gray-500"> <div className="flex h-full items-center justify-center">
Loading map... <p className="text-gray-500">Loading planner...</p>
</div> </div>
} }
> >
<PlannerMap yjs={yjs} onRouteRequest={requestRoute} /> <SessionView sessionId={id!} />
</Suspense> </Suspense>
</main> )}
<aside className="w-72 border-l border-gray-200 bg-white"> </ClientOnly>
<Suspense fallback={null}>
<WaypointSidebar yjs={yjs} routeStats={routeStats} />
</Suspense>
</aside>
</div>
</div> </div>
); );
} }