From 1dd72986f52b99a6c84728b64cb987bef917faa2 Mon Sep 17 00:00:00 2001 From: Liuxinyu176 <1041316040@qq.com> Date: Sat, 10 Oct 2026 01:45:05 +0800 Subject: [PATCH] =?UTF-8?q?fix(wb):=20CN=20=E6=81=A2=E5=A4=8D=E8=BD=AF?= =?UTF-8?q?=E4=BB=B6=E5=86=85=E7=99=BB=E5=BD=95=EF=BC=9BINTL=20=E4=BB=8E?= =?UTF-8?q?=E7=BB=91=E5=AE=9A=E5=90=8E=E7=9B=B4=E6=8E=A5=E6=89=93=E5=BC=80?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E6=B5=8F=E8=A7=88=E5=99=A8=E5=B9=B6=E6=8C=89?= =?UTF-8?q?=E5=AE=98=E6=96=B9=E6=8E=A5=E5=8F=A3=E8=BD=AE=E8=AF=A2=E5=9B=9E?= =?UTF-8?q?=E5=A1=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rainy/token/ui/settings/CredentialEditScreen.kt | 7 +++++++ .../rainy/token/ui/webview/WebViewLoginScreen.kt | 13 ------------- .../rainy/token/ui/webview/WebViewLoginViewModel.kt | 12 ++++++++++++ 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/rainy/token/ui/settings/CredentialEditScreen.kt b/app/src/main/java/com/rainy/token/ui/settings/CredentialEditScreen.kt index eb5ffba..e2a3b9a 100644 --- a/app/src/main/java/com/rainy/token/ui/settings/CredentialEditScreen.kt +++ b/app/src/main/java/com/rainy/token/ui/settings/CredentialEditScreen.kt @@ -993,6 +993,13 @@ private fun WorkBuddyCredentialForm( ) { Text(stringResource(R.string.action_mobile_browser_login)) } + } else { + OutlinedButton( + onClick = onStartInAppLogin, + modifier = Modifier.fillMaxWidth() + ) { + Text(stringResource(R.string.action_login_in_app)) + } } Text( text = stringResource(R.string.field_trae_region), diff --git a/app/src/main/java/com/rainy/token/ui/webview/WebViewLoginScreen.kt b/app/src/main/java/com/rainy/token/ui/webview/WebViewLoginScreen.kt index cf039a6..19102cc 100644 --- a/app/src/main/java/com/rainy/token/ui/webview/WebViewLoginScreen.kt +++ b/app/src/main/java/com/rainy/token/ui/webview/WebViewLoginScreen.kt @@ -37,7 +37,6 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.key import androidx.compose.runtime.remember -import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.platform.LocalContext @@ -78,18 +77,6 @@ fun WebViewLoginScreen( val uiState by viewModel.uiState.collectAsStateWithLifecycle() val snackbarHostState = remember { SnackbarHostState() } val context = LocalContext.current - // Trae/WorkBuddy 国际版:进入即用手机浏览器登录,回调/轮询结果自动回填到应用 - val browserLoginService = service == ServiceType.TRAE || service == ServiceType.WORKBUDDY - val browserLoginRegion = region != null && region.equals("INTL", ignoreCase = true) - var autoBrowserStarted by rememberSaveable { mutableStateOf(false) } - LaunchedEffect(uiState.loginUrl, uiState.externalBrowserWaiting, uiState.loginSucceeded, autoBrowserStarted) { - if (browserLoginService && browserLoginRegion && !autoBrowserStarted && - uiState.loginUrl.isNotBlank() && !uiState.externalBrowserWaiting && !uiState.loginSucceeded - ) { - autoBrowserStarted = true - viewModel.openExternalBrowser() - } - } var webViewGeneration by remember { mutableStateOf(0) } var pageLoading by remember { mutableStateOf(true) } var pageError by remember { mutableStateOf(null) } diff --git a/app/src/main/java/com/rainy/token/ui/webview/WebViewLoginViewModel.kt b/app/src/main/java/com/rainy/token/ui/webview/WebViewLoginViewModel.kt index 9010707..6656e7b 100644 --- a/app/src/main/java/com/rainy/token/ui/webview/WebViewLoginViewModel.kt +++ b/app/src/main/java/com/rainy/token/ui/webview/WebViewLoginViewModel.kt @@ -152,6 +152,10 @@ class WebViewLoginViewModel @Inject constructor( val deviceId = traeDeviceId() val callbackUrl = buildTraeAuthUrl(LOGIN_WEBVIEW_CALLBACK_PORT) _uiState.update { it.copy(loginUrl = callbackUrl) } + if (region == "INTL") { + // 国际版登录页在系统浏览器完成,回调由本地服务器自动接收并回填 + openExternalBrowser() + } return } @@ -369,6 +373,8 @@ class WebViewLoginViewModel @Inject constructor( .addHeader("X-Client-ID", "codebuddy-cli") .addHeader("X-Client-Version", "2.143.1") .addHeader("X-Product", "SaaS") + .addHeader("Accept", "application/json, text/plain, */*") + .addHeader("X-Requested-With", "XMLHttpRequest") .addHeader("Content-Type", "application/json") .post("{}".toRequestBody("application/json".toMediaTypeOrNull())) .build() @@ -397,6 +403,10 @@ class WebViewLoginViewModel @Inject constructor( } _uiState.update { it.copy(loginUrl = authURL) } workBuddyPollingJob = viewModelScope.launch { pollWorkBuddyToken(state) } + if (region == "INTL") { + // 国际版登录页在系统浏览器完成,凭据由轮询自动回填 + openExternalBrowser() + } } catch (_: Exception) { _uiState.update { it.copy(error = UiText.Resource(R.string.error_network_generic)) @@ -421,6 +431,8 @@ class WebViewLoginViewModel @Inject constructor( .addHeader("X-Client-Version", "2.143.1") .addHeader("X-Product", "SaaS") .addHeader("X-No-Authorization", "1") + .addHeader("Accept", "application/json, text/plain, */*") + .addHeader("X-Requested-With", "XMLHttpRequest") .get() .build() val body = withContext(Dispatchers.IO) {