@@ -28,11 +28,12 @@ import com.intellij.icons.AllIcons
28
28
import com.intellij.ide.ActivityTracker
29
29
import com.intellij.ide.BrowserUtil
30
30
import com.intellij.ide.IdeBundle
31
+ import com.intellij.ide.util.PropertiesComponent
31
32
import com.intellij.openapi.Disposable
32
33
import com.intellij.openapi.actionSystem.AnActionEvent
33
- import com.intellij.openapi.application.ApplicationManager
34
34
import com.intellij.openapi.application.ModalityState
35
35
import com.intellij.openapi.application.invokeAndWaitIfNeeded
36
+ import com.intellij.openapi.components.service
36
37
import com.intellij.openapi.diagnostic.Logger
37
38
import com.intellij.openapi.progress.ProgressIndicator
38
39
import com.intellij.openapi.progress.ProgressManager
@@ -72,16 +73,23 @@ import java.awt.Dimension
72
73
import javax.swing.Icon
73
74
import javax.swing.JLabel
74
75
import javax.swing.JTable
76
+ import javax.swing.JTextField
75
77
import javax.swing.ListSelectionModel
76
78
import javax.swing.table.DefaultTableCellRenderer
77
79
import javax.swing.table.TableCellRenderer
78
80
79
81
82
+ private const val CODER_URL_KEY = " coder-url"
83
+
84
+ private const val SESSION_TOKEN = " session-token"
85
+
80
86
class CoderWorkspacesStepView (val enableNextButtonCallback : (Boolean ) -> Unit ) : CoderWorkspacesWizardStep, Disposable {
81
87
private val cs = CoroutineScope (Dispatchers .Main )
82
88
private var localWizardModel = CoderWorkspacesWizardModel ()
83
- private val coderClient: CoderRestClientService = ApplicationManager .getApplication().getService(CoderRestClientService ::class .java)
89
+ private val coderClient: CoderRestClientService = service()
90
+ private val appPropertiesService: PropertiesComponent = service()
84
91
92
+ private var tfUrl: JTextField ? = null
85
93
private var listTableModelOfWorkspaces = ListTableModel <WorkspaceAgentModel >(
86
94
WorkspaceIconColumnInfo (" " ),
87
95
WorkspaceNameColumnInfo (" Name" ),
@@ -148,15 +156,15 @@ class CoderWorkspacesStepView(val enableNextButtonCallback: (Boolean) -> Unit) :
148
156
browserLink(CoderGatewayBundle .message(" gateway.connector.view.login.documentation.action" ), " https://coder.com/docs/coder-oss/latest/workspaces" )
149
157
}.bottomGap(BottomGap .MEDIUM )
150
158
row(CoderGatewayBundle .message(" gateway.connector.view.login.url.label" )) {
151
- textField().resizableColumn().horizontalAlign(HorizontalAlign .FILL ).gap(RightGap .SMALL ).bindText(localWizardModel::coderURL).applyToComponent {
159
+ tfUrl = textField().resizableColumn().horizontalAlign(HorizontalAlign .FILL ).gap(RightGap .SMALL ).bindText(localWizardModel::coderURL).applyToComponent {
152
160
addActionListener {
153
161
poller?.cancel()
154
- loginAndLoadWorkspace ()
162
+ askTokenAndOpenSession ()
155
163
}
156
- }
164
+ }.component
157
165
button(CoderGatewayBundle .message(" gateway.connector.view.coder.workspaces.connect.text" )) {
158
166
poller?.cancel()
159
- loginAndLoadWorkspace ()
167
+ askTokenAndOpenSession ()
160
168
}.applyToComponent {
161
169
background = WelcomeScreenUIManager .getMainAssociatedComponentBackground()
162
170
}
@@ -238,6 +246,17 @@ class CoderWorkspacesStepView(val enableNextButtonCallback: (Boolean) -> Unit) :
238
246
enableNextButtonCallback(false )
239
247
if (localWizardModel.coderURL.isNotBlank() && localWizardModel.token.isNotBlank()) {
240
248
triggerWorkspacePolling()
249
+ } else {
250
+ val url = appPropertiesService.getValue(CODER_URL_KEY )
251
+ val token = appPropertiesService.getValue(SESSION_TOKEN )
252
+ if (! url.isNullOrBlank() && ! token.isNullOrBlank()) {
253
+ localWizardModel.coderURL = url
254
+ localWizardModel.token = token
255
+ tfUrl?.text = url
256
+
257
+ poller?.cancel()
258
+ loginAndLoadWorkspace(token)
259
+ }
241
260
}
242
261
updateWorkspaceActions()
243
262
}
@@ -272,28 +291,31 @@ class CoderWorkspacesStepView(val enableNextButtonCallback: (Boolean) -> Unit) :
272
291
ActivityTracker .getInstance().inc()
273
292
}
274
293
275
- private fun loginAndLoadWorkspace () {
294
+ private fun askTokenAndOpenSession () {
276
295
// force bindings to be filled
277
296
component.apply ()
278
297
279
- BrowserUtil .browse(localWizardModel.coderURL.toURL().withPath(" /login?redirect=%2Fcli-auth" ))
280
298
val pastedToken = askToken()
281
-
282
299
if (pastedToken.isNullOrBlank()) {
283
300
return
284
301
}
302
+ loginAndLoadWorkspace(pastedToken)
303
+ }
304
+
305
+ private fun loginAndLoadWorkspace (token : String ) {
285
306
try {
286
- coderClient.initClientSession(localWizardModel.coderURL.toURL(), pastedToken )
307
+ coderClient.initClientSession(localWizardModel.coderURL.toURL(), token )
287
308
} catch (e: AuthenticationResponseException ) {
288
309
logger.error(" Could not authenticate on ${localWizardModel.coderURL} . Reason $e " )
289
310
return
290
311
}
291
-
312
+ appPropertiesService.setValue(CODER_URL_KEY , localWizardModel.coderURL)
313
+ appPropertiesService.setValue(SESSION_TOKEN , token)
292
314
val cliManager = CoderCLIManager (localWizardModel.coderURL.toURL(), coderClient.buildVersion)
293
315
294
316
295
317
localWizardModel.apply {
296
- token = pastedToken
318
+ this . token = token
297
319
buildVersion = coderClient.buildVersion
298
320
localCliPath = cliManager.localCliPath.toAbsolutePath().toString()
299
321
}
@@ -327,11 +349,14 @@ class CoderWorkspacesStepView(val enableNextButtonCallback: (Boolean) -> Unit) :
327
349
}
328
350
}
329
351
330
- ProgressManager .getInstance().run (authTask)
352
+ cs.launch {
353
+ ProgressManager .getInstance().run (authTask)
354
+ }
331
355
triggerWorkspacePolling()
332
356
}
333
357
334
358
private fun askToken (): String? {
359
+ BrowserUtil .browse(localWizardModel.coderURL.toURL().withPath(" /login?redirect=%2Fcli-auth" ))
335
360
return invokeAndWaitIfNeeded(ModalityState .any()) {
336
361
lateinit var sessionTokenTextField: JBTextField
337
362
0 commit comments