import { scopeThreadRef } from "@t3tools/client-runtime/environment";import type { EnvironmentId, ScopedThreadRef } from "@t3tools/contracts"; import { useProjects } from "~/state/entities"; import { useHandleNewThread } from "./useHandleNewThread"; export interface ActiveProjectTarget { readonly environmentId: EnvironmentId; readonly cwd: string; readonly projectName: string; readonly threadRef: ScopedThreadRef;} /** * Resolves the project workspace behind the active thread (or draft) so * project-scoped surfaces like the file picker and content search know which * workspace to query and which thread's right panel opens their results. */export function useActiveProjectTarget(): ActiveProjectTarget | null { const { activeDraftThread, activeThread } = useHandleNewThread(); const projects = useProjects(); const thread = activeThread ?? activeDraftThread; const threadId = activeThread?.id ?? activeDraftThread?.threadId; const project = thread ? projects.find( (candidate) => candidate.environmentId === thread.environmentId && candidate.id === thread.projectId, ) : null; const cwd = thread?.worktreePath ?? project?.workspaceRoot; if (!thread || !threadId || !project || !cwd) return null; return { environmentId: project.environmentId, cwd, projectName: project.title, threadRef: scopeThreadRef(thread.environmentId, threadId), };}
import { scopeThreadRef } from "@t3tools/client-runtime/environment";
import type { EnvironmentId, ScopedThreadRef } from "@t3tools/contracts";
import { useProjects } from "~/state/entities";
import { useHandleNewThread } from "./useHandleNewThread";
export interface ActiveProjectTarget {
readonly environmentId: EnvironmentId;
readonly cwd: string;
readonly projectName: string;
readonly threadRef: ScopedThreadRef;
}
/**
* Resolves the project workspace behind the active thread (or draft) so
* project-scoped surfaces like the file picker and content search know which
* workspace to query and which thread's right panel opens their results.
*/
export function useActiveProjectTarget(): ActiveProjectTarget | null {
const { activeDraftThread, activeThread } = useHandleNewThread();
const projects = useProjects();
const thread = activeThread ?? activeDraftThread;
const threadId = activeThread?.id ?? activeDraftThread?.threadId;
const project = thread
? projects.find(
(candidate) =>
candidate.environmentId === thread.environmentId && candidate.id === thread.projectId,
)
: null;
const cwd = thread?.worktreePath ?? project?.workspaceRoot;
if (!thread || !threadId || !project || !cwd) return null;
return {
environmentId: project.environmentId,
cwd,
projectName: project.title,
threadRef: scopeThreadRef(thread.environmentId, threadId),
};
}