diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index a4058486b..211d34df2 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -108,6 +108,19 @@
+
+
+
+
+
+
+
+
+
+
+
????
CFBundleURLTypes
+
+ CFBundleURLSchemes
+
+ pangea
+
+ CFBundleURLName
+ com.talktolearn.chat
+
CFBundleTypeRole
Editor
@@ -113,5 +121,7 @@
io.flutter.embedded_views_preview
+ FlutterDeepLinkingEnabled
+
diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements
index 2b2a88dd1..91e1a0719 100644
--- a/ios/Runner/Runner.entitlements
+++ b/ios/Runner/Runner.entitlements
@@ -1,18 +1,16 @@
-
- aps-environment
- development
- com.apple.developer.associated-domains
-
- applinks:example.com
-
- com.apple.security.application-groups
-
-
- group.com.talktolearn.chat
-
-
-
-
\ No newline at end of file
+
+ aps-environment
+ development
+ com.apple.developer.associated-domains
+
+ applinks:app.pangea.chat
+
+ com.apple.security.application-groups
+
+ group.com.talktolearn.chat
+
+
+
diff --git a/lib/config/app_config.dart b/lib/config/app_config.dart
index e4167ea7b..32340d99e 100644
--- a/lib/config/app_config.dart
+++ b/lib/config/app_config.dart
@@ -27,9 +27,10 @@ abstract class AppConfig {
static const bool allowOtherHomeservers = true;
static const bool enableRegistration = true;
// #Pangea
- static const double toolbarMaxHeight = 250.0;
+ static const double toolbarMaxHeight = 225.0;
static const double toolbarMinHeight = 150.0;
static const double toolbarMinWidth = 350.0;
+ static const double toolbarMenuHeight = 215.0;
static const double defaultHeaderHeight = 56.0;
static const double toolbarButtonsHeight = 50.0;
static const double toolbarSpacing = 8.0;
@@ -89,7 +90,7 @@ abstract class AppConfig {
static String _privacyUrl = "https://www.pangeachat.com/privacy";
//Pangea#
- static const Set defaultReactions = {'👍', '❤️', '😊'};
+ static const Set defaultReactions = {'👍', '❤️', '😂', '😮', '😢'};
static String get privacyUrl => _privacyUrl;
// #Pangea
diff --git a/lib/config/routes.dart b/lib/config/routes.dart
index 7b44dc54d..5cd585a4b 100644
--- a/lib/config/routes.dart
+++ b/lib/config/routes.dart
@@ -32,9 +32,11 @@ import 'package:fluffychat/pages/settings_security/settings_security.dart';
import 'package:fluffychat/pages/settings_style/settings_style.dart';
import 'package:fluffychat/pangea/activity_generator/activity_generator.dart';
import 'package:fluffychat/pangea/activity_planner/activity_planner_page.dart';
-import 'package:fluffychat/pangea/activity_suggestions/suggestions_page.dart';
+import 'package:fluffychat/pangea/analytics_page/analytics_page.dart';
+import 'package:fluffychat/pangea/analytics_summary/progress_indicators_enum.dart';
+import 'package:fluffychat/pangea/common/widgets/pangea_side_view.dart';
+import 'package:fluffychat/pangea/constructs/construct_identifier.dart';
import 'package:fluffychat/pangea/find_your_people/find_your_people.dart';
-import 'package:fluffychat/pangea/find_your_people/find_your_people_side_view.dart';
import 'package:fluffychat/pangea/guard/p_vguard.dart';
import 'package:fluffychat/pangea/learning_settings/pages/settings_learning.dart';
import 'package:fluffychat/pangea/login/pages/login_or_signup_view.dart';
@@ -203,7 +205,8 @@ abstract class AppRoutes {
// state.fullPath?.startsWith('/rooms/settings') == false
FluffyThemes.isColumnMode(context) &&
state.fullPath?.startsWith('/rooms/settings') == false &&
- state.fullPath?.startsWith('/rooms/communities') == false
+ state.fullPath?.startsWith('/rooms/communities') == false &&
+ state.fullPath?.startsWith('/rooms/analytics') == false
// Pangea#
? TwoColumnLayout(
mainView: ChatList(
@@ -316,7 +319,7 @@ abstract class AppRoutes {
state,
FluffyThemes.isColumnMode(context)
? TwoColumnLayout(
- mainView: const FindYourPeopleSideView(),
+ mainView: PangeaSideView(path: state.fullPath),
sideView: child,
dividerColor: Colors.transparent,
)
@@ -332,37 +335,21 @@ abstract class AppRoutes {
const FindYourPeople(),
),
),
- ],
- ),
- GoRoute(
- path: 'homepage',
- redirect: loggedOutRedirect,
- pageBuilder: (context, state) => defaultPageBuilder(
- context,
- state,
- const SuggestionsPage(),
- ),
- routes: [
- ...newRoomRoutes,
GoRoute(
- path: '/planner',
+ path: 'analytics',
+ redirect: loggedOutRedirect,
pageBuilder: (context, state) => defaultPageBuilder(
context,
state,
- const ActivityPlannerPage(),
- ),
- redirect: loggedOutRedirect,
- routes: [
- GoRoute(
- path: '/generator',
- redirect: loggedOutRedirect,
- pageBuilder: (context, state) => defaultPageBuilder(
- context,
- state,
- const ActivityGenerator(),
+ AnalyticsPage(
+ selectedIndicator: ProgressIndicatorEnum.fromString(
+ state.uri.queryParameters['mode'] ?? 'vocab',
),
+ constructZoom: state.extra is ConstructIdentifier
+ ? state.extra as ConstructIdentifier
+ : null,
),
- ],
+ ),
),
],
),
diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb
index 11d114939..019fcf6e9 100644
--- a/lib/l10n/intl_en.arb
+++ b/lib/l10n/intl_en.arb
@@ -4515,9 +4515,10 @@
"grammarCopyPUNCTTYPEperi": "Period",
"grammarCopyREFLEXyes": "Reflexive",
"grammarCopyTENSEimp": "Imperfect",
- "grammarCopyVERBFORMsup": "SuApine",
+ "grammarCopyVERBFORMsup": "Supine",
"grammarCopyVERBFORMadn": "Adnominal",
"grammarCopyVERBFORMlng": "Long",
+ "grammarCopyVERBFORMshrt": "Short",
"grammarCopyVERBTYPEcaus": "Causative Verb",
"grammarCopyVOICEcau": "Causative",
"grammarCopyVOICEdir": "Direct",
@@ -4590,6 +4591,7 @@
"constructUseIncMDesc": "Incorrect in grammar activity",
"constructUseIgnMDesc": "Ignored in grammar activity",
"constructUseEmojiDesc": "Correct in emoji activity",
+ "constructUseCollected": "Collected in chat",
"constructUseNanDesc": "Not applicable",
"xpIntoLevel": "{currentXP} / {maxXP} XP",
"@xpIntoLevel": {
@@ -4631,9 +4633,9 @@
"meaningSectionHeader": "Meaning:",
"formSectionHeader": "Forms used in chats:",
"noEmojiSelectedTooltip": "No emoji selected",
- "writingExercisesTooltip": "Writing practice",
- "listeningExercisesTooltip": "Listening practice",
- "readingExercisesTooltip": "Reading practice",
+ "writingExercisesTooltip": "Writing",
+ "listeningExercisesTooltip": "Listening",
+ "readingExercisesTooltip": "Reading",
"meaningNotFound": "Meaning could not be found.",
"formsNotFound": "Forms could not be found.",
"chooseBaseForm": "Choose the base form",
@@ -4733,7 +4735,7 @@
"activityPlannerTitle": "Activity Planner",
"topicLabel": "Topic",
"topicPlaceholder": "Choose a topic...",
- "modeLabel": "Mode",
+ "modeLabel": "Activity type",
"modePlaceholder": "Choose a mode...",
"learningObjectiveLabel": "Learning Objective",
"learningObjectivePlaceholder": "Choose a learning objective...",
@@ -4747,12 +4749,9 @@
"video": "Video",
"nan": "Not applicable",
"activityPlannerOverviewInstructionsBody": "Choose a topic, mode, learning objective and generate an activity for the chat!",
- "myBookmarkedActivities": "My Bookmarked Activities",
- "noBookmarkedActivities": "No bookmarked activities",
"activityTitle": "Activity Title",
"addVocabulary": "Add vocabulary",
"instructions": "Instructions",
- "bookmark": "Bookmark this activity",
"numberOfLearners": "Number of learners",
"mustBeInteger": "Must be an integer e.g. 1, 2, 3, ...",
"noLemmasFound": "There's no vocabulary with more than {xp} XP. Keep practicing!",
@@ -4874,9 +4873,8 @@
"exploreMore": "Explore more",
"randomize": "Randomize",
"clear": "Clear",
- "makeYourOwnActivity": "Make your own activity",
+ "makeYourOwnActivity": "Create your own activity",
"featuredActivities": "Featured",
- "yourBookmarks": "Bookmarked",
"goToChat": "Go to chat",
"save": "Save",
"selectActivity": "Select activity",
@@ -5002,6 +5000,7 @@
"canBeFoundViaKnock": "\u2022 request to join and admin approval",
"anyoneCanJoin": "Anyone can join! However, admin can kick and ban whoever misbehaves. Those who are banned may not return!",
"createYourSpace": "Create your space",
+ "youHaveLeveledUp": "You have leveled up!",
"sendActivities": "Send activities",
"getStarted": "Get Started",
"getStartedBotChatDesc": "Chatting with AI is a great place to start and Pangea reading, writing, listening and speaking tools make it easy!",
@@ -5016,7 +5015,7 @@
"groupChat": "Group Chat",
"directMessage": "Direct Message",
"newDirectMessage": "New direct message",
- "speakingExercisesTooltip": "Speaking practice",
+ "speakingExercisesTooltip": "Speaking",
"noChatsFoundHereYet": "No chats found here yet",
"duration": "Duration",
"transcriptionFailed": "Failed to transcribe audio",
@@ -5031,5 +5030,11 @@
}
},
"failedToFetchTranscription": "Failed to fetch transcription",
- "deleteEmptySpaceDesc": "The space will be deleted for all participants. This action cannot be undone."
-}
\ No newline at end of file
+ "deleteEmptySpaceDesc": "The space will be deleted for all participants. This action cannot be undone.",
+ "customReaction": "Custom reaction",
+ "regenerate": "Regenerate",
+ "mySavedActivities": "My Saved Activities",
+ "noSavedActivities": "No saved activities",
+ "saveActivity": "Save this activity",
+ "yourSavedActivities": "Saved Activities"
+}
diff --git a/lib/l10n/intl_es.arb b/lib/l10n/intl_es.arb
index 083a91c55..a121bda0a 100644
--- a/lib/l10n/intl_es.arb
+++ b/lib/l10n/intl_es.arb
@@ -5407,7 +5407,6 @@
"activityPlannerTitle": "Planificador de Actividades",
"topicLabel": "Tema",
"topicPlaceholder": "Elige un tema...",
- "modeLabel": "Modo",
"modePlaceholder": "Elige un modo...",
"learningObjectiveLabel": "Objetivo de Aprendizaje",
"learningObjectivePlaceholder": "Elige un objetivo de aprendizaje...",
@@ -5421,12 +5420,9 @@
"video": "Video",
"nan": "No aplicable",
"activityPlannerOverviewInstructionsBody": "¡Elige un tema, modo, objetivo de aprendizaje y genera una actividad para el chat!",
- "myBookmarkedActivities": "Mis Actividades Marcadas",
- "noBookmarkedActivities": "No hay actividades marcadas",
"activityTitle": "Título de la Actividad",
"addVocabulary": "Agregar vocabulario",
"instructions": "Instrucciones",
- "bookmark": "Marcar esta actividad",
"numberOfLearners": "Número de aprendices",
"mustBeInteger": "Debe ser un número entero, por ejemplo, 1, 2, 3, ...",
"noLemmasFound": "No hay vocabulario con más de {xp} XP. ¡Sigue practicando!",
@@ -5534,9 +5530,7 @@
"exploreMore": "Explorar más",
"randomize": "Aleatorizar",
"clear": "Limpiar",
- "makeYourOwnActivity": "Crea tu propia actividad",
"featuredActivities": "Destacadas",
- "yourBookmarks": "Marcados",
"goToChat": "Ir al chat",
"save": "Guardar",
"selectActivity": "Seleccionar actividad",
@@ -5766,10 +5760,6 @@
"type": "String",
"placeholders": {}
},
- "@yourBookmarks": {
- "type": "String",
- "placeholders": {}
- },
"@goToChat": {
"type": "String",
"placeholders": {}
diff --git a/lib/l10n/intl_vi.arb b/lib/l10n/intl_vi.arb
index 87d240b4d..e225826a1 100644
--- a/lib/l10n/intl_vi.arb
+++ b/lib/l10n/intl_vi.arb
@@ -3551,7 +3551,6 @@
"activityPlannerTitle": "Trình lập hoạt động",
"topicLabel": "Chủ đề",
"topicPlaceholder": "Chọn một chủ đề...",
- "modeLabel": "Chế độ",
"modePlaceholder": "Chọn một chế độ...",
"learningObjectiveLabel": "Mục tiêu học tập",
"learningObjectivePlaceholder": "Chọn một mục tiêu học tập...",
@@ -3565,12 +3564,9 @@
"video": "Video",
"nan": "Không áp dụng",
"activityPlannerOverviewInstructionsBody": "Chọn chủ đề, chế độ, mục tiêu học tập và tạo hoạt động cho cuộc trò chuyện!",
- "myBookmarkedActivities": "Hoạt động đã đánh dấu",
- "noBookmarkedActivities": "Chưa có hoạt động nào được đánh dấu",
"activityTitle": "Tiêu đề hoạt động",
"addVocabulary": "Thêm từ vựng",
"instructions": "Hướng dẫn",
- "bookmark": "Đánh dấu hoạt động",
"numberOfLearners": "Số lượng người học",
"mustBeInteger": "Phải là số nguyên, ví dụ: 1, 2, 3...",
"noLemmasFound": "Chưa có từ vựng với hơn {xp} XP. Hãy luyện tập thêm!",
@@ -3834,9 +3830,7 @@
"exploreMore": "Khám phá thêm",
"randomize": "Ngẫu nhiên hóa",
"clear": "Xóa",
- "makeYourOwnActivity": "Tạo hoạt động của riêng bạn",
"featuredActivities": "Nổi bật",
- "yourBookmarks": "Đã đánh dấu",
"goToChat": "Đi đến trò chuyện",
"save": "Lưu",
"selectActivity": "Chọn hoạt động",
@@ -4032,10 +4026,6 @@
"type": "String",
"placeholders": {}
},
- "@yourBookmarks": {
- "type": "String",
- "placeholders": {}
- },
"@goToChat": {
"type": "String",
"placeholders": {}
diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart
index 017ef0228..300305eaf 100644
--- a/lib/pages/chat/chat.dart
+++ b/lib/pages/chat/chat.dart
@@ -13,6 +13,7 @@ import 'package:go_router/go_router.dart';
import 'package:image_picker/image_picker.dart';
import 'package:just_audio/just_audio.dart';
import 'package:matrix/matrix.dart';
+import 'package:path_provider/path_provider.dart';
import 'package:scroll_to_index/scroll_to_index.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:shared_preferences/shared_preferences.dart';
@@ -30,7 +31,7 @@ import 'package:fluffychat/pages/chat_details/chat_details.dart';
import 'package:fluffychat/pangea/analytics_misc/construct_type_enum.dart';
import 'package:fluffychat/pangea/analytics_misc/constructs_model.dart';
import 'package:fluffychat/pangea/analytics_misc/gain_points_animation.dart';
-import 'package:fluffychat/pangea/analytics_misc/level_up.dart';
+import 'package:fluffychat/pangea/analytics_misc/level_up/level_up_banner.dart';
import 'package:fluffychat/pangea/analytics_misc/put_analytics_controller.dart';
import 'package:fluffychat/pangea/bot/utils/bot_name.dart';
import 'package:fluffychat/pangea/chat/utils/unlocked_morphs_snackbar.dart';
@@ -501,12 +502,21 @@ class ChatController extends State
);
if (audioFile == null) return;
- matrix.audioPlayer!.setAudioSource(
- BytesAudioSource(
- audioFile.bytes,
- audioFile.mimeType,
- ),
- );
+ if (!kIsWeb) {
+ final tempDir = await getTemporaryDirectory();
+
+ File? file;
+ file = File('${tempDir.path}/${audioFile.name}');
+ await file.writeAsBytes(audioFile.bytes);
+ matrix.audioPlayer!.setFilePath(file.path);
+ } else {
+ matrix.audioPlayer!.setAudioSource(
+ BytesAudioSource(
+ audioFile.bytes,
+ audioFile.mimeType,
+ ),
+ );
+ }
matrix.audioPlayer!.play();
});
@@ -1998,10 +2008,10 @@ class ChatController extends State
OverlayUtil.showOverlay(
context: context,
child: overlayEntry!,
- transformTargetId: "",
position: OverlayPositionEnum.centered,
onDismiss: clearSelectedEvents,
blurBackground: true,
+ backgroundColor: Colors.black,
);
// select the message
diff --git a/lib/pages/chat/events/html_message.dart b/lib/pages/chat/events/html_message.dart
index d322ffcae..160b34857 100644
--- a/lib/pages/chat/events/html_message.dart
+++ b/lib/pages/chat/events/html_message.dart
@@ -15,7 +15,6 @@ import 'package:fluffychat/pangea/common/utils/any_state_holder.dart';
import 'package:fluffychat/pangea/events/event_wrappers/pangea_message_event.dart';
import 'package:fluffychat/pangea/events/models/pangea_token_model.dart';
import 'package:fluffychat/pangea/message_token_text/message_token_button.dart';
-import 'package:fluffychat/pangea/toolbar/enums/message_mode_enum.dart';
import 'package:fluffychat/pangea/toolbar/enums/reading_assistance_mode_enum.dart';
import 'package:fluffychat/pangea/toolbar/utils/token_rendering_util.dart';
import 'package:fluffychat/pangea/toolbar/widgets/message_selection_overlay.dart';
@@ -204,12 +203,14 @@ class HtmlMessage extends StatelessWidget {
}
}
+ int position = 0;
for (final PangeaToken token in tokens ?? []) {
final String tokenText = token.text.content;
final substringIndex = result.indexWhere(
(string) =>
string.contains(tokenText) &&
!(string.startsWith('<') && string.endsWith('>')),
+ position,
);
if (substringIndex == -1) continue;
@@ -229,9 +230,68 @@ class HtmlMessage extends StatelessWidget {
'$tokenText',
if (after.isNotEmpty) after,
]);
+
+ position = substringIndex;
}
- return result.join();
+ if (pangeaMessageEvent?.textDirection == TextDirection.rtl) {
+ for (int i = 0; i < result.length; i++) {
+ final tag = result[i];
+ if (blockHtmlTags.contains(tag.htmlTagName) ||
+ fullLineHtmlTag.contains(tag.htmlTagName)) {
+ if (i > 0 && result[i - 1] == ", ") {
+ result[i - 1] = "";
+ }
+ result[i] = ", ";
+ }
+ }
+ result.removeWhere((element) => element == "");
+ if (result[0] == ", ") result[0] = "";
+ if (result.last == ", ") result.last = "";
+ final inverted = _invertTags(result);
+ return inverted.join().trim();
+ }
+ return result.join().trim();
+ }
+
+ List _invertTags(List tags) {
+ final List<(String, int)> stack = [];
+ final List<(int, int)> invertedTags = [];
+ for (int i = 0; i < tags.length; i++) {
+ final tag = tags[i];
+ if (!tag.contains('<') || tag.contains("
+ element.$1.htmlTagName == tag.htmlTagName &&
+ !element.$1.contains(""),
+ );
+ }
+
+ if (match != -1) {
+ // If the tag is already in the stack, we remove it
+ final (matchTag, matchIndex) = stack.removeAt(match);
+ invertedTags.add((matchIndex, i));
+ } else {
+ // If the tag is not in the stack, we add it
+ stack.insert(0, (tag, i));
+ }
+ }
+
+ for (final (start, end) in invertedTags) {
+ final startTag = tags[start];
+ final endTag = tags[end];
+
+ tags[start] = endTag;
+ tags[end] = startTag;
+ }
+
+ final inverted = tags.reversed.toList();
+ return inverted;
}
// Pangea#
@@ -311,6 +371,8 @@ class HtmlMessage extends StatelessWidget {
overlayController: overlayController,
isTransitionAnimation: isTransitionAnimation,
);
+
+ final fontSize = renderer.fontSize(context) ?? this.fontSize;
// Pangea#
switch (node.localName) {
@@ -326,12 +388,19 @@ class HtmlMessage extends StatelessWidget {
? isSelected!.call(token)
: false;
+ final isNew = token != null &&
+ overlayController != null &&
+ overlayController!.isNewToken(token);
+
final tokenWidth = renderer.tokenTextWidthForContainer(
context,
node.text,
);
return WidgetSpan(
+ alignment: readingAssistanceMode == ReadingAssistanceMode.practiceMode
+ ? PlaceholderAlignment.bottom
+ : PlaceholderAlignment.middle,
child: CompositedTransformTarget(
link: token != null && renderer.assignTokenKey
? MatrixState.pAnyState
@@ -354,22 +423,11 @@ class HtmlMessage extends StatelessWidget {
color: renderer.backgroundColor(
context,
selected,
+ isNew,
),
),
width: tokenWidth,
animateIn: isTransitionAnimation,
- practiceTargetForToken:
- overlayController?.toolbarMode.associatedActivityType !=
- null
- ? overlayController?.practiceSelection
- ?.activities(
- overlayController!
- .toolbarMode.associatedActivityType!,
- )
- .firstWhereOrNull(
- (a) => a.tokens.contains(token),
- )
- : null,
),
MouseRegion(
cursor: SystemMouseCursors.click,
@@ -379,6 +437,7 @@ class HtmlMessage extends StatelessWidget {
? () => onClick?.call(token)
: null,
child: RichText(
+ textDirection: pangeaMessageEvent?.textDirection,
text: TextSpan(
children: [
LinkifySpan(
@@ -388,6 +447,7 @@ class HtmlMessage extends StatelessWidget {
color: renderer.backgroundColor(
context,
selected,
+ isNew,
),
),
linkStyle: linkStyle,
@@ -425,10 +485,7 @@ class HtmlMessage extends StatelessWidget {
avatar: user.avatarUrl,
uri: href,
outerContext: context,
- // #Pangea
- // fontSize: fontSize,
- fontSize: renderer.fontSize(context) ?? fontSize,
- // Pangea#
+ fontSize: fontSize,
color: linkStyle.color,
// #Pangea
userId: user.id,
@@ -449,10 +506,7 @@ class HtmlMessage extends StatelessWidget {
avatar: room?.avatar,
uri: href,
outerContext: context,
- // #Pangea
- // fontSize: fontSize,
- fontSize: renderer.fontSize(context) ?? fontSize,
- // Pangea#
+ fontSize: fontSize,
color: linkStyle.color,
),
);
@@ -530,6 +584,7 @@ class HtmlMessage extends StatelessWidget {
color: renderer.backgroundColor(
context,
false,
+ false,
),
),
),
@@ -545,6 +600,7 @@ class HtmlMessage extends StatelessWidget {
color: renderer.backgroundColor(
context,
false,
+ false,
),
),
// Pangea#
@@ -1010,3 +1066,8 @@ extension on String {
extension on dom.Element {
dom.Element get rootElement => parent?.rootElement ?? this;
}
+
+extension on String {
+ String get htmlTagName =>
+ replaceAll('<', '').replaceAll('>', '').replaceAll('/', '').split(' ')[0];
+}
diff --git a/lib/pages/chat_search/chat_search_message_tab.dart b/lib/pages/chat_search/chat_search_message_tab.dart
index abf36f0a3..da9f2d63a 100644
--- a/lib/pages/chat_search/chat_search_message_tab.dart
+++ b/lib/pages/chat_search/chat_search_message_tab.dart
@@ -51,6 +51,13 @@ class ChatSearchMessageTab extends StatelessWidget {
);
}
final events = snapshot.data?.$1 ?? [];
+ // #Pangea
+ events.removeWhere(
+ (event) =>
+ event.type != EventTypes.Message ||
+ event.messageType != MessageTypes.Text,
+ );
+ // Pangea#
return SelectionArea(
child: ListView.separated(
@@ -143,15 +150,28 @@ class _MessageSearchResultListTile extends StatelessWidget {
size: 16,
),
const SizedBox(width: 8),
- Text(
- displayname,
- ),
- Expanded(
+ // #Pangea
+ // Text(
+ // displayname,
+ // ),
+ // Expanded(
+ // child: Text(
+ // ' | ${event.originServerTs.localizedTimeShort(context)}',
+ // style: const TextStyle(fontSize: 12),
+ // ),
+ // ),
+ Flexible(
child: Text(
- ' | ${event.originServerTs.localizedTimeShort(context)}',
- style: const TextStyle(fontSize: 12),
+ displayname,
+ maxLines: 1,
+ overflow: TextOverflow.ellipsis,
),
),
+ Text(
+ ' | ${event.originServerTs.localizedTimeShort(context)}',
+ style: const TextStyle(fontSize: 12),
+ ),
+ // Pangea#
],
),
subtitle: Linkify(
diff --git a/lib/pages/invitation_selection/invitation_selection.dart b/lib/pages/invitation_selection/invitation_selection.dart
index 06509fae9..4929e27a9 100644
--- a/lib/pages/invitation_selection/invitation_selection.dart
+++ b/lib/pages/invitation_selection/invitation_selection.dart
@@ -35,35 +35,6 @@ class InvitationSelectionController extends State {
String? get roomId => widget.roomId;
// #Pangea
- final viewportKey = GlobalKey();
-
- final participantListItemHeight = 72.0;
- final goToChatButtonHeight = 50.0;
- final shareButtonsHeight = 150.0;
- final padding = 16.0 * 2;
- final fixedParticipantHeight = 72.0;
-
- double? viewportHeight;
- double get availableHeight =>
- (viewportHeight ?? 0) -
- goToChatButtonHeight -
- shareButtonsHeight -
- padding;
-
- bool showShareButtons(int numParticipants) =>
- (fixedParticipantHeight * numParticipants) < availableHeight;
-
- @override
- initState() {
- WidgetsBinding.instance.addPostFrameCallback((_) {
- final context = viewportKey.currentContext;
- if (context == null) return;
- final renderBox = context.findRenderObject() as RenderBox;
- final size = renderBox.size;
- setState(() => viewportHeight = size.height);
- });
- super.initState();
- }
List? get participants {
final room = Matrix.of(context).client.getRoomById(roomId!);
diff --git a/lib/pages/invitation_selection/invitation_selection_view.dart b/lib/pages/invitation_selection/invitation_selection_view.dart
index 59c6f6ad0..2df3b6a56 100644
--- a/lib/pages/invitation_selection/invitation_selection_view.dart
+++ b/lib/pages/invitation_selection/invitation_selection_view.dart
@@ -8,12 +8,10 @@ import 'package:matrix/matrix.dart';
import 'package:universal_html/html.dart' as html;
import 'package:fluffychat/config/app_config.dart';
-import 'package:fluffychat/config/themes.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/pages/invitation_selection/invitation_selection.dart';
import 'package:fluffychat/pangea/analytics_misc/level_display_name.dart';
import 'package:fluffychat/pangea/chat_settings/constants/room_settings_constants.dart';
-import 'package:fluffychat/pangea/chat_settings/widgets/space_invite_buttons.dart';
import 'package:fluffychat/pangea/common/config/environment.dart';
import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart';
import 'package:fluffychat/pangea/spaces/constants/space_constants.dart';
@@ -107,165 +105,153 @@ class InvitationSelectionView extends StatelessWidget {
// #Pangea
withScrolling: false,
// Pangea#
- child: Stack(
- alignment: Alignment.bottomCenter,
+ child: Column(
children: [
Padding(
- padding: const EdgeInsets.all(16.0),
- child: SizedBox(
- width: 450,
- child: CachedNetworkImage(
- imageUrl:
- "${AppConfig.assetsBaseURL}/${RoomSettingsConstants.referFriendAsset}",
- errorWidget: (context, url, error) => const SizedBox(),
- placeholder: (context, url) => const Center(
- child: CircularProgressIndicator.adaptive(),
+ // #Pangea
+ // padding: const EdgeInsets.all(16.0),
+ padding: const EdgeInsets.only(
+ bottom: 16.0,
+ left: 16.0,
+ right: 16.0,
+ ),
+ // Pangea#
+ child: TextField(
+ textInputAction: TextInputAction.search,
+ decoration: InputDecoration(
+ filled: true,
+ fillColor: theme.colorScheme.secondaryContainer,
+ border: OutlineInputBorder(
+ borderSide: BorderSide.none,
+ borderRadius: BorderRadius.circular(99),
),
+ hintStyle: TextStyle(
+ color: theme.colorScheme.onPrimaryContainer,
+ fontWeight: FontWeight.normal,
+ ),
+ // #Pangea
+ hintText: L10n.of(context).inviteStudentByUserName,
+ // hintText: L10n.of(context).inviteContactToGroup(groupName),
+ // Pangea#
+ prefixIcon: controller.loading
+ ? const Padding(
+ padding: EdgeInsets.symmetric(
+ vertical: 10.0,
+ horizontal: 12,
+ ),
+ child: SizedBox.square(
+ dimension: 24,
+ child: CircularProgressIndicator.adaptive(
+ strokeWidth: 2,
+ ),
+ ),
+ )
+ : const Icon(Icons.search_outlined),
),
+ onChanged: controller.searchUserWithCoolDown,
),
),
- Column(
- children: [
- Padding(
- // #Pangea
- // padding: const EdgeInsets.all(16.0),
- padding: const EdgeInsets.only(
- bottom: 16.0,
- left: 16.0,
- right: 16.0,
- ),
- // Pangea#
- child: TextField(
- textInputAction: TextInputAction.search,
- decoration: InputDecoration(
- filled: true,
- fillColor: theme.colorScheme.secondaryContainer,
- border: OutlineInputBorder(
- borderSide: BorderSide.none,
- borderRadius: BorderRadius.circular(99),
- ),
- hintStyle: TextStyle(
- color: theme.colorScheme.onPrimaryContainer,
- fontWeight: FontWeight.normal,
- ),
- // #Pangea
- hintText: L10n.of(context).inviteStudentByUserName,
- // hintText: L10n.of(context).inviteContactToGroup(groupName),
- // Pangea#
- prefixIcon: controller.loading
- ? const Padding(
- padding: EdgeInsets.symmetric(
- vertical: 10.0,
- horizontal: 12,
- ),
- child: SizedBox.square(
- dimension: 24,
+ // #Pangea
+ // StreamBuilder