Merge pull request #4809 from dignow/refact/login_dialog

Immediately show the login dialog
This commit is contained in:
RustDesk 2023-07-01 10:53:26 +08:00 committed by GitHub
commit 849ae9e55f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 53 additions and 48 deletions

View File

@ -378,7 +378,10 @@ Future<bool?> loginDialog() async {
var isInProgress = false; var isInProgress = false;
final RxString curOP = ''.obs; final RxString curOP = ''.obs;
final loginOptions = await UserModel.queryLoginOptions(); final loginOptions = [].obs;
Future.delayed(Duration.zero, () async {
loginOptions.value = await UserModel.queryLoginOptions();
});
final res = await gFFI.dialogManager.show<bool>((setState, close, context) { final res = await gFFI.dialogManager.show<bool>((setState, close, context) {
username.addListener(() { username.addListener(() {
@ -451,48 +454,50 @@ Future<bool?> loginDialog() async {
setState(() => isInProgress = false); setState(() => isInProgress = false);
} }
final oidcOptions = loginOptions thirdAuthWidget() => Obx(() {
.where((opt) => opt.startsWith(kAuthReqTypeOidc)) final oidcOptions = loginOptions
.map((opt) => opt.substring(kAuthReqTypeOidc.length)) .where((opt) => opt.startsWith(kAuthReqTypeOidc))
.toList(); .map((opt) => opt.substring(kAuthReqTypeOidc.length))
.toList();
thirdAuthWidget() => Offstage( return Offstage(
offstage: oidcOptions.isEmpty, offstage: oidcOptions.isEmpty,
child: Column( child: Column(
children: [ children: [
const SizedBox( const SizedBox(
height: 8.0, height: 8.0,
), ),
Center( Center(
child: Text( child: Text(
translate('or'), translate('or'),
style: TextStyle(fontSize: 16), style: TextStyle(fontSize: 16),
)), )),
const SizedBox( const SizedBox(
height: 8.0, height: 8.0,
), ),
LoginWidgetOP( LoginWidgetOP(
ops: [ ops: [
ConfigOP(op: 'GitHub', iconWidth: 20), ConfigOP(op: 'GitHub', iconWidth: 20),
ConfigOP(op: 'Google', iconWidth: 20), ConfigOP(op: 'Google', iconWidth: 20),
ConfigOP(op: 'Okta', iconWidth: 38), ConfigOP(op: 'Okta', iconWidth: 38),
] ]
.where((op) => oidcOptions.contains(op.op.toLowerCase())) .where((op) => oidcOptions.contains(op.op.toLowerCase()))
.toList(), .toList(),
curOP: curOP, curOP: curOP,
cbLogin: (Map<String, dynamic> authBody) { cbLogin: (Map<String, dynamic> authBody) {
try { try {
// access_token is already stored in the rust side. // access_token is already stored in the rust side.
gFFI.userModel.getLoginResponseFromAuthBody(authBody); gFFI.userModel.getLoginResponseFromAuthBody(authBody);
} catch (e) { } catch (e) {
debugPrint('Failed too parse oidc login body: "$authBody"'); debugPrint(
} 'Failed to parse oidc login body: "$authBody"');
close(true); }
}, close(true);
), },
], ),
), ],
); ),
);
});
return CustomAlertDialog( return CustomAlertDialog(
title: Text(translate('Login')), title: Text(translate('Login')),

View File

@ -10,7 +10,7 @@ import '../common.dart';
import 'model.dart'; import 'model.dart';
import 'platform_model.dart'; import 'platform_model.dart';
bool refresing_user = false; bool refreshingUser = false;
class UserModel { class UserModel {
final RxString userName = ''.obs; final RxString userName = ''.obs;
@ -31,16 +31,16 @@ class UserModel {
'id': await bind.mainGetMyId(), 'id': await bind.mainGetMyId(),
'uuid': await bind.mainGetUuid() 'uuid': await bind.mainGetUuid()
}; };
if (refresing_user) return; if (refreshingUser) return;
try { try {
refresing_user = true; refreshingUser = true;
final response = await http.post(Uri.parse('$url/api/currentUser'), final response = await http.post(Uri.parse('$url/api/currentUser'),
headers: { headers: {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
'Authorization': 'Bearer $token' 'Authorization': 'Bearer $token'
}, },
body: json.encode(body)); body: json.encode(body));
refresing_user = false; refreshingUser = false;
final status = response.statusCode; final status = response.statusCode;
if (status == 401 || status == 400) { if (status == 401 || status == 400) {
reset(); reset();
@ -57,7 +57,7 @@ class UserModel {
} catch (e) { } catch (e) {
debugPrint('Failed to refreshCurrentUser: $e'); debugPrint('Failed to refreshCurrentUser: $e');
} finally { } finally {
refresing_user = false; refreshingUser = false;
await updateOtherModels(); await updateOtherModels();
} }
} }