chore: Follow up design textfields

This commit is contained in:
Krille 2024-08-27 07:46:48 +02:00
commit aa3de2816b
No known key found for this signature in database
GPG key ID: E067ECD60F1A0652
13 changed files with 105 additions and 52 deletions

View file

@ -34,6 +34,7 @@ class ChatMembersView extends StatelessWidget {
(room.summary.mInvitedMemberCount ?? 0);
final error = controller.error;
final theme = Theme.of(context);
return Scaffold(
appBar: AppBar(
@ -90,6 +91,16 @@ class ChatMembersView extends StatelessWidget {
controller: controller.filterController,
onChanged: controller.setFilter,
decoration: InputDecoration(
filled: true,
fillColor: theme.colorScheme.secondaryContainer,
border: OutlineInputBorder(
borderSide: BorderSide.none,
borderRadius: BorderRadius.circular(99),
),
hintStyle: TextStyle(
color: theme.colorScheme.onPrimaryContainer,
fontWeight: FontWeight.normal,
),
prefixIcon: const Icon(Icons.search_outlined),
hintText: L10n.of(context)!.search,
),

View file

@ -31,6 +31,8 @@ class ChatSearchView extends StatelessWidget {
);
}
final theme = Theme.of(context);
return Scaffold(
appBar: AppBar(
leading: const Center(child: BackButton()),
@ -59,6 +61,16 @@ class ChatSearchView extends StatelessWidget {
decoration: InputDecoration(
hintText: L10n.of(context)!.search,
suffixIcon: const Icon(Icons.search_outlined),
filled: true,
fillColor: theme.colorScheme.secondaryContainer,
border: OutlineInputBorder(
borderSide: BorderSide.none,
borderRadius: BorderRadius.circular(99),
),
hintStyle: TextStyle(
color: theme.colorScheme.onPrimaryContainer,
fontWeight: FontWeight.normal,
),
),
),
),

View file

@ -86,7 +86,17 @@ class HomeserverPickerController extends State<HomeserverPicker> {
Future<void> checkHomeserverAction([_]) async {
homeserverController.text =
homeserverController.text.trim().toLowerCase().replaceAll(' ', '-');
if (homeserverController.text == _lastCheckedUrl) return;
if (homeserverController.text.isEmpty) {
setState(() {
error = loginFlows = null;
isLoading = false;
Matrix.of(context).getLoginClient().homeserver = null;
});
return;
}
if (_lastCheckedUrl == homeserverController.text) return;
_lastCheckedUrl = homeserverController.text;
setState(() {
error = loginFlows = null;
@ -102,7 +112,12 @@ class HomeserverPickerController extends State<HomeserverPicker> {
final (_, _, loginFlows) = await client.checkHomeserver(homeserver);
this.loginFlows = loginFlows;
} catch (e) {
setState(() => error = (e).toLocalizedString(context));
setState(
() => error = (e).toLocalizedString(
context,
ExceptionContext.checkHomeserver,
),
);
} finally {
if (mounted) {
setState(() => isLoading = false);

View file

@ -76,6 +76,8 @@ class HomeserverPickerView extends StatelessWidget {
controller.tryCheckHomeserverActionWithoutCooldown,
onTap: controller.tryCheckHomeserverActionWithCooldown,
controller: controller.homeserverController,
autocorrect: false,
keyboardType: TextInputType.url,
decoration: InputDecoration(
prefixIcon: controller.isLoading
? Container(

View file

@ -29,6 +29,7 @@ class InvitationSelectionView extends StatelessWidget {
}
final groupName = room.name.isEmpty ? L10n.of(context)!.group : room.name;
final theme = Theme.of(context);
return Scaffold(
appBar: AppBar(
leading: const Center(child: BackButton()),
@ -44,6 +45,16 @@ class InvitationSelectionView extends StatelessWidget {
child: TextField(
textInputAction: TextInputAction.search,
decoration: InputDecoration(
filled: true,
fillColor: theme.colorScheme.secondaryContainer,
border: OutlineInputBorder(
borderSide: BorderSide.none,
borderRadius: BorderRadius.circular(99),
),
hintStyle: TextStyle(
color: theme.colorScheme.onPrimaryContainer,
fontWeight: FontWeight.normal,
),
hintText: L10n.of(context)!.inviteContactToGroup(groupName),
prefixIcon: controller.loading
? const Padding(

View file

@ -61,12 +61,13 @@ class NewGroupView extends StatelessWidget {
readOnly: controller.loading,
decoration: InputDecoration(
prefixIcon: const Icon(Icons.people_outlined),
hintText: L10n.of(context)!.groupName,
labelText: L10n.of(context)!.groupName,
),
),
),
const SizedBox(height: 16),
SwitchListTile.adaptive(
contentPadding: const EdgeInsets.symmetric(horizontal: 32),
secondary: const Icon(Icons.public_outlined),
title: Text(L10n.of(context)!.groupIsPublic),
value: controller.publicGroup,
@ -76,6 +77,8 @@ class NewGroupView extends StatelessWidget {
duration: FluffyThemes.animationDuration,
child: controller.publicGroup
? SwitchListTile.adaptive(
contentPadding:
const EdgeInsets.symmetric(horizontal: 32),
secondary: const Icon(Icons.search_outlined),
title: Text(L10n.of(context)!.groupCanBeFoundViaSearch),
value: controller.groupCanBeFound,
@ -86,6 +89,7 @@ class NewGroupView extends StatelessWidget {
: const SizedBox.shrink(),
),
SwitchListTile.adaptive(
contentPadding: const EdgeInsets.symmetric(horizontal: 32),
secondary: Icon(
Icons.lock_outlined,
color: theme.colorScheme.onSurface,
@ -108,16 +112,7 @@ class NewGroupView extends StatelessWidget {
controller.loading ? null : controller.submitAction,
child: controller.loading
? const LinearProgressIndicator()
: Row(
children: [
Expanded(
child: Text(
L10n.of(context)!.createGroupAndInviteUsers,
),
),
Icon(Icons.adaptive.arrow_forward_outlined),
],
),
: Text(L10n.of(context)!.createGroupAndInviteUsers),
),
),
),

View file

@ -54,6 +54,16 @@ class NewPrivateChatView extends StatelessWidget {
onChanged: controller.searchUsers,
decoration: InputDecoration(
hintText: L10n.of(context)!.searchForUsers,
filled: true,
fillColor: theme.colorScheme.secondaryContainer,
border: OutlineInputBorder(
borderSide: BorderSide.none,
borderRadius: BorderRadius.circular(99),
),
hintStyle: TextStyle(
color: theme.colorScheme.onPrimaryContainer,
fontWeight: FontWeight.normal,
),
prefixIcon: searchResponse == null
? const Icon(Icons.search_outlined)
: FutureBuilder(

View file

@ -51,18 +51,20 @@ class NewSpaceView extends StatelessWidget {
readOnly: controller.loading,
decoration: InputDecoration(
prefixIcon: const Icon(Icons.people_outlined),
hintText: L10n.of(context)!.spaceName,
labelText: L10n.of(context)!.spaceName,
errorText: controller.nameError,
),
),
),
const SizedBox(height: 16),
SwitchListTile.adaptive(
contentPadding: const EdgeInsets.symmetric(horizontal: 32),
title: Text(L10n.of(context)!.spaceIsPublic),
value: controller.publicGroup,
onChanged: controller.setPublicGroup,
),
ListTile(
contentPadding: const EdgeInsets.symmetric(horizontal: 32),
trailing: const Padding(
padding: EdgeInsets.symmetric(horizontal: 16.0),
child: Icon(Icons.info_outlined),
@ -78,16 +80,7 @@ class NewSpaceView extends StatelessWidget {
controller.loading ? null : controller.submitAction,
child: controller.loading
? const LinearProgressIndicator()
: Row(
children: [
Expanded(
child: Text(
L10n.of(context)!.createNewSpace,
),
),
Icon(Icons.adaptive.arrow_forward_outlined),
],
),
: Text(L10n.of(context)!.createNewSpace),
),
),
),

View file

@ -46,7 +46,7 @@ class SettingsIgnoreListView extends StatelessWidget {
labelText: L10n.of(context)!.blockUsername,
suffixIcon: IconButton(
tooltip: L10n.of(context)!.block,
icon: const Icon(Icons.send_outlined),
icon: const Icon(Icons.add),
onPressed: () => controller.ignoreUser(context),
),
),

View file

@ -17,12 +17,6 @@ class SettingsPasswordView extends StatelessWidget {
return Scaffold(
appBar: AppBar(
title: Text(L10n.of(context)!.changePassword),
actions: [
TextButton(
child: Text(L10n.of(context)!.passwordRecoverySettings),
onPressed: () => context.go('/rooms/settings/security/3pid'),
),
],
),
body: ListTileTheme(
iconColor: theme.colorScheme.onSurface,
@ -31,13 +25,6 @@ class SettingsPasswordView extends StatelessWidget {
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
Center(
child: Icon(
Icons.key_outlined,
color: theme.dividerColor,
size: 80,
),
),
const SizedBox(height: 16),
TextField(
controller: controller.oldPasswordController,
@ -46,18 +33,22 @@ class SettingsPasswordView extends StatelessWidget {
autofocus: true,
readOnly: controller.loading,
decoration: InputDecoration(
hintText: L10n.of(context)!.pleaseEnterYourCurrentPassword,
prefixIcon: const Icon(Icons.lock_outlined),
hintText: '********',
labelText: L10n.of(context)!.pleaseEnterYourCurrentPassword,
errorText: controller.oldPasswordError,
),
),
const Divider(height: 32),
const Divider(height: 64),
TextField(
controller: controller.newPassword1Controller,
obscureText: true,
autocorrect: false,
readOnly: controller.loading,
decoration: InputDecoration(
hintText: L10n.of(context)!.newPassword,
prefixIcon: const Icon(Icons.lock_reset_outlined),
hintText: '********',
labelText: L10n.of(context)!.newPassword,
errorText: controller.newPassword1Error,
),
),
@ -68,22 +59,28 @@ class SettingsPasswordView extends StatelessWidget {
autocorrect: false,
readOnly: controller.loading,
decoration: InputDecoration(
hintText: L10n.of(context)!.repeatPassword,
prefixIcon: const Icon(Icons.repeat_outlined),
hintText: '********',
labelText: L10n.of(context)!.repeatPassword,
errorText: controller.newPassword2Error,
),
),
const SizedBox(height: 16),
const SizedBox(height: 32),
SizedBox(
width: double.infinity,
child: ElevatedButton.icon(
child: ElevatedButton(
onPressed:
controller.loading ? null : controller.changePassword,
icon: const Icon(Icons.send_outlined),
label: controller.loading
child: controller.loading
? const LinearProgressIndicator()
: Text(L10n.of(context)!.changePassword),
),
),
const SizedBox(height: 16),
TextButton(
child: Text(L10n.of(context)!.passwordRecoverySettings),
onPressed: () => context.go('/rooms/settings/security/3pid'),
),
],
),
),

View file

@ -87,9 +87,7 @@ class SettingsSecurityView extends StatelessWidget {
onTap: controller.setAppLockAction,
),
},
Divider(
color: theme.dividerColor,
),
Divider(color: theme.dividerColor),
ListTile(
title: Text(
L10n.of(context)!.account,
@ -118,13 +116,14 @@ class SettingsSecurityView extends StatelessWidget {
),
ListTile(
iconColor: Colors.orange,
leading: const Icon(Icons.tap_and_play),
leading: const Icon(Icons.delete_sweep_outlined),
title: Text(
L10n.of(context)!.dehydrate,
style: const TextStyle(color: Colors.orange),
),
onTap: controller.dehydrateAction,
),
Divider(color: theme.dividerColor),
ListTile(
iconColor: Colors.red,
leading: const Icon(Icons.delete_outlined),

View file

@ -3,6 +3,7 @@ import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:http/http.dart';
import 'package:matrix/encryption.dart';
import 'package:matrix/matrix.dart';
@ -69,9 +70,14 @@ extension LocalizedExceptionExtension on Object {
}
if (this is IOException ||
this is SocketException ||
this is SyncConnectionException) {
this is SyncConnectionException ||
this is ClientException) {
return L10n.of(context)!.noConnectionToTheServer;
}
if (this is FormatException &&
exceptionContext == ExceptionContext.checkHomeserver) {
return L10n.of(context)!.doesNotSeemToBeAValidHomeserver;
}
if (this is String) return toString();
if (this is UiaException) return toString();
Logs().w('Something went wrong: ', this);
@ -81,4 +87,5 @@ extension LocalizedExceptionExtension on Object {
enum ExceptionContext {
changePassword,
checkHomeserver,
}