Radish alpha
r
Radicle desktop app
Radicle
Git (anonymous pull)
Log in to clone via SSH
Add releases route definitions
Daniel Norman committed 7 days ago
commit 71a55f31121b9cf4330d077f387d5019d17731d0
parent 3b77ce18f5160340e99c25969ca9e856e1f19285
3 files changed +102 -4
modified src/lib/router.ts
@@ -169,7 +169,9 @@ export function routeToPath(route: Route): string {
    route.resource === "repo.issue" ||
    route.resource === "repo.issues" ||
    route.resource === "repo.patch" ||
-
    route.resource === "repo.patches"
+
    route.resource === "repo.patches" ||
+
    route.resource === "repo.releases" ||
+
    route.resource === "repo.release"
  ) {
    return repoRouteToPath(route);
  } else if (route.resource === "booting") {
modified src/lib/router/definitions.ts
@@ -8,6 +8,8 @@ import {
  loadIssues,
  loadPatch,
  loadPatches,
+
  loadRelease,
+
  loadReleases,
  loadRepoCommit,
  loadRepoCommits,
  loadRepoHome,
@@ -64,7 +66,9 @@ export function isLoadedRepoRoute(
    route.resource === "repo.issue" ||
    route.resource === "repo.issues" ||
    route.resource === "repo.patch" ||
-
    route.resource === "repo.patches"
+
    route.resource === "repo.patches" ||
+
    route.resource === "repo.releases" ||
+
    route.resource === "repo.release"
  );
}

@@ -119,6 +123,15 @@ export async function loadRoute(
    return loadPatch(route);
  } else if (route.resource === "repo.patches") {
    return loadPatches(route);
+
  } else if (route.resource === "repo.releases") {
+
    return loadReleases(route);
+
  } else if (route.resource === "repo.release") {
+
    const loaded = await loadRelease(route);
+
    if (loaded) {
+
      return loaded;
+
    }
+
    // Fall back to the list when a release id no longer exists.
+
    return loadReleases({ resource: "repo.releases", rid: route.rid });
  }
  return route;
}
modified src/views/repo/router.ts
@@ -6,6 +6,7 @@ import type { Action as PatchAction } from "@bindings/cob/patch/Action";
import type { Patch } from "@bindings/cob/patch/Patch";
import type { Review } from "@bindings/cob/patch/Review";
import type { Revision } from "@bindings/cob/patch/Revision";
+
import type { Release } from "@bindings/cob/release/Release";
import type { Thread } from "@bindings/cob/thread/Thread";
import type { Config } from "@bindings/config/Config";
import type { Diff } from "@bindings/diff/Diff";
@@ -151,6 +152,36 @@ export interface LoadedRepoPatchesRoute {
  };
}

+
export interface RepoReleasesRoute {
+
  resource: "repo.releases";
+
  rid: string;
+
}
+

+
export interface LoadedRepoReleasesRoute {
+
  resource: "repo.releases";
+
  params: {
+
    repo: RepoInfo;
+
    releases: Release[];
+
    sidebarData: SidebarData;
+
  };
+
}
+

+
export interface RepoReleaseRoute {
+
  resource: "repo.release";
+
  rid: string;
+
  release: string;
+
}
+

+
export interface LoadedRepoReleaseRoute {
+
  resource: "repo.release";
+
  params: {
+
    repo: RepoInfo;
+
    releases: Release[];
+
    release: Release;
+
    sidebarData: SidebarData;
+
  };
+
}
+

export type RepoRoute =
  | RepoHomeRoute
  | RepoCommitsRoute
@@ -158,7 +189,9 @@ export type RepoRoute =
  | RepoIssueRoute
  | RepoIssuesRoute
  | RepoPatchRoute
-
  | RepoPatchesRoute;
+
  | RepoPatchesRoute
+
  | RepoReleasesRoute
+
  | RepoReleaseRoute;
export type LoadedRepoRoute =
  | LoadedRepoHomeRoute
  | LoadedRepoCommitsRoute
@@ -166,7 +199,9 @@ export type LoadedRepoRoute =
  | LoadedRepoIssueRoute
  | LoadedRepoIssuesRoute
  | LoadedRepoPatchRoute
-
  | LoadedRepoPatchesRoute;
+
  | LoadedRepoPatchesRoute
+
  | LoadedRepoReleasesRoute
+
  | LoadedRepoReleaseRoute;

export async function loadPatch(
  route: RepoPatchRoute,
@@ -356,6 +391,44 @@ export async function loadIssue(
  };
}

+
export async function loadReleases(
+
  route: RepoReleasesRoute,
+
): Promise<LoadedRepoReleasesRoute> {
+
  const [sidebarData, repo, releases] = await Promise.all([
+
    loadSidebarData(),
+
    invoke<RepoInfo>("repo_by_id", { rid: route.rid }),
+
    invoke<Release[]>("list_releases", { rid: route.rid }),
+
  ]);
+

+
  return {
+
    resource: "repo.releases",
+
    params: { sidebarData, repo, releases },
+
  };
+
}
+

+
export async function loadRelease(
+
  route: RepoReleaseRoute,
+
): Promise<LoadedRepoReleaseRoute | null> {
+
  const [sidebarData, repo, release, releases] = await Promise.all([
+
    loadSidebarData(),
+
    invoke<RepoInfo>("repo_by_id", { rid: route.rid }),
+
    invoke<Release | null>("release_by_id", {
+
      rid: route.rid,
+
      releaseId: route.release,
+
    }),
+
    invoke<Release[]>("list_releases", { rid: route.rid }),
+
  ]);
+

+
  if (!release) {
+
    return null;
+
  }
+

+
  return {
+
    resource: "repo.release",
+
    params: { sidebarData, repo, release, releases },
+
  };
+
}
+

export async function loadIssues(
  route: RepoIssuesRoute,
): Promise<LoadedRepoIssuesRoute> {
@@ -416,6 +489,10 @@ export function repoRouteToPath(route: RepoRoute): string {
      url += `?${searchParams}`;
    }
    return url;
+
  } else if (route.resource === "repo.releases") {
+
    return [...pathSegments, "releases"].join("/");
+
  } else if (route.resource === "repo.release") {
+
    return [...pathSegments, "releases", route.release].join("/");
  } else {
    return unreachable(route);
  }
@@ -477,6 +554,12 @@ export function repoUrlToRoute(
      } else {
        return { resource: "repo.patches", rid, status };
      }
+
    } else if (resource === "releases") {
+
      const id = segments.shift();
+
      if (id) {
+
        return { resource: "repo.release", rid, release: id };
+
      }
+
      return { resource: "repo.releases", rid };
    } else {
      return null;
    }