MCPcopy Create free account
hub / github.com/wonderwhy-er/DesktopCommanderMCP / createToolShellController

Function createToolShellController

src/ui/shared/tool-shell.ts:50–103  ·  view source on GitHub ↗
(options: CreateToolShellControllerOptions)

Source from the content-addressed store, hash-verified

48}
49
50export function createToolShellController(options: CreateToolShellControllerOptions): ToolShellController {
51 const { shell, toggleButton, initialExpanded, onToggle, onScrollAfterExpand, onRender } = options;
52 let isExpanded = initialExpanded;
53 let scrollTrackedForCurrentExpand = false;
54 const shouldTrackScroll = typeof onScrollAfterExpand === 'function';
55
56 const applyExpandedState = (nextExpanded: boolean): void => {
57 const wasExpanded = isExpanded;
58 isExpanded = nextExpanded;
59 syncShellClasses(shell, isExpanded);
60 syncExpandButton(toggleButton, isExpanded);
61 if (!wasExpanded && isExpanded) {
62 scrollTrackedForCurrentExpand = false;
63 }
64 };
65
66 const toggle = (): void => {
67 applyExpandedState(!isExpanded);
68 onToggle?.(isExpanded);
69 onRender?.();
70 };
71
72 const handleScroll = (event?: Event): void => {
73 if (!isExpanded || scrollTrackedForCurrentExpand) {
74 return;
75 }
76 const targetNode = event?.target instanceof Node ? event.target : null;
77 if (targetNode && shell && !shell.contains(targetNode)) {
78 return;
79 }
80 scrollTrackedForCurrentExpand = true;
81 onScrollAfterExpand?.();
82 };
83
84 applyExpandedState(isExpanded);
85 toggleButton?.addEventListener('click', toggle);
86 if (shouldTrackScroll) {
87 shell?.addEventListener('scroll', handleScroll, { passive: true });
88 document.addEventListener('scroll', handleScroll, { passive: true, capture: true });
89 }
90
91 return {
92 getExpanded: () => isExpanded,
93 setExpanded: applyExpandedState,
94 toggle,
95 dispose: () => {
96 toggleButton?.removeEventListener('click', toggle);
97 if (shouldTrackScroll) {
98 shell?.removeEventListener('scroll', handleScroll);
99 document.removeEventListener('scroll', handleScroll, true);
100 }
101 },
102 };
103}
104
105export function createCompactRowShellController(options: CreateCompactRowShellControllerOptions): ToolShellController {
106 const { shell, compactRow, initialExpanded, onToggle, onScrollAfterExpand, onRender } = options;

Callers 1

Calls 1

applyExpandedStateFunction · 0.85

Tested by

no test coverage detected