Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ export function useDiffStats(workspaceId: string): DiffStats | null {
if (!hostUrl) return null;
return getHostServiceClientByUrl(hostUrl).git.getStatus.query({
workspaceId,
priority: "background",
});
},
refetchOnWindowFocus: false,
Expand All @@ -34,7 +35,12 @@ export function useDiffStats(workspaceId: string): DiffStats | null {
void queryClient.invalidateQueries({ queryKey });
}, [queryClient, queryKey]);

useWorkspaceEvent("git:changed", workspaceId, invalidate);
useWorkspaceEvent(
"git:changed",
workspaceId,
invalidate,
Boolean(workspaceId) && Boolean(hostUrl),
);

return useMemo<DiffStats | null>(() => {
if (!status) return null;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import { workspaceTrpc } from "@superset/workspace-client";
import {
type GitChangedPayload,
workspaceTrpc,
} from "@superset/workspace-client";
import { useCallback } from "react";
import { useWorkspaceEvent } from "../useWorkspaceEvent";

Expand All @@ -10,32 +13,48 @@ import { useWorkspaceEvent } from "../useWorkspaceEvent";
* else) receive the query result as data and do not re-fetch.
*
* `git:changed` is already debounced server-side in `GitWatcher` and covers
* both `.git/` metadata writes and worktree file edits — no client-side
* debounce needed.
* both `.git/` metadata writes and worktree file edits.
*/
export function useGitStatus(workspaceId: string) {
export function useGitStatus(workspaceId: string, enabled = true) {
const utils = workspaceTrpc.useUtils();

const baseBranchQuery = workspaceTrpc.git.getBaseBranch.useQuery(
{ workspaceId },
{ staleTime: Number.POSITIVE_INFINITY, enabled: Boolean(workspaceId) },
{
staleTime: Number.POSITIVE_INFINITY,
enabled: enabled && Boolean(workspaceId),
},
);
const baseBranch = baseBranchQuery.data?.baseBranch ?? null;

const query = workspaceTrpc.git.getStatus.useQuery(
{ workspaceId, baseBranch: baseBranch ?? undefined },
{ refetchOnWindowFocus: true, enabled: Boolean(workspaceId) },
{
workspaceId,
baseBranch: baseBranch ?? undefined,
priority: "foreground",
},
{ refetchOnWindowFocus: true, enabled: enabled && Boolean(workspaceId) },
);

const invalidate = useCallback(() => {
void utils.git.getStatus.invalidate({ workspaceId });
// Current branch may have changed (external checkout), and
// branch.<name>.base is per-branch — drop the cache so the next read
// picks up the new branch's base.
void utils.git.getBaseBranch.invalidate({ workspaceId });
}, [utils, workspaceId]);
const invalidate = useCallback(
(payload?: GitChangedPayload) => {
void utils.git.getStatus.invalidate({ workspaceId });
if (payload?.paths && payload.paths.length > 0) {
for (const path of payload.paths) {
void utils.git.getDiff.invalidate({ workspaceId, path });
}
} else {
void utils.git.getDiff.invalidate({ workspaceId });
// Current branch may have changed (external checkout), and
// branch.<name>.base is per-branch — drop the cache so the next read
// picks up the new branch's base.
void utils.git.getBaseBranch.invalidate({ workspaceId });
}
},
[utils, workspaceId],
);

useWorkspaceEvent("git:changed", workspaceId, invalidate);
useWorkspaceEvent("git:changed", workspaceId, invalidate, enabled);

return query;
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { useLiveQuery } from "@tanstack/react-db";
import { Search } from "lucide-react";
import { useEffect, useRef, useState } from "react";
import { LuFile, LuGitCompareArrows } from "react-icons/lu";
import { useGitStatus } from "renderer/hooks/host-service/useGitStatus";
import { useWorkspaceGitStatus } from "renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/providers/WorkspaceGitStatusProvider";
import { useCollections } from "renderer/routes/_authenticated/providers/CollectionsProvider";
import { useSettings } from "renderer/stores/settings";
import type { CommentPaneData } from "../../types";
Expand Down Expand Up @@ -87,6 +87,7 @@ export function WorkspaceSidebar({
pendingReveal,
workspaceId,
}: WorkspaceSidebarProps) {
const gitStatus = useWorkspaceGitStatus();
const collections = useCollections();
const { data: [localState] = [] } = useLiveQuery(
(query) =>
Expand Down Expand Up @@ -124,11 +125,8 @@ export function WorkspaceSidebar({
return () => ro.disconnect();
}, []);

const gitStatus = useGitStatus(workspaceId);

const changesTabDef = useChangesTab({
workspaceId,
gitStatus,
selectedFilePath,
onSelectFile: onSelectDiffFile,
onOpenFile: onSelectFile,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ import { cn } from "@superset/ui/utils";
import { workspaceTrpc } from "@superset/workspace-client";
import { RefreshCw } from "lucide-react";
import { useCallback, useState } from "react";
import type { useGitStatus } from "renderer/hooks/host-service/useGitStatus";
import { useChangeset } from "renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/hooks/useChangeset";
import { useOpenInExternalEditor } from "renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/hooks/useOpenInExternalEditor";
import { useSidebarDiffRef } from "renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/hooks/useSidebarDiffRef";
import { useWorkspaceGitStatus } from "renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/providers/WorkspaceGitStatusProvider";
import { useCollections } from "renderer/routes/_authenticated/providers/CollectionsProvider";
import type {
ChangesFilter,
Expand All @@ -22,7 +22,6 @@ export type { ChangesFilter, ChangesViewMode };

interface UseChangesTabParams {
workspaceId: string;
gitStatus: ReturnType<typeof useGitStatus>;
/** Absolute path of the file whose diff/preview is currently open. */
selectedFilePath?: string;
onSelectFile?: (path: string, openInNewTab?: boolean) => void;
Expand All @@ -31,11 +30,11 @@ interface UseChangesTabParams {

export function useChangesTab({
workspaceId,
gitStatus: status,
selectedFilePath,
onSelectFile,
onOpenFile,
}: UseChangesTabParams): SidebarTabDefinition {
const status = useWorkspaceGitStatus();
const collections = useCollections();
const utils = workspaceTrpc.useUtils();
const localState = collections.v2WorkspaceLocalState.get(workspaceId);
Expand All @@ -52,7 +51,10 @@ export function useChangesTab({
const baseBranch = baseBranchQuery.data?.baseBranch ?? null;

const ref = useSidebarDiffRef(workspaceId);
const { files, isLoading } = useChangeset({ workspaceId, ref });
const { files, isLoading } = useChangeset({
workspaceId,
ref,
});

const workspaceQuery = workspaceTrpc.workspace.get.useQuery({
id: workspaceId,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { workspaceTrpc } from "@superset/workspace-client";
import { useMemo } from "react";
import { useWorkspaceEvent } from "renderer/hooks/host-service/useWorkspaceEvent";
import type { FileStatus } from "../../components/StatusIndicator";
import { useWorkspaceGitStatus } from "../../providers/WorkspaceGitStatusProvider";
import type { ChangesetFile, DiffRef } from "./types";

interface UseChangesetArgs {
Expand All @@ -20,18 +20,7 @@ export function useChangeset({
workspaceId,
ref,
}: UseChangesetArgs): UseChangesetResult {
const utils = workspaceTrpc.useUtils();

const needsStatus = ref.kind === "against-base" || ref.kind === "uncommitted";
const statusQuery = workspaceTrpc.git.getStatus.useQuery(
{
workspaceId,
baseBranch:
ref.kind === "against-base" ? (ref.baseBranch ?? undefined) : undefined,
},
{ enabled: needsStatus, staleTime: Number.POSITIVE_INFINITY },
);

const gitStatus = useWorkspaceGitStatus();
const commitQuery = workspaceTrpc.git.getCommitFiles.useQuery(
ref.kind === "commit"
? {
Expand All @@ -46,22 +35,6 @@ export function useChangeset({
},
);

useWorkspaceEvent(
"git:changed",
workspaceId,
(payload) => {
void utils.git.getStatus.invalidate({ workspaceId });
if (payload.paths && payload.paths.length > 0) {
for (const path of payload.paths) {
void utils.git.getDiff.invalidate({ workspaceId, path });
}
} else {
void utils.git.getDiff.invalidate({ workspaceId });
}
},
needsStatus,
);

const files = useMemo<ChangesetFile[]>(() => {
if (ref.kind === "commit") {
return (commitQuery.data?.files ?? []).map((file) => ({
Expand All @@ -78,7 +51,7 @@ export function useChangeset({
}));
}

const status = statusQuery.data;
const status = gitStatus.data;
if (!status) return [];

if (ref.kind === "uncommitted") {
Expand Down Expand Up @@ -139,9 +112,9 @@ export function useChangeset({
});
}
return Array.from(seen.values());
}, [ref, statusQuery.data, commitQuery.data?.files]);
}, [ref, gitStatus.data, commitQuery.data?.files]);

const activeQuery = needsStatus ? statusQuery : commitQuery;
const activeQuery = ref.kind === "commit" ? commitQuery : gitStatus;

return {
files,
Expand Down
Loading
Loading