39 lines · 1.2 KB
import { useCallback, useEffect, 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>();

export function useBranchPushSuggestions(owner: string, repo: string) {
  const viewer = useViewer();
  const [pushes, setPushes] = useState<RecentBranchPush[]>([]);
  const [hidden, setHidden] = useState(() => [...dismissed]);

  useEffect(() => {
    if (!viewer) return;
    let cancelled = false;
    recentBranchPushes({ data: { owner, repo } })
      .then((result) => {
        if (!cancelled) setPushes(result);
      })
      .catch(() => {
        if (!cancelled) setPushes([]);
      });
    return () => {
      cancelled = true;
    };
  }, [owner, repo, viewer]);

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

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