2021-04-15 07:46:43 +00:00
|
|
|
import 'package:flutter/material.dart';
|
2021-10-26 16:50:34 +00:00
|
|
|
|
|
|
|
import 'package:adaptive_dialog/adaptive_dialog.dart';
|
2021-04-15 07:46:43 +00:00
|
|
|
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
2021-10-26 16:50:34 +00:00
|
|
|
import 'package:matrix/matrix.dart';
|
2021-04-15 07:46:43 +00:00
|
|
|
|
2021-05-22 06:53:52 +00:00
|
|
|
import '../../utils/date_time_extension.dart';
|
2021-05-22 07:24:39 +00:00
|
|
|
import '../../utils/matrix_sdk_extensions.dart/device_extension.dart';
|
2021-11-09 20:32:16 +00:00
|
|
|
import '../../widgets/matrix.dart';
|
2021-04-15 07:46:43 +00:00
|
|
|
|
|
|
|
enum UserDeviceListItemAction {
|
|
|
|
rename,
|
|
|
|
remove,
|
|
|
|
verify,
|
|
|
|
block,
|
|
|
|
unblock,
|
|
|
|
}
|
|
|
|
|
|
|
|
class UserDeviceListItem extends StatelessWidget {
|
|
|
|
final Device userDevice;
|
|
|
|
final void Function(Device) remove;
|
|
|
|
final void Function(Device) rename;
|
|
|
|
final void Function(Device) verify;
|
|
|
|
final void Function(Device) block;
|
|
|
|
final void Function(Device) unblock;
|
|
|
|
|
|
|
|
const UserDeviceListItem(
|
|
|
|
this.userDevice, {
|
|
|
|
@required this.remove,
|
|
|
|
@required this.rename,
|
|
|
|
@required this.verify,
|
|
|
|
@required this.block,
|
|
|
|
@required this.unblock,
|
|
|
|
Key key,
|
|
|
|
}) : super(key: key);
|
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
final keys = Matrix.of(context)
|
|
|
|
.client
|
|
|
|
.userDeviceKeys[Matrix.of(context).client.userID]
|
|
|
|
?.deviceKeys[userDevice.deviceId];
|
|
|
|
|
|
|
|
return ListTile(
|
|
|
|
onTap: () async {
|
|
|
|
final action = await showModalActionSheet<UserDeviceListItemAction>(
|
|
|
|
context: context,
|
2021-11-19 09:07:05 +00:00
|
|
|
title: '${userDevice.displayName} (${userDevice.deviceId})',
|
2021-04-15 07:46:43 +00:00
|
|
|
actions: [
|
|
|
|
SheetAction(
|
|
|
|
key: UserDeviceListItemAction.rename,
|
|
|
|
label: L10n.of(context).changeDeviceName,
|
|
|
|
),
|
|
|
|
if (keys != null) ...{
|
2021-09-19 20:02:37 +00:00
|
|
|
SheetAction(
|
|
|
|
key: UserDeviceListItemAction.verify,
|
|
|
|
label: L10n.of(context).verifyStart,
|
|
|
|
),
|
2021-04-15 07:46:43 +00:00
|
|
|
if (!keys.blocked)
|
|
|
|
SheetAction(
|
|
|
|
key: UserDeviceListItemAction.block,
|
|
|
|
label: L10n.of(context).blockDevice,
|
|
|
|
isDestructiveAction: true,
|
|
|
|
),
|
|
|
|
if (keys.blocked)
|
|
|
|
SheetAction(
|
|
|
|
key: UserDeviceListItemAction.unblock,
|
|
|
|
label: L10n.of(context).unblockDevice,
|
|
|
|
isDestructiveAction: true,
|
|
|
|
),
|
|
|
|
},
|
2021-09-19 20:02:37 +00:00
|
|
|
SheetAction(
|
|
|
|
key: UserDeviceListItemAction.remove,
|
|
|
|
label: L10n.of(context).delete,
|
|
|
|
isDestructiveAction: true,
|
|
|
|
),
|
2021-04-15 07:46:43 +00:00
|
|
|
],
|
|
|
|
);
|
|
|
|
switch (action) {
|
|
|
|
case UserDeviceListItemAction.rename:
|
|
|
|
rename(userDevice);
|
|
|
|
break;
|
|
|
|
case UserDeviceListItemAction.remove:
|
|
|
|
remove(userDevice);
|
|
|
|
break;
|
|
|
|
case UserDeviceListItemAction.verify:
|
|
|
|
verify(userDevice);
|
|
|
|
break;
|
|
|
|
case UserDeviceListItemAction.block:
|
|
|
|
block(userDevice);
|
|
|
|
break;
|
|
|
|
case UserDeviceListItemAction.unblock:
|
|
|
|
unblock(userDevice);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
leading: CircleAvatar(
|
2021-10-10 08:58:03 +00:00
|
|
|
foregroundColor: Colors.white,
|
|
|
|
backgroundColor: keys == null
|
|
|
|
? Colors.grey[700]
|
|
|
|
: keys.blocked
|
|
|
|
? Colors.red
|
|
|
|
: keys.verified
|
|
|
|
? Colors.green
|
|
|
|
: Colors.orange,
|
2021-04-15 07:46:43 +00:00
|
|
|
child: Icon(userDevice.icon),
|
|
|
|
),
|
|
|
|
title: Row(
|
|
|
|
children: <Widget>[
|
|
|
|
Text(
|
|
|
|
userDevice.displayname,
|
|
|
|
maxLines: 1,
|
|
|
|
overflow: TextOverflow.ellipsis,
|
|
|
|
),
|
2021-10-14 16:09:30 +00:00
|
|
|
const Spacer(),
|
2021-04-15 07:46:43 +00:00
|
|
|
if (keys != null)
|
|
|
|
Text(
|
|
|
|
keys.blocked
|
|
|
|
? L10n.of(context).blocked
|
|
|
|
: keys.verified
|
|
|
|
? L10n.of(context).verified
|
2021-10-10 08:58:03 +00:00
|
|
|
: L10n.of(context).unverified,
|
2021-04-15 07:46:43 +00:00
|
|
|
style: TextStyle(
|
|
|
|
color: keys.blocked
|
|
|
|
? Colors.red
|
|
|
|
: keys.verified
|
|
|
|
? Colors.green
|
|
|
|
: Colors.orange,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
2021-11-19 09:07:05 +00:00
|
|
|
subtitle: Text(
|
|
|
|
L10n.of(context).lastActiveAgo(
|
|
|
|
DateTime.fromMillisecondsSinceEpoch(userDevice.lastSeenTs)
|
|
|
|
.localizedTimeShort(context)),
|
|
|
|
style: const TextStyle(fontWeight: FontWeight.w300),
|
|
|
|
),
|
2021-04-15 07:46:43 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|