Radish alpha
r
rad:z4V1sjrXqjvFdnCUbxPFqd5p4DtH5
Radicle web interface
Radicle
Git
radicle-explorer src views repos Source PeerBranchSelector Peer.svelte
<script lang="ts">
  import type { RepoRoute } from "@app/views/repos/router";
  import type { PeerRefs } from "@http-client";

  import { closeFocused } from "@app/components/Popover.svelte";
  import {
    formatCommit,
    getBranchesFromRefs,
    getTagsFromRefs,
  } from "@app/lib/utils";
  import { replace } from "@app/lib/router";

  import Badge from "@app/components/Badge.svelte";
  import DropdownListItem from "@app/components/DropdownList/DropdownListItem.svelte";
  import IconButton from "@app/components/IconButton.svelte";
  import Icon from "@app/components/Icon.svelte";
  import Link from "@app/components/Link.svelte";
  import NodeId from "@app/components/NodeId.svelte";

  export let baseRoute: Extract<
    RepoRoute,
    { resource: "repo.source" } | { resource: "repo.history" }
  >;
  export let peer: { remote: PeerRefs; selected: boolean };
  export let revision: string | undefined = undefined;
  export let type: "branches" | "tags" = "branches";
  export let selectedTagName: string | undefined = undefined;

  const subgridStyle =
    "display: grid; grid-template-columns: subgrid; grid-column: span 2;";
  let expanded = false;

  $: refs =
    type === "branches"
      ? getBranchesFromRefs(peer.remote.refs)
      : getTagsFromRefs(peer.remote.refs);

  $: if (peer.selected) {
    expanded = true;
  }
</script>

<style>
  .subgrid-item {
    display: grid;
    grid-template-columns: subgrid;
    grid-column: span 2;
  }
</style>

<div class="subgrid-item" aria-label="peer-item">
  <div class="global-flex-item" style="padding: 0.5rem 0">
    <IconButton title="Expand peer" on:click={() => (expanded = !expanded)}>
      <Icon name={expanded ? "chevron-down" : "chevron-right"} />
    </IconButton>
    <NodeId
      baseUrl={baseRoute.node}
      nodeId={peer.remote.id}
      alias={peer.remote.alias} />
    {#if peer.remote.delegate}
      <Badge size="tiny" variant="delegate">
        <Icon name="badge" />
        <span class="global-hide-on-small-desktop-down">Delegate</span>
      </Badge>
    {/if}
  </div>
</div>
{#if expanded}
  {#each Object.entries(refs) as [name, head]}
    <Link
      style={subgridStyle}
      route={{
        ...baseRoute,
        peer: peer.remote.id,
        revision: type === "tags" ? encodeURIComponent(name) : name,
      }}
      on:afterNavigate={() => closeFocused()}>
      <DropdownListItem
        selected={type === "tags"
          ? peer.selected &&
            (selectedTagName === name || revision === encodeURIComponent(name))
          : peer.selected && revision === name}
        on:click={() =>
          replace({
            ...baseRoute,
            peer: peer.remote.id,
            revision: type === "tags" ? encodeURIComponent(name) : name,
          })}
        style={`${subgridStyle} padding-left: 2.3rem;`}>
        <div class="global-flex-item">
          <Icon name={type === "branches" ? "branch" : "label"} />
          <span class="txt-overflow">
            {name}
          </span>
        </div>
        <div class="global-flex-item">
          <span class="txt-id" style="color: var(--color-text-tertiary);">
            {formatCommit(head)}
          </span>
        </div>
      </DropdownListItem>
    </Link>
  {/each}
{/if}