chore: Design follow up

This commit is contained in:
krille-chan 2023-12-26 18:19:33 +01:00
parent dd7330ecd3
commit 038cd9cb73
No known key found for this signature in database
6 changed files with 172 additions and 139 deletions

View file

@ -2383,5 +2383,6 @@
"publicSpaces": "Public spaces", "publicSpaces": "Public spaces",
"addChatOrSubSpace": "Add chat or sub space", "addChatOrSubSpace": "Add chat or sub space",
"subspace": "Subspace", "subspace": "Subspace",
"decline": "Decline" "decline": "Decline",
"thisDevice": "This device:"
} }

View file

@ -216,7 +216,7 @@ class ChatController extends State<ChatPageWithRoom> {
EmojiPickerType emojiPickerType = EmojiPickerType.keyboard; EmojiPickerType emojiPickerType = EmojiPickerType.keyboard;
void requestHistory() async { void requestHistory([_]) async {
if (!timeline!.canRequestHistory) return; if (!timeline!.canRequestHistory) return;
Logs().v('Requesting history...'); Logs().v('Requesting history...');
try { try {
@ -269,11 +269,6 @@ class ChatController extends State<ChatPageWithRoom> {
if (scrollController.position.pixels == 0 || if (scrollController.position.pixels == 0 ||
scrollController.position.pixels == 64) { scrollController.position.pixels == 64) {
requestFuture(); requestFuture();
} else if (scrollController.position.pixels ==
scrollController.position.maxScrollExtent ||
scrollController.position.pixels + 64 ==
scrollController.position.maxScrollExtent) {
requestHistory();
} }
} }

View file

@ -82,12 +82,18 @@ class ChatEventList extends StatelessWidget {
); );
} }
if (controller.timeline!.canRequestHistory) { if (controller.timeline!.canRequestHistory) {
return Builder(
builder: (context) {
WidgetsBinding.instance
.addPostFrameCallback(controller.requestHistory);
return Center( return Center(
child: IconButton( child: IconButton(
onPressed: controller.requestHistory, onPressed: controller.requestHistory,
icon: const Icon(Icons.refresh_outlined), icon: const Icon(Icons.refresh_outlined),
), ),
); );
},
);
} }
return const SizedBox.shrink(); return const SizedBox.shrink();
} }

View file

@ -47,7 +47,22 @@ class DevicesSettingsView extends StatelessWidget {
return Column( return Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
if (controller.thisDevice != null) if (controller.thisDevice != null) ...[
Container(
padding: const EdgeInsets.symmetric(
horizontal: 16.0,
vertical: 8.0,
),
alignment: Alignment.centerLeft,
child: Text(
L10n.of(context)!.thisDevice,
style: TextStyle(
fontWeight: FontWeight.bold,
color: Theme.of(context).colorScheme.primary,
),
textAlign: TextAlign.left,
),
),
UserDeviceListItem( UserDeviceListItem(
controller.thisDevice!, controller.thisDevice!,
rename: controller.renameDeviceAction, rename: controller.renameDeviceAction,
@ -56,24 +71,44 @@ class DevicesSettingsView extends StatelessWidget {
block: controller.blockDeviceAction, block: controller.blockDeviceAction,
unblock: controller.unblockDeviceAction, unblock: controller.unblockDeviceAction,
), ),
const Divider(height: 1), const Divider(
height: 16.0,
indent: 16,
endIndent: 16,
),
],
if (controller.notThisDevice.isNotEmpty) if (controller.notThisDevice.isNotEmpty)
ListTile( Padding(
title: Text( padding: const EdgeInsets.symmetric(
horizontal: 16.0,
vertical: 8.0,
),
child: SizedBox(
width: double.infinity,
child: OutlinedButton.icon(
label: Text(
controller.errorDeletingDevices ?? controller.errorDeletingDevices ??
L10n.of(context)!.removeAllOtherDevices, L10n.of(context)!.removeAllOtherDevices,
style: const TextStyle(color: Colors.red),
), ),
trailing: controller.loadingDeletingDevices style: OutlinedButton.styleFrom(
foregroundColor:
Theme.of(context).colorScheme.error,
side: BorderSide(
color: Theme.of(context).colorScheme.error,
),
),
icon: controller.loadingDeletingDevices
? const CircularProgressIndicator.adaptive( ? const CircularProgressIndicator.adaptive(
strokeWidth: 2, strokeWidth: 2,
) )
: const Icon(Icons.delete_outline), : const Icon(Icons.delete_outline),
onTap: controller.loadingDeletingDevices onPressed: controller.loadingDeletingDevices
? null ? null
: () => controller.removeDevicesAction( : () => controller.removeDevicesAction(
controller.notThisDevice, controller.notThisDevice,
), ),
),
),
) )
else else
Center( Center(
@ -82,7 +117,6 @@ class DevicesSettingsView extends StatelessWidget {
child: Text(L10n.of(context)!.noOtherDevicesFound), child: Text(L10n.of(context)!.noOtherDevicesFound),
), ),
), ),
const Divider(height: 1),
], ],
); );
} }

View file

@ -4,6 +4,7 @@ import 'package:adaptive_dialog/adaptive_dialog.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:matrix/matrix.dart'; import 'package:matrix/matrix.dart';
import 'package:fluffychat/config/app_config.dart';
import '../../utils/date_time_extension.dart'; import '../../utils/date_time_extension.dart';
import '../../utils/matrix_sdk_extensions/device_extension.dart'; import '../../utils/matrix_sdk_extensions/device_extension.dart';
import '../../widgets/matrix.dart'; import '../../widgets/matrix.dart';
@ -41,7 +42,12 @@ class UserDeviceListItem extends StatelessWidget {
?.deviceKeys[userDevice.deviceId]; ?.deviceKeys[userDevice.deviceId];
final isOwnDevice = userDevice.deviceId == client.deviceID; final isOwnDevice = userDevice.deviceId == client.deviceID;
return ListTile( return Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0),
child: Material(
borderRadius: BorderRadius.circular(AppConfig.borderRadius),
clipBehavior: Clip.hardEdge,
child: ListTile(
onTap: () async { onTap: () async {
final action = await showModalActionSheet<UserDeviceListItemAction>( final action = await showModalActionSheet<UserDeviceListItemAction>(
context: context, context: context,
@ -107,17 +113,21 @@ class UserDeviceListItem extends StatelessWidget {
: Colors.orange, : Colors.orange,
child: Icon(userDevice.icon), child: Icon(userDevice.icon),
), ),
title: Row( title: Text(
children: <Widget>[
Expanded(
child: Text(
userDevice.displayname, userDevice.displayname,
maxLines: 1, maxLines: 1,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
), ),
subtitle: Text(
L10n.of(context)!.lastActiveAgo(
DateTime.fromMillisecondsSinceEpoch(userDevice.lastSeenTs ?? 0)
.localizedTimeShort(context),
), ),
if (keys != null) style: const TextStyle(fontWeight: FontWeight.w300),
Text( ),
trailing: keys == null
? null
: Text(
keys.blocked keys.blocked
? L10n.of(context)!.blocked ? L10n.of(context)!.blocked
: keys.verified : keys.verified
@ -131,14 +141,7 @@ class UserDeviceListItem extends StatelessWidget {
: Colors.orange, : Colors.orange,
), ),
), ),
],
), ),
subtitle: Text(
L10n.of(context)!.lastActiveAgo(
DateTime.fromMillisecondsSinceEpoch(userDevice.lastSeenTs ?? 0)
.localizedTimeShort(context),
),
style: const TextStyle(fontWeight: FontWeight.w300),
), ),
); );
} }

View file

@ -45,26 +45,20 @@ class SettingsNotificationsView extends StatelessWidget {
), ),
), ),
), ),
if (!Matrix.of(context).client.allPushNotificationsMuted) ...{
const Divider(thickness: 1),
ListTile(
title: Text(
L10n.of(context)!.pushRules,
style: TextStyle(
color: Theme.of(context).colorScheme.secondary,
fontWeight: FontWeight.bold,
),
),
),
for (final item in NotificationSettingsItem.items) for (final item in NotificationSettingsItem.items)
SwitchListTile.adaptive( SwitchListTile.adaptive(
value: controller.getNotificationSetting(item) ?? true, value: Matrix.of(context).client.allPushNotificationsMuted
? false
: controller.getNotificationSetting(item) ?? true,
title: Text(item.title(context)), title: Text(item.title(context)),
onChanged: (bool enabled) => onChanged: Matrix.of(context)
.client
.allPushNotificationsMuted
? null
: (bool enabled) =>
controller.setNotificationSetting(item, enabled), controller.setNotificationSetting(item, enabled),
), ),
}, const Divider(),
const Divider(thickness: 1),
ListTile( ListTile(
title: Text( title: Text(
L10n.of(context)!.devices, L10n.of(context)!.devices,