chore: Follow up presences

This commit is contained in:
krille-chan 2023-11-11 19:54:31 +01:00
parent a41dd4c60f
commit bee90019bb
No known key found for this signature in database
4 changed files with 80 additions and 64 deletions

View file

@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:go_router/go_router.dart';
import 'package:fluffychat/config/themes.dart';
import 'package:fluffychat/pages/chat/chat.dart';
import 'package:fluffychat/utils/date_time_extension.dart';
import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart';
@ -41,33 +42,43 @@ class ChatAppBarTitle extends StatelessWidget {
),
const SizedBox(width: 12),
Expanded(
child: ListTile(
contentPadding: EdgeInsets.zero,
title: Text(
room.getLocalizedDisplayname(MatrixLocals(L10n.of(context)!)),
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: const TextStyle(
fontSize: 16,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
room.getLocalizedDisplayname(MatrixLocals(L10n.of(context)!)),
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: const TextStyle(
fontSize: 16,
),
),
),
subtitle: PresenceBuilder(
userId: room.directChatMatrixID,
builder: (context, presence) {
final lastActiveTimestamp = presence?.lastActiveTimestamp;
if (presence?.currentlyActive == true) {
return Text(L10n.of(context)!.currentlyActive);
}
if (lastActiveTimestamp != null) {
return Text(
L10n.of(context)!.lastActiveAgo(
lastActiveTimestamp.localizedTimeShort(context),
),
);
}
return const SizedBox.shrink();
},
),
AnimatedSize(
duration: FluffyThemes.animationDuration,
child: PresenceBuilder(
userId: room.directChatMatrixID,
builder: (context, presence) {
final lastActiveTimestamp = presence?.lastActiveTimestamp;
final style = Theme.of(context).textTheme.bodySmall;
if (presence?.currentlyActive == true) {
return Text(
L10n.of(context)!.currentlyActive,
style: style,
);
}
if (lastActiveTimestamp != null) {
return Text(
L10n.of(context)!.lastActiveAgo(
lastActiveTimestamp.localizedTimeShort(context),
),
style: style,
);
}
return const SizedBox.shrink();
},
),
),
],
),
),
],

View file

@ -43,7 +43,6 @@ class SeenByRow extends StatelessWidget {
name: user.calcDisplayname(),
size: 16,
fontSize: 9,
presenceUserId: user.stateKey,
),
),
if (seenByUsers.length > maxAvatars)

View file

@ -32,46 +32,52 @@ class UserBottomSheetView extends StatelessWidget {
leading: CloseButton(
onPressed: Navigator.of(context, rootNavigator: false).pop,
),
title: ListTile(
contentPadding: EdgeInsets.zero,
title: Text(displayname.trim().split(' ').first),
subtitle: PresenceBuilder(
userId: userId,
client: client,
builder: (context, presence) {
if (presence == null) return const SizedBox.shrink();
title: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(displayname),
PresenceBuilder(
userId: userId,
client: client,
builder: (context, presence) {
if (presence == null) return const SizedBox.shrink();
final dotColor = presence.presence.isOnline
? Colors.green
: presence.presence.isUnavailable
? Colors.orange
: Colors.red;
final dotColor = presence.presence.isOnline
? Colors.green
: presence.presence.isUnavailable
? Colors.red
: Colors.grey;
final lastActiveTimestamp = presence.lastActiveTimestamp;
final lastActiveTimestamp = presence.lastActiveTimestamp;
return Row(
children: [
Container(
width: 8,
height: 8,
margin: const EdgeInsets.only(right: 8),
decoration: BoxDecoration(
color: dotColor,
borderRadius: BorderRadius.circular(16),
),
),
if (presence.currentlyActive == true)
Text(L10n.of(context)!.currentlyActive),
if (lastActiveTimestamp != null)
Text(
L10n.of(context)!.lastActiveAgo(
lastActiveTimestamp.localizedTimeShort(context),
return Row(
children: [
Container(
width: 8,
height: 8,
margin: const EdgeInsets.only(right: 8),
decoration: BoxDecoration(
color: dotColor,
borderRadius: BorderRadius.circular(16),
),
),
],
);
},
),
if (presence.currentlyActive == true)
Text(
L10n.of(context)!.currentlyActive,
style: Theme.of(context).textTheme.bodySmall,
),
if (lastActiveTimestamp != null)
Text(
L10n.of(context)!.lastActiveAgo(
lastActiveTimestamp.localizedTimeShort(context),
),
style: Theme.of(context).textTheme.bodySmall,
),
],
);
},
),
],
),
actions: [
if (userId != client.userID &&

View file

@ -84,8 +84,8 @@ class Avatar extends StatelessWidget {
final dotColor = presence.presence.isOnline
? Colors.green
: presence.presence.isUnavailable
? Colors.orange
: Colors.red;
? Colors.red
: Colors.grey;
return Positioned(
bottom: -4,
right: -4,