Publish Claude Code Binaries / Stage and publish binaries (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-arm64 (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build linux-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build windows-amd64 (push) Canceled after 0s
Sync Tutti Agent Skills / sync (push) Canceled after 0s
Windows Agent Adapters / Test Windows agent adapters (push) Canceled after 0s
Windows Daemon Adapters / Test Windows daemon adapters (push) Canceled after 0s
Publish Tutti App Runtime / Publish runtime catalog (push) Canceled after 0s
30 lines
916 B
TypeScript
30 lines
916 B
TypeScript
import { useCallback, useState } from "react";
|
|
|
|
export function useAgentGUIProjectMenuState(
|
|
isRailInteractionLocked: () => boolean,
|
|
isUserProjectMutationPending: boolean
|
|
): {
|
|
isProjectActionLocked: () => boolean;
|
|
onProjectMenuOpenChange: (sectionId: string, open: boolean) => void;
|
|
projectMenuOpen: boolean;
|
|
} {
|
|
const [openSectionId, setOpenSectionId] = useState<string | null>(null);
|
|
const isProjectActionLocked = useCallback(
|
|
() => isRailInteractionLocked() || isUserProjectMutationPending,
|
|
[isRailInteractionLocked, isUserProjectMutationPending]
|
|
);
|
|
const onProjectMenuOpenChange = useCallback(
|
|
(sectionId: string, open: boolean) => {
|
|
setOpenSectionId((current) =>
|
|
open ? sectionId : current === sectionId ? null : current
|
|
);
|
|
},
|
|
[]
|
|
);
|
|
return {
|
|
isProjectActionLocked,
|
|
onProjectMenuOpenChange,
|
|
projectMenuOpen: openSectionId !== null
|
|
};
|
|
}
|