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",
"addChatOrSubSpace": "Add chat or sub space",
"subspace": "Subspace",
"decline": "Decline"
"decline": "Decline",
"thisDevice": "This device:"
}

View file

@ -216,7 +216,7 @@ class ChatController extends State<ChatPageWithRoom> {
EmojiPickerType emojiPickerType = EmojiPickerType.keyboard;
void requestHistory() async {
void requestHistory([_]) async {
if (!timeline!.canRequestHistory) return;
Logs().v('Requesting history...');
try {
@ -269,11 +269,6 @@ class ChatController extends State<ChatPageWithRoom> {
if (scrollController.position.pixels == 0 ||
scrollController.position.pixels == 64) {
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) {
return Builder(
builder: (context) {
WidgetsBinding.instance
.addPostFrameCallback(controller.requestHistory);
return Center(
child: IconButton(
onPressed: controller.requestHistory,
icon: const Icon(Icons.refresh_outlined),
),
);
},
);
}
return const SizedBox.shrink();
}

View file

@ -47,7 +47,22 @@ class DevicesSettingsView extends StatelessWidget {
return Column(
mainAxisSize: MainAxisSize.min,
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(
controller.thisDevice!,
rename: controller.renameDeviceAction,
@ -56,24 +71,44 @@ class DevicesSettingsView extends StatelessWidget {
block: controller.blockDeviceAction,
unblock: controller.unblockDeviceAction,
),
const Divider(height: 1),
const Divider(
height: 16.0,
indent: 16,
endIndent: 16,
),
],
if (controller.notThisDevice.isNotEmpty)
ListTile(
title: Text(
Padding(
padding: const EdgeInsets.symmetric(
horizontal: 16.0,
vertical: 8.0,
),
child: SizedBox(
width: double.infinity,
child: OutlinedButton.icon(
label: Text(
controller.errorDeletingDevices ??
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(
strokeWidth: 2,
)
: const Icon(Icons.delete_outline),
onTap: controller.loadingDeletingDevices
onPressed: controller.loadingDeletingDevices
? null
: () => controller.removeDevicesAction(
controller.notThisDevice,
),
),
),
)
else
Center(
@ -82,7 +117,6 @@ class DevicesSettingsView extends StatelessWidget {
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:matrix/matrix.dart';
import 'package:fluffychat/config/app_config.dart';
import '../../utils/date_time_extension.dart';
import '../../utils/matrix_sdk_extensions/device_extension.dart';
import '../../widgets/matrix.dart';
@ -41,7 +42,12 @@ class UserDeviceListItem extends StatelessWidget {
?.deviceKeys[userDevice.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 {
final action = await showModalActionSheet<UserDeviceListItemAction>(
context: context,
@ -107,17 +113,21 @@ class UserDeviceListItem extends StatelessWidget {
: Colors.orange,
child: Icon(userDevice.icon),
),
title: Row(
children: <Widget>[
Expanded(
child: Text(
title: Text(
userDevice.displayname,
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
subtitle: Text(
L10n.of(context)!.lastActiveAgo(
DateTime.fromMillisecondsSinceEpoch(userDevice.lastSeenTs ?? 0)
.localizedTimeShort(context),
),
if (keys != null)
Text(
style: const TextStyle(fontWeight: FontWeight.w300),
),
trailing: keys == null
? null
: Text(
keys.blocked
? L10n.of(context)!.blocked
: keys.verified
@ -131,14 +141,7 @@ class UserDeviceListItem extends StatelessWidget {
: 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)
SwitchListTile.adaptive(
value: controller.getNotificationSetting(item) ?? true,
value: Matrix.of(context).client.allPushNotificationsMuted
? false
: controller.getNotificationSetting(item) ?? true,
title: Text(item.title(context)),
onChanged: (bool enabled) =>
onChanged: Matrix.of(context)
.client
.allPushNotificationsMuted
? null
: (bool enabled) =>
controller.setNotificationSetting(item, enabled),
),
},
const Divider(thickness: 1),
const Divider(),
ListTile(
title: Text(
L10n.of(context)!.devices,