From 2408568f365e3f3a648ecedb635f8b320c5cbf58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Tue, 24 Feb 2026 20:23:35 +0100 Subject: [PATCH] chore: Follow up sign up design --- lib/pages/sign_in/sign_in_page.dart | 311 +++++++++--------- lib/pages/sign_in/utils/sort_homeservers.dart | 2 +- .../model/public_homeserver_data.dart | 6 +- lib/utils/sign_in_flows/check_homeserver.dart | 2 +- pubspec.lock | 24 +- 5 files changed, 174 insertions(+), 171 deletions(-) diff --git a/lib/pages/sign_in/sign_in_page.dart b/lib/pages/sign_in/sign_in_page.dart index e86d39bb1..77f09df98 100644 --- a/lib/pages/sign_in/sign_in_page.dart +++ b/lib/pages/sign_in/sign_in_page.dart @@ -37,164 +37,165 @@ class SignInPage extends StatelessWidget { ? L10n.of(context).createNewAccount : L10n.of(context).login, ), - bottom: PreferredSize( - preferredSize: const Size.fromHeight(56 + 60), - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - mainAxisSize: .min, - crossAxisAlignment: .center, - spacing: 12, - children: [ - SelectableText( - signUp - ? L10n.of(context).signUpGreeting - : L10n.of(context).signInGreeting, - textAlign: .center, + ), + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Column( + spacing: 16, + children: [ + SelectableText( + signUp + ? L10n.of(context).signUpGreeting + : L10n.of(context).signInGreeting, + textAlign: .center, + ), + TextField( + readOnly: + state.publicHomeservers.connectionState == + ConnectionState.waiting, + controller: viewModel.filterTextController, + autocorrect: false, + keyboardType: TextInputType.url, + decoration: InputDecoration( + filled: true, + fillColor: theme.colorScheme.secondaryContainer, + border: OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(99), ), - TextField( - readOnly: - state.publicHomeservers.connectionState == - ConnectionState.waiting, - controller: viewModel.filterTextController, - autocorrect: false, - keyboardType: TextInputType.url, - decoration: InputDecoration( - filled: true, - fillColor: theme.colorScheme.secondaryContainer, - border: OutlineInputBorder( - borderSide: BorderSide.none, - borderRadius: BorderRadius.circular(99), + errorText: state.publicHomeservers.error?.toLocalizedString( + context, + ), + prefixIcon: const Icon(Icons.search_outlined), + hintText: L10n.of(context).searchOrEnterHomeserverAddress, + ), + ), + if (state.publicHomeservers.connectionState == + ConnectionState.done) + Expanded( + child: Material( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + clipBehavior: Clip.hardEdge, + color: theme.colorScheme.surfaceContainerLow, + child: RadioGroup( + groupValue: state.selectedHomeserver, + onChanged: viewModel.selectHomeserver, + child: ListView.builder( + itemCount: publicHomeservers.length, + itemBuilder: (context, i) { + final server = publicHomeservers[i]; + final website = server.website; + return RadioListTile.adaptive( + value: server, + radioScaleFactor: + FluffyThemes.isColumnMode(context) || + { + TargetPlatform.iOS, + TargetPlatform.macOS, + }.contains(theme.platform) + ? 2 + : 1, + title: Row( + children: [ + Expanded( + child: Text(server.name ?? 'Unknown'), + ), + if (website != null) + SizedBox.square( + dimension: 32, + child: IconButton( + icon: const Icon( + Icons.open_in_new_outlined, + size: 16, + ), + onPressed: () => + launchUrlString(website), + ), + ), + ], + ), + subtitle: Column( + spacing: 4.0, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + if (server.features?.isNotEmpty == true) + Wrap( + spacing: 4.0, + runSpacing: 4.0, + children: [ + ...?server.languages?.map( + (language) => Material( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + color: theme + .colorScheme + .tertiaryContainer, + child: Padding( + padding: + const EdgeInsets.symmetric( + horizontal: 6.0, + vertical: 3.0, + ), + child: Text( + language, + style: TextStyle( + fontSize: 10, + color: theme + .colorScheme + .onTertiaryContainer, + ), + ), + ), + ), + ), + ...server.features!.map( + (feature) => Material( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + color: theme + .colorScheme + .secondaryContainer, + child: Padding( + padding: + const EdgeInsets.symmetric( + horizontal: 6.0, + vertical: 3.0, + ), + child: Text( + feature, + style: TextStyle( + fontSize: 10, + color: theme + .colorScheme + .onSecondaryContainer, + ), + ), + ), + ), + ), + ], + ), + Text( + server.description ?? 'A matrix homeserver', + ), + ], + ), + ); + }, ), - errorText: state.publicHomeservers.error - ?.toLocalizedString(context), - prefixIcon: const Icon(Icons.search_outlined), - hintText: L10n.of( - context, - ).searchOrEnterHomeserverAddress, ), ), - ], - ), - ), + ) + else + Center(child: CircularProgressIndicator.adaptive()), + ], ), ), - body: state.publicHomeservers.connectionState == ConnectionState.done - ? Padding( - padding: const EdgeInsets.symmetric(horizontal: 16.0), - child: Material( - borderRadius: BorderRadius.circular(AppConfig.borderRadius), - clipBehavior: Clip.hardEdge, - color: theme.colorScheme.surfaceContainerLow, - child: RadioGroup( - groupValue: state.selectedHomeserver, - onChanged: viewModel.selectHomeserver, - child: ListView.builder( - itemCount: publicHomeservers.length, - itemBuilder: (context, i) { - final server = publicHomeservers[i]; - final homepage = server.homepage; - return RadioListTile.adaptive( - value: server, - radioScaleFactor: - FluffyThemes.isColumnMode(context) || - { - TargetPlatform.iOS, - TargetPlatform.macOS, - }.contains(theme.platform) - ? 2 - : 1, - title: Row( - children: [ - Expanded(child: Text(server.name ?? 'Unknown')), - if (homepage != null) - SizedBox.square( - dimension: 32, - child: IconButton( - icon: const Icon( - Icons.open_in_new_outlined, - size: 16, - ), - onPressed: () => - launchUrlString(homepage), - ), - ), - ], - ), - subtitle: Column( - spacing: 4.0, - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - if (server.features?.isNotEmpty == true) - Wrap( - spacing: 4.0, - runSpacing: 4.0, - children: [ - ...?server.languages?.map( - (language) => Material( - borderRadius: BorderRadius.circular( - AppConfig.borderRadius, - ), - color: theme - .colorScheme - .tertiaryContainer, - child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 6.0, - vertical: 3.0, - ), - child: Text( - language, - style: TextStyle( - fontSize: 10, - color: theme - .colorScheme - .onTertiaryContainer, - ), - ), - ), - ), - ), - ...server.features!.map( - (feature) => Material( - borderRadius: BorderRadius.circular( - AppConfig.borderRadius, - ), - color: theme - .colorScheme - .secondaryContainer, - child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 6.0, - vertical: 3.0, - ), - child: Text( - feature, - style: TextStyle( - fontSize: 10, - color: theme - .colorScheme - .onSecondaryContainer, - ), - ), - ), - ), - ), - ], - ), - Text( - server.description ?? 'A matrix homeserver', - ), - ], - ), - ); - }, - ), - ), - ), - ) - : Center(child: CircularProgressIndicator.adaptive()), bottomNavigationBar: AnimatedSize( duration: FluffyThemes.animationDuration, curve: FluffyThemes.animationCurve, @@ -203,12 +204,14 @@ class SignInPage extends StatelessWidget { !publicHomeservers.contains(selectedHomserver) ? const SizedBox.shrink() : Material( - elevation: 8, - shadowColor: theme.appBarTheme.shadowColor, child: Padding( padding: const EdgeInsets.all(16.0), child: SafeArea( child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: theme.colorScheme.primary, + foregroundColor: theme.colorScheme.onPrimary, + ), onPressed: state.loginLoading.connectionState == ConnectionState.waiting diff --git a/lib/pages/sign_in/utils/sort_homeservers.dart b/lib/pages/sign_in/utils/sort_homeservers.dart index 7c54a01b8..18f30dfce 100644 --- a/lib/pages/sign_in/utils/sort_homeservers.dart +++ b/lib/pages/sign_in/utils/sort_homeservers.dart @@ -7,7 +7,7 @@ int sortHomeservers(PublicHomeserverData a, PublicHomeserverData b) { int _calcHomeserverScore(PublicHomeserverData homeserver) { var score = 0; if (homeserver.description?.isNotEmpty == true) score++; - if (homeserver.homepage?.isNotEmpty == true) score++; + if (homeserver.website?.isNotEmpty == true) score++; score += (homeserver.languages?.length ?? 0); score += (homeserver.features?.length ?? 0); score += (homeserver.onlineStatus ?? 0); diff --git a/lib/pages/sign_in/view_model/model/public_homeserver_data.dart b/lib/pages/sign_in/view_model/model/public_homeserver_data.dart index b8046b821..4d484eb10 100644 --- a/lib/pages/sign_in/view_model/model/public_homeserver_data.dart +++ b/lib/pages/sign_in/view_model/model/public_homeserver_data.dart @@ -1,7 +1,7 @@ class PublicHomeserverData { final String? name; final String? clientDomain; - final String? homepage; + final String? website; final String? isp; final String? staffJur; final String? rules; @@ -26,7 +26,7 @@ class PublicHomeserverData { PublicHomeserverData({ this.name, this.clientDomain, - this.homepage, + this.website, this.isp, this.staffJur, this.rules, @@ -53,7 +53,7 @@ class PublicHomeserverData { return PublicHomeserverData( name: json['name'], clientDomain: json['client_domain'], - homepage: json['homepage'], + website: json['website'], isp: json['isp'], staffJur: json['staff_jur'], rules: json['rules'], diff --git a/lib/utils/sign_in_flows/check_homeserver.dart b/lib/utils/sign_in_flows/check_homeserver.dart index 1466215b5..754a2d9bf 100644 --- a/lib/utils/sign_in_flows/check_homeserver.dart +++ b/lib/utils/sign_in_flows/check_homeserver.dart @@ -1,10 +1,10 @@ -import 'package:fluffychat/config/setting_keys.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:url_launcher/url_launcher_string.dart'; +import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; diff --git a/pubspec.lock b/pubspec.lock index 8a8077451..77050341f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -165,10 +165,10 @@ packages: dependency: transitive description: name: characters - sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.4.1" charcode: dependency: transitive description: @@ -1112,18 +1112,18 @@ packages: dependency: transitive description: name: matcher - sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" url: "https://pub.dev" source: hosted - version: "0.12.17" + version: "0.12.18" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.13.0" matrix: dependency: "direct main" description: @@ -1877,26 +1877,26 @@ packages: dependency: transitive description: name: test - sha256: "75906bf273541b676716d1ca7627a17e4c4070a3a16272b7a3dc7da3b9f3f6b7" + sha256: "54c516bbb7cee2754d327ad4fca637f78abfc3cbcc5ace83b3eda117e42cd71a" url: "https://pub.dev" source: hosted - version: "1.26.3" + version: "1.29.0" test_api: dependency: transitive description: name: test_api - sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 + sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" url: "https://pub.dev" source: hosted - version: "0.7.7" + version: "0.7.9" test_core: dependency: transitive description: name: test_core - sha256: "0cc24b5ff94b38d2ae73e1eb43cc302b77964fbf67abad1e296025b78deb53d0" + sha256: "394f07d21f0f2255ec9e3989f21e54d3c7dc0e6e9dbce160e5a9c1a6be0e2943" url: "https://pub.dev" source: hosted - version: "0.6.12" + version: "0.6.15" timezone: dependency: transitive description: