import { scopeProjectRef } from "@t3tools/client-runtime/environment"; import { EnvironmentId, ProjectId, type ScopedThreadRef } from "@t3tools/contracts"; import { useMemo } from "react"; import { readPullRequestDetailSnapshot, resolveDisplayedPullRequestDetail, } from "../components/pullRequest/pullRequestDetail.logic"; import { gitHubPullRequestBrowserUrl } from "../lib/openPullRequestLink"; import { selectActiveRightPanelSurface, useRightPanelStore } from "../rightPanelStore"; import { useProject } from "../state/entities"; import { pullRequestEnvironment } from "../state/pullRequests"; import { useEnvironmentQuery } from "../state/query"; import { useSupportsMultiplePullRequests } from "./useSupportsMultiplePullRequests"; export function useOpenPanelPullRequestUrl(threadRef: ScopedThreadRef | null) { const surface = useRightPanelStore((state) => selectActiveRightPanelSurface(state.byThreadKey, threadRef), ); const reference = surface?.kind === "pull-request" ? surface : null; const environmentId = reference?.environmentId ? EnvironmentId.make(reference.environmentId) : threadRef?.environmentId; const supportsMultiplePullRequests = useSupportsMultiplePullRequests(environmentId ?? null); const project = useProject( reference && environmentId ? scopeProjectRef(environmentId, ProjectId.make(reference.projectId)) : null, ); const detail = useEnvironmentQuery( reference && environmentId ? pullRequestEnvironment.detail({ environmentId, input: { projectId: ProjectId.make(reference.projectId), ...(supportsMultiplePullRequests && reference.host !== undefined ? { host: reference.host } : {}), repository: reference.repository, number: reference.number, }, }) : null, ).data; const cachedDetail = useMemo( () => reference && environmentId ? readPullRequestDetailSnapshot( typeof window === "undefined" ? undefined : window.localStorage, environmentId, reference, ) : null, [environmentId, reference], ); return reference ? (resolveDisplayedPullRequestDetail({ live: detail, cached: cachedDetail, reference })?.url ?? reference.url ?? gitHubPullRequestBrowserUrl( project?.repositoryIdentity, reference.repository, reference.number, )) : undefined; }