fluffychat merge
This commit is contained in:
commit
ce3a88e7a7
13 changed files with 132 additions and 147 deletions
|
|
@ -1058,10 +1058,6 @@
|
|||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@noGoogleServicesWarning": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"none": "Ništa",
|
||||
"@none": {
|
||||
"type": "text",
|
||||
|
|
@ -2294,7 +2290,7 @@
|
|||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"reportErrorDescription": "Dogodila se greška. Pokušaj ponovo kasnije. Ako želiš, grešku možeš prijaviti programerima.",
|
||||
"reportErrorDescription": "😭 Joj! Dogodila se greška. Pokušaj ponovo kasnije. Ako želiš, grešku možeš prijaviti programerima.",
|
||||
"@reportErrorDescription": {},
|
||||
"signInWithPassword": "Prijavi se s lozinkom",
|
||||
"@signInWithPassword": {},
|
||||
|
|
@ -2392,7 +2388,7 @@
|
|||
"seconds": {}
|
||||
}
|
||||
},
|
||||
"hasKnocked": "{user} je pokucao/la",
|
||||
"hasKnocked": "🚪 {user} je pokucao/la",
|
||||
"@hasKnocked": {
|
||||
"placeholders": {
|
||||
"user": {}
|
||||
|
|
@ -2400,17 +2396,10 @@
|
|||
},
|
||||
"pleaseEnterANumber": "Upiši broj veći od 0",
|
||||
"@pleaseEnterANumber": {},
|
||||
"@banUserDescription": {},
|
||||
"@removeDevicesDescription": {},
|
||||
"@unbanUserDescription": {},
|
||||
"pushNotificationsNotAvailable": "Automatsko slanje obavijesti nije dostupno",
|
||||
"@pushNotificationsNotAvailable": {},
|
||||
"@makeAdminDescription": {},
|
||||
"@archiveRoomDescription": {},
|
||||
"learnMore": "Saznaj više",
|
||||
"@learnMore": {},
|
||||
"@roomUpgradeDescription": {},
|
||||
"@kickUserDescription": {},
|
||||
"createGroupAndInviteUsers": "Stvori grupu i pozovi korisnike",
|
||||
"@createGroupAndInviteUsers": {},
|
||||
"startConversation": "Pokreni konverzaciju",
|
||||
|
|
@ -2419,7 +2408,7 @@
|
|||
"@blockedUsers": {},
|
||||
"groupCanBeFoundViaSearch": "Grupa se može pronaći putem pretrage",
|
||||
"@groupCanBeFoundViaSearch": {},
|
||||
"block": "blokiraj",
|
||||
"block": "Blokiraj",
|
||||
"@block": {},
|
||||
"yourGlobalUserIdIs": "Tvoj globalni korisnički ID je: ",
|
||||
"@yourGlobalUserIdIs": {},
|
||||
|
|
@ -2436,5 +2425,29 @@
|
|||
"searchChatsRooms": "Traži #chats, @users …",
|
||||
"@searchChatsRooms": {},
|
||||
"databaseMigrationBody": "Pričekaj. Ovo može potrajati.",
|
||||
"@databaseMigrationBody": {}
|
||||
"@databaseMigrationBody": {},
|
||||
"transparent": "Prozirno",
|
||||
"@transparent": {},
|
||||
"formattedMessages": "Formatirane poruke",
|
||||
"@formattedMessages": {},
|
||||
"incomingMessages": "Dolazne poruke",
|
||||
"@incomingMessages": {},
|
||||
"passwordsDoNotMatch": "Lozinke se ne poklapaju",
|
||||
"@passwordsDoNotMatch": {},
|
||||
"accessAndVisibility": "Pristup i vidljivost",
|
||||
"@accessAndVisibility": {},
|
||||
"calls": "Pozivi",
|
||||
"@calls": {},
|
||||
"customEmojisAndStickers": "Prilagođeni emojiji i naljepnice",
|
||||
"@customEmojisAndStickers": {},
|
||||
"customEmojisAndStickersBody": "Dodaj ili dijeli prilagođene emojije ili naljepnice koje se mogu koristiti u bilo kojem razgovoru.",
|
||||
"@customEmojisAndStickersBody": {},
|
||||
"accessAndVisibilityDescription": "Tko se smije pridružiti ovom razgovoru i kako se razgovor može otkriti.",
|
||||
"@accessAndVisibilityDescription": {},
|
||||
"stickers": "Naljepnice",
|
||||
"@stickers": {},
|
||||
"discover": "Otkrij",
|
||||
"@discover": {},
|
||||
"formattedMessagesDescription": "Prikaži formatirani sadržaj poruke poput podebljanog teksta koristeći markdown.",
|
||||
"@formattedMessagesDescription": {}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -969,7 +969,7 @@ class ChatController extends State<ChatPageWithRoom>
|
|||
);
|
||||
}
|
||||
for (final event in selectedEvents) {
|
||||
await event.remove();
|
||||
await event.cancelSend();
|
||||
}
|
||||
setState(selectedEvents.clear);
|
||||
} catch (e, s) {
|
||||
|
|
@ -1019,7 +1019,7 @@ class ChatController extends State<ChatPageWithRoom>
|
|||
);
|
||||
}
|
||||
} else {
|
||||
await event.remove();
|
||||
await event.cancelSend();
|
||||
}
|
||||
},
|
||||
);
|
||||
|
|
|
|||
|
|
@ -58,22 +58,6 @@ class HtmlMessage extends StatelessWidget {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
// riot-web is notorious for creating bad reply fallback events from invalid messages which, if
|
||||
// not handled properly, can lead to impersination. As such, we strip the entire `<mx-reply>` tags
|
||||
// here already, to prevent that from happening.
|
||||
// We do *not* do this in an AST and just with simple regex here, as riot-web tends to create
|
||||
// miss-matching tags, and this way we actually correctly identify what we want to strip and, well,
|
||||
// strip it.
|
||||
final renderHtml = html.replaceAll(
|
||||
RegExp(
|
||||
'<mx-reply>.*</mx-reply>',
|
||||
caseSensitive: false,
|
||||
multiLine: false,
|
||||
dotAll: true,
|
||||
),
|
||||
'',
|
||||
);
|
||||
|
||||
final fontSize = AppConfig.messageFontSize * AppConfig.fontSizeFactor;
|
||||
|
||||
final linkColor = textColor.withAlpha(150);
|
||||
|
|
@ -88,7 +72,7 @@ class HtmlMessage extends StatelessWidget {
|
|||
padding: HtmlPaddings.only(left: 6, bottom: 0),
|
||||
);
|
||||
|
||||
final element = _linkifyHtml(HtmlParser.parseHTML(renderHtml));
|
||||
final element = _linkifyHtml(HtmlParser.parseHTML(html));
|
||||
|
||||
// there is no need to pre-validate the html, as we validate it while rendering
|
||||
// #Pangea
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@ import 'package:fluffychat/pages/chat_list/utils/on_chat_tap.dart';
|
|||
import 'package:fluffychat/pages/user_bottom_sheet/user_bottom_sheet.dart';
|
||||
import 'package:fluffychat/pangea/widgets/chat_list/chat_list_body_text.dart';
|
||||
import 'package:fluffychat/utils/adaptive_bottom_sheet.dart';
|
||||
import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart';
|
||||
import 'package:fluffychat/utils/stream_extension.dart';
|
||||
import 'package:fluffychat/widgets/avatar.dart';
|
||||
import 'package:fluffychat/widgets/public_room_bottom_sheet.dart';
|
||||
|
|
@ -40,7 +39,7 @@ class ChatListViewBody extends StatelessWidget {
|
|||
Theme.of(context).textTheme.bodyLarge!.color!.withAlpha(100);
|
||||
final subtitleColor =
|
||||
Theme.of(context).textTheme.bodyLarge!.color!.withAlpha(50);
|
||||
|
||||
final filter = controller.searchController.text.toLowerCase();
|
||||
return PageTransitionSwitcher(
|
||||
transitionBuilder: (
|
||||
Widget child,
|
||||
|
|
@ -245,35 +244,23 @@ class ChatListViewBody extends StatelessWidget {
|
|||
),
|
||||
),
|
||||
if (client.prevBatch != null)
|
||||
SliverList(
|
||||
delegate: SliverChildBuilderDelegate(
|
||||
(BuildContext context, int i) {
|
||||
if (!rooms[i]
|
||||
.getLocalizedDisplayname(
|
||||
MatrixLocals(L10n.of(context)!),
|
||||
)
|
||||
.toLowerCase()
|
||||
.contains(
|
||||
controller.searchController.text.toLowerCase(),
|
||||
)) {
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
final activeChat = controller.activeChat == rooms[i].id;
|
||||
return ChatListItem(
|
||||
rooms[i],
|
||||
key: Key('chat_list_item_${rooms[i].id}'),
|
||||
selected:
|
||||
controller.selectedRoomIds.contains(rooms[i].id),
|
||||
onTap: controller.selectMode == SelectMode.select
|
||||
? () => controller.toggleSelection(rooms[i].id)
|
||||
: () => onChatTap(rooms[i], context),
|
||||
onLongPress: () =>
|
||||
controller.toggleSelection(rooms[i].id),
|
||||
activeChat: activeChat,
|
||||
);
|
||||
},
|
||||
childCount: rooms.length,
|
||||
),
|
||||
SliverList.builder(
|
||||
itemCount: rooms.length,
|
||||
itemBuilder: (BuildContext context, int i) {
|
||||
return ChatListItem(
|
||||
rooms[i],
|
||||
key: Key('chat_list_item_${rooms[i].id}'),
|
||||
filter: filter,
|
||||
selected:
|
||||
controller.selectedRoomIds.contains(rooms[i].id),
|
||||
onTap: controller.selectMode == SelectMode.select
|
||||
? () => controller.toggleSelection(rooms[i].id)
|
||||
: () => onChatTap(rooms[i], context),
|
||||
onLongPress: () =>
|
||||
controller.toggleSelection(rooms[i].id),
|
||||
activeChat: controller.activeChat == rooms[i].id,
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
|
|
|
|||
|
|
@ -94,11 +94,6 @@ class ChatListItem extends StatelessWidget {
|
|||
if (filter != null && !displayname.toLowerCase().contains(filter)) {
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
|
||||
final needLastEventSender = lastEvent == null
|
||||
? false
|
||||
: room.getState(EventTypes.RoomMember, lastEvent.senderId) == null;
|
||||
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 8,
|
||||
|
|
@ -239,21 +234,20 @@ class ChatListItem extends StatelessWidget {
|
|||
maxLines: 1,
|
||||
softWrap: false,
|
||||
)
|
||||
: FutureBuilder(
|
||||
key: ValueKey(lastEvent?.eventId),
|
||||
: FutureBuilder<String>(
|
||||
// #Pangea
|
||||
// future: needLastEventSender
|
||||
// ? lastEvent.calcLocalizedBody(
|
||||
// MatrixLocals(L10n.of(context)!),
|
||||
// hideReply: true,
|
||||
// hideEdit: true,
|
||||
// plaintextBody: true,
|
||||
// removeMarkdown: true,
|
||||
// withSenderNamePrefix: !isDirectChat ||
|
||||
// directChatMatrixId !=
|
||||
// room.lastEvent?.senderId,
|
||||
// )
|
||||
// : null,
|
||||
// future: room.lastEvent?.calcLocalizedBody(
|
||||
// MatrixLocals(L10n.of(context)!),
|
||||
// hideReply: true,
|
||||
// hideEdit: true,
|
||||
// plaintextBody: true,
|
||||
// removeMarkdown: true,
|
||||
// withSenderNamePrefix: !isDirectChat ||
|
||||
// directChatMatrixId !=
|
||||
// room.lastEvent?.senderId,
|
||||
// ) ??
|
||||
// Future.value(L10n.of(context)!.emptyChat),
|
||||
// Pangea#
|
||||
future: room.lastEvent != null
|
||||
? GetChatListItemSubtitle().getSubtitle(
|
||||
L10n.of(context)!,
|
||||
|
|
@ -261,37 +255,39 @@ class ChatListItem extends StatelessWidget {
|
|||
MatrixState.pangeaController,
|
||||
)
|
||||
: Future.value(L10n.of(context)!.emptyChat),
|
||||
// Pangea#
|
||||
initialData: lastEvent?.calcLocalizedBodyFallback(
|
||||
MatrixLocals(L10n.of(context)!),
|
||||
hideReply: true,
|
||||
hideEdit: true,
|
||||
plaintextBody: true,
|
||||
removeMarkdown: true,
|
||||
withSenderNamePrefix: !isDirectChat ||
|
||||
directChatMatrixId !=
|
||||
room.lastEvent?.senderId,
|
||||
),
|
||||
builder: (context, snapshot) => Text(
|
||||
room.membership == Membership.invite
|
||||
? isDirectChat
|
||||
? L10n.of(context)!.invitePrivateChat
|
||||
: L10n.of(context)!.inviteGroupChat
|
||||
: snapshot.data ??
|
||||
L10n.of(context)!.emptyChat,
|
||||
softWrap: false,
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(
|
||||
fontWeight: unread || room.hasNewMessages
|
||||
? FontWeight.bold
|
||||
: null,
|
||||
color: theme.colorScheme.onSurfaceVariant,
|
||||
decoration: room.lastEvent?.redacted == true
|
||||
? TextDecoration.lineThrough
|
||||
: null,
|
||||
),
|
||||
),
|
||||
builder: (context, snapshot) {
|
||||
return Text(
|
||||
room.membership == Membership.invite
|
||||
? isDirectChat
|
||||
? L10n.of(context)!.invitePrivateChat
|
||||
: L10n.of(context)!.inviteGroupChat
|
||||
: snapshot.data ??
|
||||
room.lastEvent
|
||||
?.calcLocalizedBodyFallback(
|
||||
MatrixLocals(L10n.of(context)!),
|
||||
hideReply: true,
|
||||
hideEdit: true,
|
||||
plaintextBody: true,
|
||||
removeMarkdown: true,
|
||||
withSenderNamePrefix: !isDirectChat ||
|
||||
directChatMatrixId !=
|
||||
room.lastEvent?.senderId,
|
||||
) ??
|
||||
L10n.of(context)!.emptyChat,
|
||||
softWrap: false,
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(
|
||||
fontWeight: unread || room.hasNewMessages
|
||||
? FontWeight.bold
|
||||
: null,
|
||||
color: theme.colorScheme.onSurfaceVariant,
|
||||
decoration: room.lastEvent?.redacted == true
|
||||
? TextDecoration.lineThrough
|
||||
: null,
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
|
|
|
|||
|
|
@ -30,13 +30,13 @@ class ChatListView extends StatelessWidget {
|
|||
badgePosition: badgePosition,
|
||||
filter:
|
||||
controller.getRoomFilterByActiveFilter(ActiveFilter.messages),
|
||||
child: const Icon(Icons.forum_outlined),
|
||||
child: const Icon(Icons.chat_outlined),
|
||||
),
|
||||
selectedIcon: UnreadRoomsBadge(
|
||||
badgePosition: badgePosition,
|
||||
filter:
|
||||
controller.getRoomFilterByActiveFilter(ActiveFilter.messages),
|
||||
child: const Icon(Icons.forum),
|
||||
child: const Icon(Icons.chat),
|
||||
),
|
||||
//#Pangea
|
||||
// label: L10n.of(context)!.messages,
|
||||
|
|
@ -62,13 +62,13 @@ class ChatListView extends StatelessWidget {
|
|||
badgePosition: badgePosition,
|
||||
filter:
|
||||
controller.getRoomFilterByActiveFilter(ActiveFilter.allChats),
|
||||
child: const Icon(Icons.forum_outlined),
|
||||
child: const Icon(Icons.chat_outlined),
|
||||
),
|
||||
selectedIcon: UnreadRoomsBadge(
|
||||
badgePosition: badgePosition,
|
||||
filter:
|
||||
controller.getRoomFilterByActiveFilter(ActiveFilter.allChats),
|
||||
child: const Icon(Icons.forum),
|
||||
child: const Icon(Icons.chat),
|
||||
),
|
||||
// #Pangea
|
||||
// label: L10n.of(context)!.chats,
|
||||
|
|
@ -222,8 +222,7 @@ class ChatListView extends StatelessWidget {
|
|||
? NavigationBar(
|
||||
elevation: 4,
|
||||
labelBehavior:
|
||||
NavigationDestinationLabelBehavior.alwaysHide,
|
||||
height: 64,
|
||||
NavigationDestinationLabelBehavior.alwaysShow,
|
||||
shadowColor:
|
||||
Theme.of(context).colorScheme.onSurface,
|
||||
surfaceTintColor:
|
||||
|
|
|
|||
|
|
@ -25,9 +25,9 @@ class MultipleEmotesSettingsView extends StatelessWidget {
|
|||
builder: (context, snapshot) {
|
||||
final packStateEvents = room.states['im.ponies.room_emotes'];
|
||||
// we need to manually convert the map using Map.of, otherwise assigning null will throw a type error.
|
||||
final Map<String, Event?> packs = packStateEvents != null
|
||||
? Map<String, Event?>.of(packStateEvents)
|
||||
: <String, Event?>{};
|
||||
final packs = packStateEvents != null
|
||||
? Map<String, StrippedStateEvent?>.of(packStateEvents)
|
||||
: <String, StrippedStateEvent?>{};
|
||||
if (!packs.containsKey('')) {
|
||||
packs[''] = null;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -127,11 +127,12 @@ class UserBottomSheetController extends State<UserBottomSheet> {
|
|||
textFields: [DialogTextField(hintText: L10n.of(context)!.reason)],
|
||||
);
|
||||
if (reason == null || reason.single.isEmpty) return;
|
||||
|
||||
final result = await showFutureLoadingDialog(
|
||||
context: context,
|
||||
future: () => Matrix.of(widget.outerContext).client.reportContent(
|
||||
user.roomId!,
|
||||
user.eventId,
|
||||
user.room.id,
|
||||
user.id,
|
||||
reason: reason.single,
|
||||
score: score,
|
||||
),
|
||||
|
|
|
|||
|
|
@ -60,7 +60,10 @@ extension ClassAndExchangeSettingsRoomExtension on Room {
|
|||
if (ownPowerLevel < ClassDefaultValues.powerLevelOfAdmin) {
|
||||
return;
|
||||
}
|
||||
final Event? currentPower = getState(EventTypes.RoomPowerLevels);
|
||||
final dynamic currentPower = getState(EventTypes.RoomPowerLevels);
|
||||
if (currentPower is! Event?) {
|
||||
return;
|
||||
}
|
||||
final Map<String, dynamic>? currentPowerContent =
|
||||
currentPower?.content["events"] as Map<String, dynamic>?;
|
||||
final spaceChildPower = currentPowerContent?[EventTypes.SpaceChild];
|
||||
|
|
@ -113,10 +116,21 @@ extension ClassAndExchangeSettingsRoomExtension on Room {
|
|||
}
|
||||
}
|
||||
|
||||
Event? get _languageSettingsStateEvent =>
|
||||
getState(PangeaEventTypes.classSettings);
|
||||
Event? get _languageSettingsStateEvent {
|
||||
final dynamic classSettings = getState(PangeaEventTypes.classSettings);
|
||||
if (classSettings is Event) {
|
||||
return classSettings;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
Event? get _pangeaRoomRulesStateEvent => getState(PangeaEventTypes.rules);
|
||||
Event? get _pangeaRoomRulesStateEvent {
|
||||
final dynamic roomRules = getState(PangeaEventTypes.rules);
|
||||
if (roomRules is Event) {
|
||||
return roomRules;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
ClassSettingsModel? get _firstLanguageSettings =>
|
||||
classSettings ??
|
||||
|
|
|
|||
|
|
@ -12,8 +12,11 @@ extension RoomInformationRoomExtension on Room {
|
|||
.length;
|
||||
}
|
||||
|
||||
DateTime? get _creationTime =>
|
||||
getState(EventTypes.RoomCreate)?.originServerTs;
|
||||
DateTime? get _creationTime {
|
||||
final dynamic roomCreate = getState(EventTypes.RoomCreate);
|
||||
if (roomCreate is! Event) return null;
|
||||
return roomCreate.originServerTs;
|
||||
}
|
||||
|
||||
String? get _creatorId => getState(EventTypes.RoomCreate)?.senderId;
|
||||
|
||||
|
|
|
|||
|
|
@ -21407,11 +21407,6 @@
|
|||
"createNewGroup",
|
||||
"editChatPermissions",
|
||||
"globalChatId",
|
||||
"accessAndVisibility",
|
||||
"accessAndVisibilityDescription",
|
||||
"calls",
|
||||
"customEmojisAndStickers",
|
||||
"customEmojisAndStickersBody",
|
||||
"enterAGroupName",
|
||||
"enterASpacepName",
|
||||
"groupDescription",
|
||||
|
|
@ -22210,7 +22205,6 @@
|
|||
"pleaseEnterYourCurrentPassword",
|
||||
"newPassword",
|
||||
"pleaseChooseAStrongPassword",
|
||||
"passwordsDoNotMatch",
|
||||
"passwordIsWrong",
|
||||
"publicLink",
|
||||
"publicChatAddresses",
|
||||
|
|
@ -22255,8 +22249,6 @@
|
|||
"sendReadReceipts",
|
||||
"sendTypingNotificationsDescription",
|
||||
"sendReadReceiptsDescription",
|
||||
"formattedMessages",
|
||||
"formattedMessagesDescription",
|
||||
"verifyOtherUser",
|
||||
"verifyOtherUserDescription",
|
||||
"verifyOtherDevice",
|
||||
|
|
@ -22287,10 +22279,6 @@
|
|||
"refresh",
|
||||
"autoPlayTitle",
|
||||
"autoPlayDesc",
|
||||
"transparent",
|
||||
"incomingMessages",
|
||||
"stickers",
|
||||
"discover",
|
||||
"commandHint_ignore",
|
||||
"commandHint_unignore",
|
||||
"unreadChatsInApp",
|
||||
|
|
|
|||
|
|
@ -1409,10 +1409,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: matrix
|
||||
sha256: "32c21a2ac2c221ce887b00a87f965bd8df1a3a4ba8794bbe86be8b56214051fb"
|
||||
sha256: b9aa3c1bdb1ca16c2365bb3681f861eeeb86acd0ea2df9c9ba453fdbcb564076
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.28.1"
|
||||
version: "0.29.1"
|
||||
meta:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ dependencies:
|
|||
keyboard_shortcuts: ^0.1.4
|
||||
latlong2: ^0.9.1
|
||||
linkify: ^5.0.0
|
||||
matrix: ^0.28.1
|
||||
matrix: ^0.29.1
|
||||
native_imaging: ^0.1.0
|
||||
package_info_plus: ^6.0.0
|
||||
pasteboard: ^0.2.0
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue