From e9efce150e20324b6c4262bf34e3be9132bba5f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 22 Feb 2026 11:14:45 +0100 Subject: [PATCH] feat: Add presetHomeserver config to enforce a homeserver for web --- config.sample.json | 2 + lib/config/setting_keys.dart | 4 +- lib/pages/intro/intro_page.dart | 69 ++++++++++--------- lib/pages/intro/intro_page_presenter.dart | 26 +++++++ lib/pages/sign_in/sign_in_page.dart | 2 +- .../flows => utils}/sort_homeservers.dart | 0 .../view_model/sign_in_view_model.dart | 2 +- .../sign_in_flows}/check_homeserver.dart | 4 +- .../sign_in_flows}/oidc_login.dart | 0 .../sign_in_flows}/sso_login.dart | 0 macos/Podfile.lock | 17 ++--- 11 files changed, 77 insertions(+), 49 deletions(-) rename lib/pages/sign_in/{view_model/flows => utils}/sort_homeservers.dart (100%) rename lib/{pages/sign_in/view_model/flows => utils/sign_in_flows}/check_homeserver.dart (94%) rename lib/{pages/sign_in/view_model/flows => utils/sign_in_flows}/oidc_login.dart (100%) rename lib/{pages/sign_in/view_model/flows => utils/sign_in_flows}/sso_login.dart (100%) diff --git a/config.sample.json b/config.sample.json index 5aa0a4bb0..a1ea6f6fb 100644 --- a/config.sample.json +++ b/config.sample.json @@ -1,6 +1,8 @@ { "applicationName": "FluffyChat", "defaultHomeserver": "matrix.org", + "presetHomeserver": "", + "welcomeText": "", "privacyUrl": "https://github.com/krille-chan/fluffychat/blob/main/PRIVACY.md", "audioRecordingNumChannels": 1, "audioRecordingAutoGain": true, diff --git a/lib/config/setting_keys.dart b/lib/config/setting_keys.dart index 7011e8645..da1b3bbf2 100644 --- a/lib/config/setting_keys.dart +++ b/lib/config/setting_keys.dart @@ -52,7 +52,9 @@ enum AppSettings { // colorSchemeSeed stored as ARGB int colorSchemeSeedInt('chat.fluffy.color_scheme_seed', 0xFF5625BA), emojiSuggestionLocale('emoji_suggestion_locale', ''), - enableSoftLogout('chat.fluffy.enable_soft_logout', false); + enableSoftLogout('chat.fluffy.enable_soft_logout', false), + presetHomeserver('chat.fluffy.preset_homeserver', ''), + welcomeText('chat.fluffy.welcome_text', ''); final String key; final T defaultValue; diff --git a/lib/pages/intro/intro_page.dart b/lib/pages/intro/intro_page.dart index 3b321add3..46fd7e5d0 100644 --- a/lib/pages/intro/intro_page.dart +++ b/lib/pages/intro/intro_page.dart @@ -13,13 +13,17 @@ import 'package:fluffychat/widgets/layouts/login_scaffold.dart'; import 'package:fluffychat/widgets/matrix.dart'; class IntroPage extends StatelessWidget { - final bool isLoading; - final String? loggingInToHomeserver; + final bool isLoading, hasPresetHomeserver; + final String? loggingInToHomeserver, welcomeText; + final VoidCallback login; const IntroPage({ required this.isLoading, required this.loggingInToHomeserver, super.key, + required this.hasPresetHomeserver, + required this.welcomeText, + required this.login, }); @override @@ -119,7 +123,7 @@ class IntroPage extends StatelessWidget { horizontal: 32.0, ), child: SelectableLinkify( - text: L10n.of(context).appIntro, + text: welcomeText ?? L10n.of(context).appIntro, textScaleFactor: MediaQuery.textScalerOf( context, ).scale(1), @@ -138,41 +142,42 @@ class IntroPage extends StatelessWidget { mainAxisSize: .min, crossAxisAlignment: .stretch, children: [ - ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: - theme.colorScheme.secondary, - foregroundColor: - theme.colorScheme.onSecondary, + if (!hasPresetHomeserver) + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: + theme.colorScheme.secondary, + foregroundColor: + theme.colorScheme.onSecondary, + ), + onPressed: () => context.go( + '${GoRouterState.of(context).uri.path}/sign_up', + ), + child: Text( + L10n.of(context).createNewAccount, + ), ), - onPressed: () => context.go( - '${GoRouterState.of(context).uri.path}/sign_up', - ), - child: Text( - L10n.of(context).createNewAccount, - ), - ), SizedBox(height: 16), ElevatedButton( - onPressed: () => context.go( - '${GoRouterState.of(context).uri.path}/sign_in', - ), + onPressed: login, child: Text(L10n.of(context).signIn), ), - TextButton( - onPressed: () async { - final client = await Matrix.of( - context, - ).getLoginClient(); - context.go( - '${GoRouterState.of(context).uri.path}/login', - extra: client, - ); - }, - child: Text( - L10n.of(context).loginWithMatrixId, + + if (!hasPresetHomeserver) + TextButton( + onPressed: () async { + final client = await Matrix.of( + context, + ).getLoginClient(); + context.go( + '${GoRouterState.of(context).uri.path}/login', + extra: client, + ); + }, + child: Text( + L10n.of(context).loginWithMatrixId, + ), ), - ), ], ), ), diff --git a/lib/pages/intro/intro_page_presenter.dart b/lib/pages/intro/intro_page_presenter.dart index 1f7bdebe4..dad35f348 100644 --- a/lib/pages/intro/intro_page_presenter.dart +++ b/lib/pages/intro/intro_page_presenter.dart @@ -3,14 +3,18 @@ import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:matrix/matrix_api_lite/utils/logs.dart'; import 'package:matrix/msc_extensions/msc_2964_oidc_login_flow/msc_2964_oidc_login_flow.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:universal_html/universal_html.dart' as web; +import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/pages/intro/intro_page.dart'; +import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/oidc_session_json_extension.dart'; +import 'package:fluffychat/utils/sign_in_flows/check_homeserver.dart'; import 'package:fluffychat/widgets/matrix.dart'; class IntroPagePresenter extends StatefulWidget { @@ -49,11 +53,13 @@ class _IntroPagePresenterState extends State { await store.remove(OidcSessionJsonExtension.storeKey); await store.remove(OidcSessionJsonExtension.homeserverStoreKey); + if (!mounted) return; if (homeserverUrl == null || session == null) { setState(() { isLoading = false; }); + return; } setState(() { @@ -87,11 +93,31 @@ class _IntroPagePresenterState extends State { } } + void _login() { + final presetHomeserver = AppSettings.presetHomeserver.value; + if (presetHomeserver.isEmpty) { + context.go('${GoRouterState.of(context).uri.path}/sign_in'); + return; + } + + connectToHomeserverFlow( + PublicHomeserverData(name: presetHomeserver), + context, + (snapshot) {}, + false, + ); + } + @override Widget build(BuildContext context) { return IntroPage( isLoading: isLoading, loggingInToHomeserver: loggingInToHomeserver, + hasPresetHomeserver: AppSettings.presetHomeserver.value.isNotEmpty, + welcomeText: AppSettings.welcomeText.value.isEmpty + ? null + : AppSettings.welcomeText.value, + login: _login, ); } } diff --git a/lib/pages/sign_in/sign_in_page.dart b/lib/pages/sign_in/sign_in_page.dart index 0b353065f..b2952952b 100644 --- a/lib/pages/sign_in/sign_in_page.dart +++ b/lib/pages/sign_in/sign_in_page.dart @@ -5,10 +5,10 @@ import 'package:url_launcher/url_launcher_string.dart'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; -import 'package:fluffychat/pages/sign_in/view_model/flows/check_homeserver.dart'; import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart'; import 'package:fluffychat/pages/sign_in/view_model/sign_in_view_model.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/utils/sign_in_flows/check_homeserver.dart'; import 'package:fluffychat/widgets/layouts/login_scaffold.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/view_model_builder.dart'; diff --git a/lib/pages/sign_in/view_model/flows/sort_homeservers.dart b/lib/pages/sign_in/utils/sort_homeservers.dart similarity index 100% rename from lib/pages/sign_in/view_model/flows/sort_homeservers.dart rename to lib/pages/sign_in/utils/sort_homeservers.dart diff --git a/lib/pages/sign_in/view_model/sign_in_view_model.dart b/lib/pages/sign_in/view_model/sign_in_view_model.dart index fefa29d3e..23d0028f2 100644 --- a/lib/pages/sign_in/view_model/sign_in_view_model.dart +++ b/lib/pages/sign_in/view_model/sign_in_view_model.dart @@ -7,7 +7,7 @@ import 'package:matrix/matrix_api_lite/utils/logs.dart'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/setting_keys.dart'; -import 'package:fluffychat/pages/sign_in/view_model/flows/sort_homeservers.dart'; +import 'package:fluffychat/pages/sign_in/utils/sort_homeservers.dart'; import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart'; import 'package:fluffychat/pages/sign_in/view_model/sign_in_state.dart'; import 'package:fluffychat/widgets/matrix.dart'; diff --git a/lib/pages/sign_in/view_model/flows/check_homeserver.dart b/lib/utils/sign_in_flows/check_homeserver.dart similarity index 94% rename from lib/pages/sign_in/view_model/flows/check_homeserver.dart rename to lib/utils/sign_in_flows/check_homeserver.dart index a7ddb206b..bd822c993 100644 --- a/lib/pages/sign_in/view_model/flows/check_homeserver.dart +++ b/lib/utils/sign_in_flows/check_homeserver.dart @@ -5,11 +5,11 @@ import 'package:go_router/go_router.dart'; import 'package:url_launcher/url_launcher_string.dart'; import 'package:fluffychat/l10n/l10n.dart'; -import 'package:fluffychat/pages/sign_in/view_model/flows/oidc_login.dart'; -import 'package:fluffychat/pages/sign_in/view_model/flows/sso_login.dart'; import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/sign_in_flows/oidc_login.dart'; +import 'package:fluffychat/utils/sign_in_flows/sso_login.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; diff --git a/lib/pages/sign_in/view_model/flows/oidc_login.dart b/lib/utils/sign_in_flows/oidc_login.dart similarity index 100% rename from lib/pages/sign_in/view_model/flows/oidc_login.dart rename to lib/utils/sign_in_flows/oidc_login.dart diff --git a/lib/pages/sign_in/view_model/flows/sso_login.dart b/lib/utils/sign_in_flows/sso_login.dart similarity index 100% rename from lib/pages/sign_in/view_model/flows/sso_login.dart rename to lib/utils/sign_in_flows/sso_login.dart diff --git a/macos/Podfile.lock b/macos/Podfile.lock index ce2bf67b4..3bc9e932c 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -40,10 +40,7 @@ PODS: - FlutterMacOS - package_info_plus (0.0.1): - FlutterMacOS - - path_provider_foundation (0.0.1): - - Flutter - - FlutterMacOS - - record_macos (1.1.0): + - record_macos (1.2.0): - FlutterMacOS - screen_retriever_macos (0.0.1): - FlutterMacOS @@ -98,7 +95,6 @@ DEPENDENCIES: - geolocator_apple (from `Flutter/ephemeral/.symlinks/plugins/geolocator_apple/darwin`) - just_audio (from `Flutter/ephemeral/.symlinks/plugins/just_audio/darwin`) - package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`) - - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) - record_macos (from `Flutter/ephemeral/.symlinks/plugins/record_macos/macos`) - screen_retriever_macos (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever_macos/macos`) - share_plus (from `Flutter/ephemeral/.symlinks/plugins/share_plus/macos`) @@ -156,8 +152,6 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/just_audio/darwin package_info_plus: :path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos - path_provider_foundation: - :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin record_macos: :path: Flutter/ephemeral/.symlinks/plugins/record_macos/macos screen_retriever_macos: @@ -203,16 +197,15 @@ SPEC CHECKSUMS: geolocator_apple: ab36aa0e8b7d7a2d7639b3b4e48308394e8cef5e just_audio: 4e391f57b79cad2b0674030a00453ca5ce817eed package_info_plus: f0052d280d17aa382b932f399edf32507174e870 - path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 - record_macos: 43194b6c06ca6f8fa132e2acea72b202b92a0f5b + record_macos: 7f227161b93c49e7e34fe681c5891c8622c8cc8b screen_retriever_macos: 452e51764a9e1cdb74b3c541238795849f21557f share_plus: 510bf0af1a42cd602274b4629920c9649c52f4cc - shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7 + shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb SQLCipher: eb79c64049cb002b4e9fcb30edb7979bf4706dfc sqlcipher_flutter_libs: 01ead34db27ae5e49987cae46c8a34199eb22cfe - url_launcher_macos: 0fba8ddabfc33ce0a9afe7c5fef5aab3d8d2d673 + url_launcher_macos: f87a979182d112f911de6820aefddaf56ee9fbfd video_compress: 752b161da855df2492dd1a8fa899743cc8fe9534 - video_player_avfoundation: 2cef49524dd1f16c5300b9cd6efd9611ce03639b + video_player_avfoundation: dd410b52df6d2466a42d28550e33e4146928280a wakelock_plus: 917609be14d812ddd9e9528876538b2263aaa03b webcrypto: a5f5eb3e375cf0a99993e207e97cdcab5c94ce2e WebRTC-SDK: 40d4f5ba05cadff14e4db5614aec402a633f007e