79 lines
2.9 KiB
TypeScript
79 lines
2.9 KiB
TypeScript
"use client";
|
|
|
|
import { useMemo } from "react";
|
|
import { useSession } from "@/hooks/domains/session/use-session";
|
|
import { useWorkspaceRestoration } from "@/hooks/domains/session/use-workspace-restoration";
|
|
import { useRepository } from "@/hooks/domains/workspace/use-repository";
|
|
import { useSessionGitStatus } from "@/hooks/domains/session/use-session-git-status";
|
|
import { useAppStore } from "@/components/state-provider";
|
|
import { useTaskFolderAction } from "@/hooks/use-task-folder-action";
|
|
import { useCopyToClipboard } from "@/hooks/use-copy-to-clipboard";
|
|
import { useFileBrowserSearch, useFileBrowserTree } from "./file-browser-hooks";
|
|
import { getFileBrowserSessionWorkspacePath, resolveFileBrowserPaths } from "./file-browser-path";
|
|
|
|
export function getFileBrowserResetKey({
|
|
sessionId,
|
|
environmentId,
|
|
worktreeCount,
|
|
workspaceFilesRefresh,
|
|
}: {
|
|
sessionId: string;
|
|
environmentId?: string | null;
|
|
worktreeCount: number;
|
|
workspaceFilesRefresh: number;
|
|
}) {
|
|
return `${environmentId ?? sessionId}:${worktreeCount}:${workspaceFilesRefresh}`;
|
|
}
|
|
|
|
function useFileBrowserResetKey(sessionId: string, environmentId?: string | null) {
|
|
const worktreeCount = useAppStore(
|
|
(state) => state.sessionWorktreesBySessionId.itemsBySessionId[sessionId]?.length ?? 0,
|
|
);
|
|
const workspaceFilesRefresh = useAppStore(
|
|
(state) => state.workspaceFilesRefresh.bySessionId[sessionId] ?? 0,
|
|
);
|
|
return getFileBrowserResetKey({
|
|
sessionId,
|
|
environmentId,
|
|
worktreeCount,
|
|
workspaceFilesRefresh,
|
|
});
|
|
}
|
|
|
|
export function useFileBrowserData(sessionId: string, environmentId: string | null | undefined) {
|
|
const { session, isFailed: isSessionFailed, errorMessage: sessionError } = useSession(sessionId);
|
|
const workspaceRestoration = useWorkspaceRestoration(session?.task_id, sessionId, environmentId);
|
|
const repository = useRepository(session?.repository_id ?? null);
|
|
const gitStatus = useSessionGitStatus(sessionId);
|
|
const folderAction = useTaskFolderAction(sessionId);
|
|
const { copied, copy: copyPath } = useCopyToClipboard(1000);
|
|
const search = useFileBrowserSearch(sessionId);
|
|
const resetKey = useFileBrowserResetKey(sessionId, environmentId);
|
|
const treeState = useFileBrowserTree(sessionId, resetKey);
|
|
const isTreeLoaded = !treeState.isLoadingTree && treeState.tree !== null;
|
|
const fileStatuses = useMemo(
|
|
() =>
|
|
new Map(Object.entries(gitStatus?.files ?? {}).map(([path, info]) => [path, info.status])),
|
|
[gitStatus?.files],
|
|
);
|
|
const paths = resolveFileBrowserPaths({
|
|
sessionWorktreePath: getFileBrowserSessionWorkspacePath(session),
|
|
repositoryLocalPath: repository?.local_path,
|
|
treePath: treeState.tree?.path,
|
|
treeLoaded: isTreeLoaded,
|
|
});
|
|
return {
|
|
isSessionFailed,
|
|
sessionError,
|
|
folderAction,
|
|
copied,
|
|
copyPath,
|
|
search,
|
|
treeState,
|
|
workspaceRestoration,
|
|
isTreeLoaded,
|
|
fileStatuses,
|
|
...paths,
|
|
};
|
|
}
|