Skip to content

Commit 1a5bdbc

Browse files
committed
fix(app): satisfy task manager lint
1 parent 835d074 commit 1a5bdbc

3 files changed

Lines changed: 125 additions & 91 deletions

File tree

packages/app/src/web/app-ready-controller.ts

Lines changed: 1 addition & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,14 @@
11
import { updateActionPromptValue } from "./action-prompt.js"
2-
import { withBusy } from "./actions-shared.js"
32
import {
4-
attachProjectTerminalById,
53
cancelBrowserActionPrompt,
64
closeSelectedProjectPort,
7-
connectProjectById,
85
loadSelectedProjectBrowser,
9-
loadProjectTasksById,
106
loadSelectedProjectPorts,
117
openProjectBrowserById,
128
openSelectedProjectBrowser,
139
openSelectedProjectPort,
1410
submitBrowserActionPrompt
1511
} from "./actions.js"
16-
import { deleteProjectTerminalSession } from "./api.js"
1712
import type { DashboardData } from "./api.js"
1813
import type { createActionContext } from "./app-ready-actions.js"
1914
import { resolveCurrentMenu, runAuthActionByIndex, runProjectAuthActionByIndex } from "./app-ready-actions.js"
@@ -39,10 +34,9 @@ import { bindScreenActions } from "./app-ready-screen-actions.js"
3934
import { useSshLink } from "./app-ready-ssh-link-hook.js"
4035
import { bindTaskActions } from "./app-ready-task-actions.js"
4136
import { useProjectTasksReset } from "./app-ready-tasks-hook.js"
37+
import { bindTerminalActions } from "./app-ready-terminal-actions.js"
4238
import { useReadyUrlSync } from "./app-ready-url.js"
43-
import { browserMenuIndex } from "./menu.js"
4439
import { filterDashboardProjectsByQuery } from "./project-search.js"
45-
import { projectPickerScreen } from "./screen.js"
4640

4741
type ReadyControllerArgs = {
4842
readonly dashboard: DashboardData
@@ -255,46 +249,6 @@ const bindBrowserActions = (
255249
}
256250
})
257251

258-
const bindTerminalActions = (
259-
actionContext: ReturnType<typeof createActionContext>,
260-
state: ReturnType<typeof useReadyState>
261-
) => ({
262-
onOpenProjectTerminalById: (projectId: string, projectKey?: string) => {
263-
connectProjectById(projectId, actionContext, projectKey)
264-
},
265-
onOpenProjectTaskManagerById: (projectId: string) => {
266-
state.setSelectedProjectId(projectId)
267-
state.setSelectedMenuIndex(browserMenuIndex("Tasks"))
268-
state.setProjectNavigationArmed(true)
269-
state.setActiveScreen(projectPickerScreen())
270-
state.deactivateTerminalWorkspace()
271-
state.setProjectTasks(null)
272-
state.setProjectTaskLogs("")
273-
state.setProjectTasksIncludeDefault(false)
274-
loadProjectTasksById(actionContext, projectId, { includeDefault: false })
275-
},
276-
onAttachProjectTerminalSession: (
277-
projectId: string,
278-
projectKey: string,
279-
projectDisplayName: string,
280-
sessionId: string
281-
) => {
282-
attachProjectTerminalById(projectId, projectKey, projectDisplayName, sessionId, actionContext)
283-
},
284-
onKillProjectTerminalSession: (_projectId: string, projectKey: string, sessionId: string) => {
285-
withBusy({
286-
context: actionContext,
287-
effect: deleteProjectTerminalSession(projectKey, sessionId),
288-
label: "Killing SSH terminal",
289-
onSuccess: () => {
290-
state.closeTerminalSession(sessionId)
291-
actionContext.reloadDashboard()
292-
actionContext.setMessage(`Killed SSH terminal: ${sessionId}.`)
293-
}
294-
})
295-
}
296-
})
297-
298252
export const useReadyController = ({ dashboard, dashboardRefreshTick, refreshDashboard }: ReadyControllerArgs) => {
299253
const state = useReadyState()
300254
const currentMenu = resolveCurrentMenu(state.selectedMenuIndex)
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { withBusy } from "./actions-shared.js"
2+
import { attachProjectTerminalById, connectProjectById, loadProjectTasksById } from "./actions.js"
3+
import { deleteProjectTerminalSession } from "./api.js"
4+
import type { createActionContext } from "./app-ready-actions.js"
5+
import type { ReadyState } from "./app-ready-hooks.js"
6+
import { browserMenuIndex } from "./menu.js"
7+
import { projectPickerScreen } from "./screen.js"
8+
9+
export const bindTerminalActions = (
10+
actionContext: ReturnType<typeof createActionContext>,
11+
state: ReadyState
12+
) => ({
13+
onOpenProjectTerminalById: (projectId: string, projectKey?: string) => {
14+
connectProjectById(projectId, actionContext, projectKey)
15+
},
16+
onOpenProjectTaskManagerById: (projectId: string) => {
17+
state.setSelectedProjectId(projectId)
18+
state.setSelectedMenuIndex(browserMenuIndex("Tasks"))
19+
state.setProjectNavigationArmed(true)
20+
state.setActiveScreen(projectPickerScreen())
21+
state.deactivateTerminalWorkspace()
22+
state.setProjectTasks(null)
23+
state.setProjectTaskLogs("")
24+
state.setProjectTasksIncludeDefault(false)
25+
loadProjectTasksById(actionContext, projectId, { includeDefault: false })
26+
},
27+
onAttachProjectTerminalSession: (
28+
projectId: string,
29+
projectKey: string,
30+
projectDisplayName: string,
31+
sessionId: string
32+
) => {
33+
attachProjectTerminalById(projectId, projectKey, projectDisplayName, sessionId, actionContext)
34+
},
35+
onKillProjectTerminalSession: (_projectId: string, projectKey: string, sessionId: string) => {
36+
withBusy({
37+
context: actionContext,
38+
effect: deleteProjectTerminalSession(projectKey, sessionId),
39+
label: "Killing SSH terminal",
40+
onSuccess: () => {
41+
state.closeTerminalSession(sessionId)
42+
actionContext.reloadDashboard()
43+
actionContext.setMessage(`Killed SSH terminal: ${sessionId}.`)
44+
}
45+
})
46+
}
47+
})

packages/app/src/web/panel-terminal.tsx

Lines changed: 77 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,31 @@ const TerminalActionButton = (
248248
</button>
249249
)
250250

251+
const OptionalTerminalActionButton = (
252+
{
253+
compactHeaderMode,
254+
compactLabel,
255+
enabled,
256+
label,
257+
onClick
258+
}: {
259+
readonly compactHeaderMode: boolean
260+
readonly compactLabel: string
261+
readonly enabled: boolean
262+
readonly label: string
263+
readonly onClick: (() => void) | undefined
264+
}
265+
): JSX.Element | null => {
266+
if (!enabled || onClick === undefined) {
267+
return null
268+
}
269+
return (
270+
<TerminalActionButton compactTypingMode={compactHeaderMode} onClick={onClick}>
271+
{compactHeaderMode ? compactLabel : label}
272+
</TerminalActionButton>
273+
)
274+
}
275+
251276
const TerminalHeaderActions = (
252277
{
253278
compactHeaderMode,
@@ -257,43 +282,49 @@ const TerminalHeaderActions = (
257282
onOpenTaskManager,
258283
onOpenTerminal,
259284
session
260-
}: Pick<
261-
TerminalPanelProps,
262-
"onDetach" | "onKill" | "onOpenBrowser" | "onOpenTaskManager" | "onOpenTerminal" | "session"
263-
> & {
264-
readonly compactHeaderMode: boolean
265-
}
266-
): JSX.Element => (
267-
<div style={compactHeaderMode ? compactHeaderActionsStyle : headerActionsStyle}>
268-
{session.browserProjectId === undefined || onOpenBrowser === undefined
269-
? null
270-
: (
271-
<TerminalActionButton compactTypingMode={compactHeaderMode} onClick={onOpenBrowser}>
272-
{compactHeaderMode ? "Browser" : "Open browser"}
273-
</TerminalActionButton>
274-
)}
275-
{session.browserProjectId === undefined || onOpenTaskManager === undefined
276-
? null
277-
: (
278-
<TerminalActionButton compactTypingMode={compactHeaderMode} onClick={onOpenTaskManager}>
279-
{compactHeaderMode ? "Tasks" : "Task manager"}
280-
</TerminalActionButton>
281-
)}
282-
{session.browserProjectId === undefined || onOpenTerminal === undefined
283-
? null
284-
: (
285-
<TerminalActionButton compactTypingMode={compactHeaderMode} onClick={onOpenTerminal}>
286-
{compactHeaderMode ? "New" : "New terminal"}
287-
</TerminalActionButton>
288-
)}
289-
<TerminalActionButton compactTypingMode={compactHeaderMode} onClick={onDetach}>
290-
Detach
291-
</TerminalActionButton>
292-
<TerminalActionButton compactTypingMode={compactHeaderMode} onClick={onKill}>
293-
Kill
294-
</TerminalActionButton>
295-
</div>
296-
)
285+
}:
286+
& Pick<
287+
TerminalPanelProps,
288+
"onDetach" | "onKill" | "onOpenBrowser" | "onOpenTaskManager" | "onOpenTerminal" | "session"
289+
>
290+
& {
291+
readonly compactHeaderMode: boolean
292+
}
293+
): JSX.Element => {
294+
const hasProjectActions = session.browserProjectId !== undefined
295+
296+
return (
297+
<div style={compactHeaderMode ? compactHeaderActionsStyle : headerActionsStyle}>
298+
<OptionalTerminalActionButton
299+
compactHeaderMode={compactHeaderMode}
300+
compactLabel="Browser"
301+
enabled={hasProjectActions}
302+
label="Open browser"
303+
onClick={onOpenBrowser}
304+
/>
305+
<OptionalTerminalActionButton
306+
compactHeaderMode={compactHeaderMode}
307+
compactLabel="Tasks"
308+
enabled={hasProjectActions}
309+
label="Task manager"
310+
onClick={onOpenTaskManager}
311+
/>
312+
<OptionalTerminalActionButton
313+
compactHeaderMode={compactHeaderMode}
314+
compactLabel="New"
315+
enabled={hasProjectActions}
316+
label="New terminal"
317+
onClick={onOpenTerminal}
318+
/>
319+
<TerminalActionButton compactTypingMode={compactHeaderMode} onClick={onDetach}>
320+
Detach
321+
</TerminalActionButton>
322+
<TerminalActionButton compactTypingMode={compactHeaderMode} onClick={onKill}>
323+
Kill
324+
</TerminalActionButton>
325+
</div>
326+
)
327+
}
297328

298329
const TerminalHeader = (
299330
{
@@ -305,13 +336,15 @@ const TerminalHeader = (
305336
onOpenTerminal,
306337
session,
307338
status
308-
}: Pick<
309-
TerminalPanelProps,
310-
"onDetach" | "onKill" | "onOpenBrowser" | "onOpenTaskManager" | "onOpenTerminal" | "session"
311-
> & {
312-
readonly compactHeaderMode: boolean
313-
readonly status: TerminalStatus
314-
}
339+
}:
340+
& Pick<
341+
TerminalPanelProps,
342+
"onDetach" | "onKill" | "onOpenBrowser" | "onOpenTaskManager" | "onOpenTerminal" | "session"
343+
>
344+
& {
345+
readonly compactHeaderMode: boolean
346+
readonly status: TerminalStatus
347+
}
315348
): JSX.Element => (
316349
<div style={compactHeaderMode ? compactHeaderStyle : headerStyle}>
317350
<TerminalHeaderTitle compactHeaderMode={compactHeaderMode} session={session} status={status} />

0 commit comments

Comments
 (0)