mirror of
				https://gitlab.com/famedly/fluffychat.git
				synced 2025-11-03 22:07:23 +01:00 
			
		
		
		
	Merge branch 'krille/hot-fixes' into 'main'
Krille/hot fixes See merge request famedly/fluffychat!856
This commit is contained in:
		
						commit
						b1417c07b3
					
				@ -14,6 +14,9 @@
 | 
			
		||||
- feat: allow to create widgets (TheOneWithTheBraid)
 | 
			
		||||
- feat: remove diacritics (henri2h)
 | 
			
		||||
- feat: irish language support (Graeme Power)
 | 
			
		||||
- feat: Enable screensharing on Mobile
 | 
			
		||||
- feat: support AppImage builds
 | 
			
		||||
- feat: Improve spaces design
 | 
			
		||||
- fix: Android theme is not auto updating when system theme changes (Krille Fear)
 | 
			
		||||
- fix: Chat view becomes gray for a second on sending reaction (Krille Fear)
 | 
			
		||||
- fix: Don't request new thumbnail resolution on every window resize (Samuel Mezger)
 | 
			
		||||
 | 
			
		||||
@ -155,172 +155,176 @@ class ChatListItem extends StatelessWidget {
 | 
			
		||||
            ? 20.0
 | 
			
		||||
            : 14.0
 | 
			
		||||
        : 0.0;
 | 
			
		||||
    return ListTile(
 | 
			
		||||
      selected: selected || activeChat,
 | 
			
		||||
      selectedTileColor: selected
 | 
			
		||||
    return Material(
 | 
			
		||||
      color: selected
 | 
			
		||||
          ? Theme.of(context).primaryColor.withAlpha(100)
 | 
			
		||||
          : Theme.of(context).secondaryHeaderColor,
 | 
			
		||||
      onLongPress: onLongPress as void Function()?,
 | 
			
		||||
      leading: selected
 | 
			
		||||
          ? SizedBox(
 | 
			
		||||
              width: Avatar.defaultSize,
 | 
			
		||||
              height: Avatar.defaultSize,
 | 
			
		||||
              child: Material(
 | 
			
		||||
                color: Theme.of(context).primaryColor,
 | 
			
		||||
                borderRadius: BorderRadius.circular(Avatar.defaultSize),
 | 
			
		||||
                child: const Icon(Icons.check, color: Colors.white),
 | 
			
		||||
          : activeChat
 | 
			
		||||
              ? Theme.of(context).secondaryHeaderColor
 | 
			
		||||
              : Colors.transparent,
 | 
			
		||||
      child: ListTile(
 | 
			
		||||
        selected: selected || activeChat,
 | 
			
		||||
        onLongPress: onLongPress as void Function()?,
 | 
			
		||||
        leading: selected
 | 
			
		||||
            ? SizedBox(
 | 
			
		||||
                width: Avatar.defaultSize,
 | 
			
		||||
                height: Avatar.defaultSize,
 | 
			
		||||
                child: Material(
 | 
			
		||||
                  color: Theme.of(context).primaryColor,
 | 
			
		||||
                  borderRadius: BorderRadius.circular(Avatar.defaultSize),
 | 
			
		||||
                  child: const Icon(Icons.check, color: Colors.white),
 | 
			
		||||
                ),
 | 
			
		||||
              )
 | 
			
		||||
            : Avatar(
 | 
			
		||||
                mxContent: room.avatar,
 | 
			
		||||
                name: room.displayname,
 | 
			
		||||
                onTap: onLongPress as void Function()?,
 | 
			
		||||
              ),
 | 
			
		||||
            )
 | 
			
		||||
          : Avatar(
 | 
			
		||||
              mxContent: room.avatar,
 | 
			
		||||
              name: room.displayname,
 | 
			
		||||
              onTap: onLongPress as void Function()?,
 | 
			
		||||
            ),
 | 
			
		||||
      title: Row(
 | 
			
		||||
        children: <Widget>[
 | 
			
		||||
          Expanded(
 | 
			
		||||
            child: Text(
 | 
			
		||||
              room.getLocalizedDisplayname(MatrixLocals(L10n.of(context)!)),
 | 
			
		||||
              maxLines: 1,
 | 
			
		||||
              overflow: TextOverflow.ellipsis,
 | 
			
		||||
              softWrap: false,
 | 
			
		||||
              style: TextStyle(
 | 
			
		||||
                fontWeight: FontWeight.bold,
 | 
			
		||||
                color: unread
 | 
			
		||||
                    ? Theme.of(context).colorScheme.secondary
 | 
			
		||||
                    : Theme.of(context).textTheme.bodyText1!.color,
 | 
			
		||||
        title: Row(
 | 
			
		||||
          children: <Widget>[
 | 
			
		||||
            Expanded(
 | 
			
		||||
              child: Text(
 | 
			
		||||
                room.getLocalizedDisplayname(MatrixLocals(L10n.of(context)!)),
 | 
			
		||||
                maxLines: 1,
 | 
			
		||||
                overflow: TextOverflow.ellipsis,
 | 
			
		||||
                softWrap: false,
 | 
			
		||||
                style: TextStyle(
 | 
			
		||||
                  fontWeight: FontWeight.bold,
 | 
			
		||||
                  color: unread
 | 
			
		||||
                      ? Theme.of(context).colorScheme.secondary
 | 
			
		||||
                      : Theme.of(context).textTheme.bodyText1!.color,
 | 
			
		||||
                ),
 | 
			
		||||
              ),
 | 
			
		||||
            ),
 | 
			
		||||
          ),
 | 
			
		||||
          if (isMuted)
 | 
			
		||||
            const Padding(
 | 
			
		||||
              padding: EdgeInsets.only(left: 4.0),
 | 
			
		||||
              child: Icon(
 | 
			
		||||
                Icons.notifications_off_outlined,
 | 
			
		||||
                size: 16,
 | 
			
		||||
            if (isMuted)
 | 
			
		||||
              const Padding(
 | 
			
		||||
                padding: EdgeInsets.only(left: 4.0),
 | 
			
		||||
                child: Icon(
 | 
			
		||||
                  Icons.notifications_off_outlined,
 | 
			
		||||
                  size: 16,
 | 
			
		||||
                ),
 | 
			
		||||
              ),
 | 
			
		||||
            if (room.isFavourite)
 | 
			
		||||
              Padding(
 | 
			
		||||
                padding: EdgeInsets.only(
 | 
			
		||||
                    right: room.notificationCount > 0 ? 4.0 : 0.0),
 | 
			
		||||
                child: Icon(
 | 
			
		||||
                  Icons.push_pin_outlined,
 | 
			
		||||
                  size: 16,
 | 
			
		||||
                  color: Theme.of(context).colorScheme.secondary,
 | 
			
		||||
                ),
 | 
			
		||||
              ),
 | 
			
		||||
            ),
 | 
			
		||||
          if (room.isFavourite)
 | 
			
		||||
            Padding(
 | 
			
		||||
              padding: EdgeInsets.only(
 | 
			
		||||
                  right: room.notificationCount > 0 ? 4.0 : 0.0),
 | 
			
		||||
              child: Icon(
 | 
			
		||||
                Icons.push_pin_outlined,
 | 
			
		||||
                size: 16,
 | 
			
		||||
                color: Theme.of(context).colorScheme.secondary,
 | 
			
		||||
              padding: const EdgeInsets.only(left: 4.0),
 | 
			
		||||
              child: Text(
 | 
			
		||||
                room.timeCreated.localizedTimeShort(context),
 | 
			
		||||
                style: TextStyle(
 | 
			
		||||
                  fontSize: 13,
 | 
			
		||||
                  color: unread
 | 
			
		||||
                      ? Theme.of(context).colorScheme.secondary
 | 
			
		||||
                      : Theme.of(context).textTheme.bodyText2!.color,
 | 
			
		||||
                ),
 | 
			
		||||
              ),
 | 
			
		||||
            ),
 | 
			
		||||
          Padding(
 | 
			
		||||
            padding: const EdgeInsets.only(left: 4.0),
 | 
			
		||||
            child: Text(
 | 
			
		||||
              room.timeCreated.localizedTimeShort(context),
 | 
			
		||||
              style: TextStyle(
 | 
			
		||||
                fontSize: 13,
 | 
			
		||||
                color: unread
 | 
			
		||||
                    ? Theme.of(context).colorScheme.secondary
 | 
			
		||||
                    : Theme.of(context).textTheme.bodyText2!.color,
 | 
			
		||||
              ),
 | 
			
		||||
            ),
 | 
			
		||||
          ),
 | 
			
		||||
        ],
 | 
			
		||||
      ),
 | 
			
		||||
      subtitle: Row(
 | 
			
		||||
        mainAxisAlignment: MainAxisAlignment.center,
 | 
			
		||||
        children: <Widget>[
 | 
			
		||||
          if (typingText.isEmpty &&
 | 
			
		||||
              ownMessage &&
 | 
			
		||||
              room.lastEvent!.status.isSending) ...[
 | 
			
		||||
            const SizedBox(
 | 
			
		||||
              width: 16,
 | 
			
		||||
              height: 16,
 | 
			
		||||
              child: CircularProgressIndicator.adaptive(strokeWidth: 2),
 | 
			
		||||
            ),
 | 
			
		||||
            const SizedBox(width: 4),
 | 
			
		||||
          ],
 | 
			
		||||
          AnimatedContainer(
 | 
			
		||||
            width: typingText.isEmpty ? 0 : 18,
 | 
			
		||||
            clipBehavior: Clip.hardEdge,
 | 
			
		||||
            decoration: const BoxDecoration(),
 | 
			
		||||
            duration: const Duration(milliseconds: 300),
 | 
			
		||||
            curve: Curves.bounceInOut,
 | 
			
		||||
            padding: const EdgeInsets.only(right: 4),
 | 
			
		||||
            child: Icon(
 | 
			
		||||
              Icons.edit_outlined,
 | 
			
		||||
              color: Theme.of(context).colorScheme.secondary,
 | 
			
		||||
              size: 14,
 | 
			
		||||
        ),
 | 
			
		||||
        subtitle: Row(
 | 
			
		||||
          mainAxisAlignment: MainAxisAlignment.center,
 | 
			
		||||
          children: <Widget>[
 | 
			
		||||
            if (typingText.isEmpty &&
 | 
			
		||||
                ownMessage &&
 | 
			
		||||
                room.lastEvent!.status.isSending) ...[
 | 
			
		||||
              const SizedBox(
 | 
			
		||||
                width: 16,
 | 
			
		||||
                height: 16,
 | 
			
		||||
                child: CircularProgressIndicator.adaptive(strokeWidth: 2),
 | 
			
		||||
              ),
 | 
			
		||||
              const SizedBox(width: 4),
 | 
			
		||||
            ],
 | 
			
		||||
            AnimatedContainer(
 | 
			
		||||
              width: typingText.isEmpty ? 0 : 18,
 | 
			
		||||
              clipBehavior: Clip.hardEdge,
 | 
			
		||||
              decoration: const BoxDecoration(),
 | 
			
		||||
              duration: const Duration(milliseconds: 300),
 | 
			
		||||
              curve: Curves.bounceInOut,
 | 
			
		||||
              padding: const EdgeInsets.only(right: 4),
 | 
			
		||||
              child: Icon(
 | 
			
		||||
                Icons.edit_outlined,
 | 
			
		||||
                color: Theme.of(context).colorScheme.secondary,
 | 
			
		||||
                size: 14,
 | 
			
		||||
              ),
 | 
			
		||||
            ),
 | 
			
		||||
          ),
 | 
			
		||||
          Expanded(
 | 
			
		||||
            child: typingText.isNotEmpty
 | 
			
		||||
                ? Text(
 | 
			
		||||
                    typingText,
 | 
			
		||||
                    style: TextStyle(
 | 
			
		||||
                      color: Theme.of(context).colorScheme.secondary,
 | 
			
		||||
                    ),
 | 
			
		||||
                    softWrap: false,
 | 
			
		||||
                  )
 | 
			
		||||
                : Text(
 | 
			
		||||
                    room.membership == Membership.invite
 | 
			
		||||
                        ? L10n.of(context)!.youAreInvitedToThisChat
 | 
			
		||||
                        : room.lastEvent?.getLocalizedBody(
 | 
			
		||||
                              MatrixLocals(L10n.of(context)!),
 | 
			
		||||
                              hideReply: true,
 | 
			
		||||
                              hideEdit: true,
 | 
			
		||||
                              plaintextBody: true,
 | 
			
		||||
                              removeMarkdown: true,
 | 
			
		||||
                              withSenderNamePrefix: !room.isDirectChat ||
 | 
			
		||||
                                  room.directChatMatrixID !=
 | 
			
		||||
                                      room.lastEvent?.senderId,
 | 
			
		||||
                            ) ??
 | 
			
		||||
                            L10n.of(context)!.emptyChat,
 | 
			
		||||
                    softWrap: false,
 | 
			
		||||
                    maxLines: 1,
 | 
			
		||||
                    overflow: TextOverflow.ellipsis,
 | 
			
		||||
                    style: TextStyle(
 | 
			
		||||
                      color: unread
 | 
			
		||||
                          ? Theme.of(context).colorScheme.secondary
 | 
			
		||||
                          : Theme.of(context).textTheme.bodyText2!.color,
 | 
			
		||||
                      decoration: room.lastEvent?.redacted == true
 | 
			
		||||
                          ? TextDecoration.lineThrough
 | 
			
		||||
                          : null,
 | 
			
		||||
                    ),
 | 
			
		||||
                  ),
 | 
			
		||||
          ),
 | 
			
		||||
          const SizedBox(width: 8),
 | 
			
		||||
          AnimatedContainer(
 | 
			
		||||
            duration: const Duration(milliseconds: 300),
 | 
			
		||||
            curve: Curves.bounceInOut,
 | 
			
		||||
            padding: const EdgeInsets.symmetric(horizontal: 7),
 | 
			
		||||
            height: unreadBubbleSize,
 | 
			
		||||
            width:
 | 
			
		||||
                room.notificationCount == 0 && !unread && !room.hasNewMessages
 | 
			
		||||
                    ? 0
 | 
			
		||||
                    : (unreadBubbleSize - 9) *
 | 
			
		||||
                            room.notificationCount.toString().length +
 | 
			
		||||
                        9,
 | 
			
		||||
            decoration: BoxDecoration(
 | 
			
		||||
              color: room.highlightCount > 0
 | 
			
		||||
                  ? Colors.red
 | 
			
		||||
                  : room.notificationCount > 0
 | 
			
		||||
                      ? Theme.of(context).primaryColor
 | 
			
		||||
                      : Theme.of(context).primaryColor.withAlpha(100),
 | 
			
		||||
              borderRadius: BorderRadius.circular(AppConfig.borderRadius),
 | 
			
		||||
            ),
 | 
			
		||||
            child: Center(
 | 
			
		||||
              child: room.notificationCount > 0
 | 
			
		||||
            Expanded(
 | 
			
		||||
              child: typingText.isNotEmpty
 | 
			
		||||
                  ? Text(
 | 
			
		||||
                      room.notificationCount.toString(),
 | 
			
		||||
                      style: const TextStyle(
 | 
			
		||||
                        color: Colors.white,
 | 
			
		||||
                        fontSize: 13,
 | 
			
		||||
                      typingText,
 | 
			
		||||
                      style: TextStyle(
 | 
			
		||||
                        color: Theme.of(context).colorScheme.secondary,
 | 
			
		||||
                      ),
 | 
			
		||||
                      softWrap: false,
 | 
			
		||||
                    )
 | 
			
		||||
                  : Container(),
 | 
			
		||||
                  : Text(
 | 
			
		||||
                      room.membership == Membership.invite
 | 
			
		||||
                          ? L10n.of(context)!.youAreInvitedToThisChat
 | 
			
		||||
                          : room.lastEvent?.getLocalizedBody(
 | 
			
		||||
                                MatrixLocals(L10n.of(context)!),
 | 
			
		||||
                                hideReply: true,
 | 
			
		||||
                                hideEdit: true,
 | 
			
		||||
                                plaintextBody: true,
 | 
			
		||||
                                removeMarkdown: true,
 | 
			
		||||
                                withSenderNamePrefix: !room.isDirectChat ||
 | 
			
		||||
                                    room.directChatMatrixID !=
 | 
			
		||||
                                        room.lastEvent?.senderId,
 | 
			
		||||
                              ) ??
 | 
			
		||||
                              L10n.of(context)!.emptyChat,
 | 
			
		||||
                      softWrap: false,
 | 
			
		||||
                      maxLines: 1,
 | 
			
		||||
                      overflow: TextOverflow.ellipsis,
 | 
			
		||||
                      style: TextStyle(
 | 
			
		||||
                        color: unread
 | 
			
		||||
                            ? Theme.of(context).colorScheme.secondary
 | 
			
		||||
                            : Theme.of(context).textTheme.bodyText2!.color,
 | 
			
		||||
                        decoration: room.lastEvent?.redacted == true
 | 
			
		||||
                            ? TextDecoration.lineThrough
 | 
			
		||||
                            : null,
 | 
			
		||||
                      ),
 | 
			
		||||
                    ),
 | 
			
		||||
            ),
 | 
			
		||||
          ),
 | 
			
		||||
        ],
 | 
			
		||||
            const SizedBox(width: 8),
 | 
			
		||||
            AnimatedContainer(
 | 
			
		||||
              duration: const Duration(milliseconds: 300),
 | 
			
		||||
              curve: Curves.bounceInOut,
 | 
			
		||||
              padding: const EdgeInsets.symmetric(horizontal: 7),
 | 
			
		||||
              height: unreadBubbleSize,
 | 
			
		||||
              width:
 | 
			
		||||
                  room.notificationCount == 0 && !unread && !room.hasNewMessages
 | 
			
		||||
                      ? 0
 | 
			
		||||
                      : (unreadBubbleSize - 9) *
 | 
			
		||||
                              room.notificationCount.toString().length +
 | 
			
		||||
                          9,
 | 
			
		||||
              decoration: BoxDecoration(
 | 
			
		||||
                color: room.highlightCount > 0
 | 
			
		||||
                    ? Colors.red
 | 
			
		||||
                    : room.notificationCount > 0
 | 
			
		||||
                        ? Theme.of(context).primaryColor
 | 
			
		||||
                        : Theme.of(context).primaryColor.withAlpha(100),
 | 
			
		||||
                borderRadius: BorderRadius.circular(AppConfig.borderRadius),
 | 
			
		||||
              ),
 | 
			
		||||
              child: Center(
 | 
			
		||||
                child: room.notificationCount > 0
 | 
			
		||||
                    ? Text(
 | 
			
		||||
                        room.notificationCount.toString(),
 | 
			
		||||
                        style: const TextStyle(
 | 
			
		||||
                          color: Colors.white,
 | 
			
		||||
                          fontSize: 13,
 | 
			
		||||
                        ),
 | 
			
		||||
                      )
 | 
			
		||||
                    : Container(),
 | 
			
		||||
              ),
 | 
			
		||||
            ),
 | 
			
		||||
          ],
 | 
			
		||||
        ),
 | 
			
		||||
        onTap: () => clickAction(context),
 | 
			
		||||
      ),
 | 
			
		||||
      onTap: () => clickAction(context),
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user