Files
kandev/apps/web/hooks/use-terminal-link-handler.ts
T
2026-07-15 23:19:00 +01:00

36 lines
1.2 KiB
TypeScript

import { useCallback, useEffect, useRef } from "react";
import { useAppStore } from "@/components/state-provider";
import { useDockviewStore } from "@/lib/state/dockview-store";
import { openExternalLink } from "@/lib/desktop/external-links";
/**
* Returns a stable callback for handling terminal link clicks.
* Reads the user's `terminalLinkBehavior` setting to decide whether
* to open URLs in a new browser tab or the built-in browser panel.
*/
export function useTerminalLinkHandler(): (event: MouseEvent, uri: string) => void {
const behaviorRef = useRef<"new_tab" | "browser_panel">("new_tab");
const behavior = useAppStore((s) => s.userSettings.terminalLinkBehavior);
useEffect(() => {
behaviorRef.current = behavior;
}, [behavior]);
return useCallback((_event: MouseEvent, uri: string) => {
if (behaviorRef.current === "browser_panel") {
const api = useDockviewStore.getState().api;
if (api) {
const browserId = `browser:${Date.now()}`;
api.addPanel({
id: browserId,
component: "browser",
title: "Browser",
params: { url: uri },
});
return;
}
}
void openExternalLink(uri).catch(() => undefined);
}, []);
}