@@ -19,7 +19,7 @@ import { AI_PROMPT_PARAMETER_NAME, type Task } from "modules/tasks/tasks";
19
19
import { WorkspaceBuildLogs } from "modules/workspaces/WorkspaceBuildLogs/WorkspaceBuildLogs" ;
20
20
import { type FC , type ReactNode , useLayoutEffect , useRef } from "react" ;
21
21
import { Helmet } from "react-helmet-async" ;
22
- import { useQuery } from "react-query" ;
22
+ import { useMutation , useQuery , useQueryClient } from "react-query" ;
23
23
import { Panel , PanelGroup , PanelResizeHandle } from "react-resizable-panels" ;
24
24
import { Link as RouterLink , useParams } from "react-router" ;
25
25
import type { FixedSizeList } from "react-window" ;
@@ -31,6 +31,7 @@ import {
31
31
import { TaskApps } from "./TaskApps" ;
32
32
import { TaskSidebar } from "./TaskSidebar" ;
33
33
import { TaskTopbar } from "./TaskTopbar" ;
34
+ import { startWorkspace } from "api/queries/workspaces" ;
34
35
35
36
const TaskPage = ( ) => {
36
37
const { workspace : workspaceName , username } = useParams ( ) as {
@@ -119,27 +120,7 @@ const TaskPage = () => {
119
120
</ div >
120
121
) ;
121
122
} else if ( task . workspace . latest_build . status !== "running" ) {
122
- content = (
123
- < Margins >
124
- < div className = "w-full min-h-80 flex items-center justify-center" >
125
- < div className = "flex flex-col items-center" >
126
- < h3 className = "m-0 font-medium text-content-primary text-base" >
127
- Workspace is not running
128
- </ h3 >
129
- < span className = "text-content-secondary text-sm" >
130
- Apps and previous statuses are not available
131
- </ span >
132
- < Button size = "sm" className = "mt-4" asChild >
133
- < RouterLink
134
- to = { `/@${ task . workspace . owner_name } /${ task . workspace . name } ` }
135
- >
136
- View workspace
137
- </ RouterLink >
138
- </ Button >
139
- </ div >
140
- </ div >
141
- </ Margins >
142
- ) ;
123
+ content = < WorkspaceNotRunning task = { task } /> ;
143
124
} else if ( agent && [ "created" , "starting" ] . includes ( agent . lifecycle_state ) ) {
144
125
content = < TaskStartingAgent agent = { agent } /> ;
145
126
} else {
@@ -174,6 +155,50 @@ const TaskPage = () => {
174
155
175
156
export default TaskPage ;
176
157
158
+ type WorkspaceNotRunningProps = {
159
+ task : Task ;
160
+ } ;
161
+
162
+ const WorkspaceNotRunning : FC < WorkspaceNotRunningProps > = ( { task } ) => {
163
+ const queryClient = useQueryClient ( ) ;
164
+
165
+ const mutateStartWorkspace = useMutation ( {
166
+ ...startWorkspace ( task ?. workspace , queryClient ) ,
167
+ } ) ;
168
+
169
+ return (
170
+ < Margins >
171
+ < div className = "w-full min-h-80 flex items-center justify-center" >
172
+ < div className = "flex flex-col items-center" >
173
+ < h3 className = "m-0 font-medium text-content-primary text-base" >
174
+ Workspace is not running
175
+ </ h3 >
176
+ < span className = "text-content-secondary text-sm" >
177
+ Apps and previous statuses are not available
178
+ </ span >
179
+ < div className = "flex flex-row mt-4 gap-4" >
180
+ < Button
181
+ size = "sm"
182
+ onClick = { ( ) => {
183
+ mutateStartWorkspace ?. mutate ( { } ) ;
184
+ } }
185
+ >
186
+ Start workspace
187
+ </ Button >
188
+ < Button size = "sm" asChild >
189
+ < RouterLink
190
+ to = { `/@${ task . workspace . owner_name } /${ task . workspace . name } ` }
191
+ >
192
+ View workspace
193
+ </ RouterLink >
194
+ </ Button >
195
+ </ div >
196
+ </ div >
197
+ </ div >
198
+ </ Margins >
199
+ ) ;
200
+ } ;
201
+
177
202
type TaskBuildingWorkspaceProps = { task : Task } ;
178
203
179
204
const TaskBuildingWorkspace : FC < TaskBuildingWorkspaceProps > = ( { task } ) => {
0 commit comments