Open workspace files in desktop targets
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
import { useQuery } from "@tanstack/react-query";
|
||||
import { getDesktopHost, type DesktopEditorBridge } from "@/desktop/host";
|
||||
|
||||
export type DesktopOpenTargetKind = "editor" | "file-manager";
|
||||
export type DesktopOpenMode = "open" | "reveal";
|
||||
|
||||
export interface DesktopOpenTarget {
|
||||
id: string;
|
||||
label: string;
|
||||
kind: DesktopOpenTargetKind;
|
||||
}
|
||||
|
||||
export interface OpenDesktopTargetInput {
|
||||
editorId: string;
|
||||
path: string;
|
||||
cwd?: string;
|
||||
mode?: DesktopOpenMode;
|
||||
}
|
||||
|
||||
interface AvailableDesktopEditorBridge {
|
||||
listTargets: NonNullable<DesktopEditorBridge["listTargets"]>;
|
||||
openTarget: NonNullable<DesktopEditorBridge["openTarget"]>;
|
||||
}
|
||||
|
||||
function getDesktopEditorBridge(): AvailableDesktopEditorBridge | null {
|
||||
const bridge = getDesktopHost()?.editor;
|
||||
if (!bridge?.listTargets || !bridge.openTarget) {
|
||||
return null;
|
||||
}
|
||||
return {
|
||||
listTargets: bridge.listTargets,
|
||||
openTarget: bridge.openTarget,
|
||||
};
|
||||
}
|
||||
|
||||
export function hasDesktopOpenTargetsBridge(): boolean {
|
||||
return getDesktopEditorBridge() !== null;
|
||||
}
|
||||
|
||||
export async function listDesktopOpenTargets(): Promise<DesktopOpenTarget[]> {
|
||||
const bridge = getDesktopEditorBridge();
|
||||
if (!bridge) {
|
||||
return [];
|
||||
}
|
||||
return await bridge.listTargets();
|
||||
}
|
||||
|
||||
export async function openDesktopTarget(input: OpenDesktopTargetInput): Promise<void> {
|
||||
const bridge = getDesktopEditorBridge();
|
||||
if (!bridge) {
|
||||
throw new Error("Desktop editor bridge is unavailable");
|
||||
}
|
||||
await bridge.openTarget(input);
|
||||
}
|
||||
|
||||
export function useDesktopOpenTargets(input: { isLocalExecution: boolean }) {
|
||||
const hasBridge = hasDesktopOpenTargetsBridge();
|
||||
const canListTargets = hasBridge && input.isLocalExecution;
|
||||
const query = useQuery({
|
||||
queryKey: ["desktop-open-targets"],
|
||||
enabled: canListTargets,
|
||||
staleTime: 60_000,
|
||||
retry: false,
|
||||
queryFn: listDesktopOpenTargets,
|
||||
});
|
||||
|
||||
return {
|
||||
targets: query.data ?? [],
|
||||
isAvailable: canListTargets,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user