33 lines · 1.2 KB
import { useQuery } from "@tanstack/react-query";
import { useCallback, useState } from "react";
import { recentBranchPushes } from "~/fns/branch-pushes";
import { useViewer } from "./use-viewer";
import type { RecentBranchPush } from "~/server/branch-pushes";

/** Dismissals live for the browser session only, keyed by repo + branch so they survive route changes. */
const dismissed = new Set<string>();
const NO_PUSHES: RecentBranchPush[] = [];

export const branchPushesQueryKey = (owner: string, repo: string) => ["branch-pushes", owner, repo] as const;

export function useBranchPushSuggestions(owner: string, repo: string) {
  const viewer = useViewer();
  const [hidden, setHidden] = useState(() => [...dismissed]);
  const query = useQuery({
    queryKey: branchPushesQueryKey(owner, repo),
    queryFn: () => recentBranchPushes({ data: { owner, repo } }),
    enabled: viewer !== null,
  });

  const dismiss = useCallback(
    (branch: string) => {
      dismissed.add(`${owner}/${repo}#${branch}`);
      setHidden([...dismissed]);
    },
    [owner, repo],
  );

  const pushes = (query.data ?? NO_PUSHES).filter((push) => !hidden.includes(`${owner}/${repo}#${push.branch}`));
  return { pushes, dismiss };
}