feat: deep linking for hosted URLs and openconcho:// scheme

Add /explore redirect route that maps Honcho's deep-link shape
(?workspace=...&view=...&session=...) onto our existing flat routes,
so any app.honcho.dev URL works against a self-hosted instance by
swapping the host.

Wire tauri-plugin-deep-link to register the openconcho:// scheme on
desktop and forward incoming URLs into the router on launch and at
runtime.
This commit is contained in:
Offending Commit
2026-05-04 10:12:25 -05:00
parent 2b0844d4d3
commit 578c8f4c46
11 changed files with 297 additions and 18 deletions

View File

@@ -0,0 +1,73 @@
import { createFileRoute, redirect } from "@tanstack/react-router";
type ExploreSearch = {
workspace?: string;
view?: "sessions" | "peers" | "conclusions" | "webhooks";
session?: string;
peer?: string;
};
export const Route = createFileRoute("/explore")({
validateSearch: (search: Record<string, unknown>): ExploreSearch => ({
workspace: typeof search.workspace === "string" ? search.workspace : undefined,
view:
search.view === "sessions" ||
search.view === "peers" ||
search.view === "conclusions" ||
search.view === "webhooks"
? search.view
: undefined,
session: typeof search.session === "string" ? search.session : undefined,
peer: typeof search.peer === "string" ? search.peer : undefined,
}),
loaderDeps: ({ search }) => search,
loader: ({ deps }) => {
const { workspace, view, session, peer } = deps;
if (!workspace) {
throw redirect({ to: "/workspaces" as never });
}
if (view === "sessions" && session) {
throw redirect({
to: "/workspaces/$workspaceId/sessions/$sessionId" as never,
params: { workspaceId: workspace, sessionId: session } as never,
});
}
if (view === "sessions") {
throw redirect({
to: "/workspaces/$workspaceId/sessions" as never,
params: { workspaceId: workspace } as never,
});
}
if (view === "peers" && peer) {
throw redirect({
to: "/workspaces/$workspaceId/peers/$peerId" as never,
params: { workspaceId: workspace, peerId: peer } as never,
});
}
if (view === "peers") {
throw redirect({
to: "/workspaces/$workspaceId/peers" as never,
params: { workspaceId: workspace } as never,
});
}
if (view === "conclusions") {
throw redirect({
to: "/workspaces/$workspaceId/conclusions" as never,
params: { workspaceId: workspace } as never,
});
}
if (view === "webhooks") {
throw redirect({
to: "/workspaces/$workspaceId/webhooks" as never,
params: { workspaceId: workspace } as never,
});
}
throw redirect({
to: "/workspaces/$workspaceId" as never,
params: { workspaceId: workspace } as never,
});
},
});