// SPDX-FileCopyrightText: 2019-Present Christian Kußowski // SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat // // SPDX-License-Identifier: AGPL-3.0-or-later import 'package:tatchat/config/setting_keys.dart'; import 'package:tatchat/l10n/l10n.dart'; import 'package:tatchat/pages/sign_in/view_model/model/public_homeserver_data.dart'; import 'package:tatchat/utils/localized_exception_extension.dart'; import 'package:tatchat/utils/platform_infos.dart'; import 'package:tatchat/utils/sign_in_flows/oidc_login.dart'; import 'package:tatchat/utils/sign_in_flows/sso_login.dart'; import 'package:tatchat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:tatchat/widgets/matrix.dart'; import 'package:flutter/foundation.dart'; import 'package:go_router/go_router.dart'; import 'package:material_ui/material_ui.dart'; import 'package:matrix/matrix.dart'; import 'package:url_launcher/url_launcher_string.dart'; Future connectToHomeserverFlow( PublicHomeserverData homeserverData, BuildContext context, void Function(AsyncSnapshot) setState, bool signUp, ) async { setState(AsyncSnapshot.waiting()); try { final homeserverInput = homeserverData.name!; var homeserver = Uri.parse(homeserverInput); if (homeserver.scheme.isEmpty) { homeserver = Uri.https(homeserverInput, ''); } final l10n = L10n.of(context); final client = await Matrix.of(context).getLoginClient(); final (_, _, loginFlows, authMetadata) = await client.checkHomeserver( homeserver, fetchAuthMetadata: true, ); final regLink = homeserverData.regLink; final supportsSso = loginFlows.any((flow) => flow.type == 'm.login.sso'); if ((kIsWeb || PlatformInfos.isLinux) && (supportsSso || authMetadata != null || (signUp && regLink != null))) { if (!context.mounted) return; final consent = await showOkCancelAlertDialog( context: context, title: l10n.appWantsToUseForLogin(homeserverInput), message: l10n.appWantsToUseForLoginDescription, okLabel: l10n.continueText, ); if (consent != OkCancelResult.ok) return; if (!context.mounted) return; } if (!context.mounted) return; if (authMetadata != null && AppSettings.enableMatrixNativeOIDC.value) { await oidcLoginFlow(client, context, signUp); } else if (supportsSso) { await ssoLoginFlow(client, context, signUp, loginFlows); } else { final segments = GoRouter.of(context) .routeInformationProvider .value .uri .pathSegments; final location = segments.length >= 3 && segments[0] == 'rooms' && segments[1] == 'settings' ? '/rooms/settings/addaccount' : '/home'; if (signUp && regLink != null) { await launchUrlString(regLink); if (!context.mounted) return; } context.go( '$location/${signUp && regLink == null ? 'register' : 'login'}', extra: client, ); setState(AsyncSnapshot.withData(ConnectionState.done, true)); return; } await AppSettings.defaultHomeserver.setItem(homeserverInput); if (context.mounted) { setState(AsyncSnapshot.withData(ConnectionState.done, true)); context.go('/backup'); } } catch (e, s) { Logs().w('Unable to login', e, s); setState(AsyncSnapshot.withError(ConnectionState.done, e, s)); if (!context.mounted) return; ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( e.toLocalizedString(context, ExceptionContext.checkHomeserver), ), ), ); } }