Files
kandev/apps/web/hooks/use-panel-actions.ts
T
José Almeida b4ce4d6eef refactor(web): improve compact desktop layouts (#937)
* refactor(web): improve compact desktop layouts

* fix(web): address compact desktop review feedback

* fix(web): address responsive review followups

* fix(web): preserve compact sidebar restore sizing

* fix(web): harden compact preset sidebar test

* refactor(web): extract dockview layout hooks
2026-05-18 23:08:14 +01:00

124 lines
3.6 KiB
TypeScript

"use client";
import { useCallback } from "react";
import { useResponsiveBreakpoint } from "@/hooks/use-responsive-breakpoint";
import { useDockviewStore } from "@/lib/state/dockview-store";
import { useLayoutStore } from "@/lib/state/layout-store";
import { useAppStore } from "@/components/state-provider";
import { useFileEditors } from "@/hooks/use-file-editors";
/**
* Unified hook returning add-only panel action functions.
* On desktop: delegates to dockview store.
* On mobile/tablet: delegates to layout store (kept for backward compat).
*/
export function usePanelActions() {
const { usesDesktopWorkbench } = useResponsiveBreakpoint();
// Desktop: dockview store
const dockAddBrowser = useDockviewStore((s) => s.addBrowserPanel);
const dockAddPlan = useDockviewStore((s) => s.addPlanPanel);
const dockAddChat = useDockviewStore((s) => s.addChatPanel);
const dockAddChanges = useDockviewStore((s) => s.addChangesPanel);
const dockAddTerminal = useDockviewStore((s) => s.addTerminalPanel);
const dockAddVscode = useDockviewStore((s) => s.addVscodePanel);
// File editors (works on desktop through dockview)
const { openFile: dockOpenFile, openFileInMarkdownPreview: dockOpenFileInPreview } =
useFileEditors();
// Mobile/Tablet: layout store
const activeSessionId = useAppStore((state) => state.tasks.activeSessionId);
const openDocument = useLayoutStore((s) => s.openDocument);
const setActiveDocument = useAppStore((s) => s.setActiveDocument);
const activeTaskId = useAppStore((s) => s.tasks.activeTaskId);
const setPlanMode = useAppStore((s) => s.setPlanMode);
const addBrowser = useCallback(
(url?: string) => {
if (usesDesktopWorkbench) {
dockAddBrowser(url);
} else if (activeSessionId) {
// Mobile/tablet: use layout store to open preview
useLayoutStore.getState().openPreview(activeSessionId);
}
},
[usesDesktopWorkbench, dockAddBrowser, activeSessionId],
);
const addPlan = useCallback(() => {
if (usesDesktopWorkbench) {
dockAddPlan();
} else if (activeSessionId && activeTaskId) {
// Mobile/tablet: open document panel with plan
setActiveDocument(activeSessionId, { type: "plan", taskId: activeTaskId });
openDocument(activeSessionId);
setPlanMode(activeSessionId, true);
}
}, [
usesDesktopWorkbench,
dockAddPlan,
activeSessionId,
activeTaskId,
setActiveDocument,
openDocument,
setPlanMode,
]);
const addChat = useCallback(() => {
if (usesDesktopWorkbench) {
dockAddChat();
}
}, [usesDesktopWorkbench, dockAddChat]);
const addChanges = useCallback(() => {
if (usesDesktopWorkbench) {
dockAddChanges();
}
}, [usesDesktopWorkbench, dockAddChanges]);
const addTerminal = useCallback(
(terminalId?: string) => {
if (usesDesktopWorkbench) {
dockAddTerminal(terminalId);
}
},
[usesDesktopWorkbench, dockAddTerminal],
);
const addVscode = useCallback(() => {
if (usesDesktopWorkbench) {
dockAddVscode();
}
}, [usesDesktopWorkbench, dockAddVscode]);
const openFile = useCallback(
(filePath: string) => {
if (usesDesktopWorkbench) {
dockOpenFile(filePath);
}
},
[usesDesktopWorkbench, dockOpenFile],
);
const openFileInMarkdownPreview = useCallback(
(filePath: string) => {
if (usesDesktopWorkbench) {
dockOpenFileInPreview(filePath);
}
},
[usesDesktopWorkbench, dockOpenFileInPreview],
);
return {
addBrowser,
addPlan,
addChat,
addChanges,
addTerminal,
addVscode,
openFile,
openFileInMarkdownPreview,
};
}