diff --git a/.github/workflows/main_deploy.yaml b/.github/workflows/main_deploy.yaml
index d60208739..51dfaa1fe 100644
--- a/.github/workflows/main_deploy.yaml
+++ b/.github/workflows/main_deploy.yaml
@@ -50,6 +50,11 @@ jobs:
cp public/.env public/assets/.env
touch public/assets/envs.json
echo "$ENV_OVERRIDES" >> public/assets/envs.json
+ mkdir -p public/.well-known
+ curl https://app.pangea.chat/.well-known/apple-app-site-association \
+ -o public/.well-known/apple-app-site-association
+ curl https://app.pangea.chat/.well-known/assetlinks.json \
+ -o public/.well-known/assetlinks.json
- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v4
with:
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 734869ecc..2106db95a 100644
--- a/lib/config/app_config.dart
+++ b/lib/config/app_config.dart
@@ -44,7 +44,6 @@ abstract class AppConfig {
toolbarButtonsHeight +
(chatInputRowOverlayPadding * 2) +
toolbarSpacing;
- static const double audioTranscriptionMaxHeight = 150.0;
static TextStyle messageTextStyle(
Event? event,
diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb
index 0f6b2899e..3f07c4cce 100644
--- a/lib/l10n/intl_en.arb
+++ b/lib/l10n/intl_en.arb
@@ -4630,9 +4630,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",
@@ -5001,6 +5001,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!",
@@ -5015,11 +5016,8 @@
"groupChat": "Group Chat",
"directMessage": "Direct Message",
"newDirectMessage": "New direct message",
- "speakingExercisesTooltip": "Speaking practice",
+ "speakingExercisesTooltip": "Speaking",
"noChatsFoundHereYet": "No chats found here yet",
- "endNow": "End now",
- "setDuration": "Set duration",
- "activityEnded": "That’s a wrap for this activity! Big thanks to everyone for chatting, learning, and making this space so lively. Language grows with conversation, and every word exchanged brings us closer to confidence and fluency.\n\nKeep practicing, stay curious, and don’t be shy to keep the conversation going!",
"duration": "Duration",
"transcriptionFailed": "Failed to transcribe audio",
"aUserIsKnocking": "1 user is requesting to join your space",
@@ -5034,4 +5032,4 @@
},
"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
+}
diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart
index e2cd8b515..bc820b81a 100644
--- a/lib/pages/chat/chat.dart
+++ b/lib/pages/chat/chat.dart
@@ -33,7 +33,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';
@@ -1856,7 +1856,10 @@ class ChatController extends State
}
}
- void pinEvent() {
+ // #Pangea
+ // void pinEvent() {
+ Future pinEvent() async {
+ // Pangea#
final pinnedEventIds = room.pinnedEventIds;
final selectedEventIds = selectedEvents.map((e) => e.eventId).toSet();
final unpin = selectedEventIds.length == 1 &&
@@ -1866,10 +1869,16 @@ class ChatController extends State
} else {
pinnedEventIds.addAll(selectedEventIds);
}
- showFutureLoadingDialog(
+ // #Pangea
+ // showFutureLoadingDialog(
+ // context: context,
+ // future: () => room.setPinnedEvents(pinnedEventIds),
+ // );
+ await showFutureLoadingDialog(
context: context,
future: () => room.setPinnedEvents(pinnedEventIds),
);
+ // Pangea#
}
Timer? _storeInputTimeoutTimer;
diff --git a/lib/pages/chat/chat_event_list.dart b/lib/pages/chat/chat_event_list.dart
index 030f81422..948c0578b 100644
--- a/lib/pages/chat/chat_event_list.dart
+++ b/lib/pages/chat/chat_event_list.dart
@@ -1,7 +1,6 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
-import 'package:matrix/matrix.dart';
import 'package:scroll_to_index/scroll_to_index.dart';
import 'package:fluffychat/config/app_config.dart';
@@ -11,9 +10,7 @@ import 'package:fluffychat/pages/chat/events/message.dart';
import 'package:fluffychat/pages/chat/seen_by_row.dart';
import 'package:fluffychat/pages/chat/typing_indicators.dart';
import 'package:fluffychat/pangea/activity_planner/activity_plan_message.dart';
-import 'package:fluffychat/pangea/events/constants/pangea_event_types.dart';
import 'package:fluffychat/pangea/events/extensions/pangea_event_extension.dart';
-import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart';
import 'package:fluffychat/utils/account_config.dart';
import 'package:fluffychat/utils/matrix_sdk_extensions/filtered_timeline_extension.dart';
import 'package:fluffychat/utils/platform_infos.dart';
@@ -43,30 +40,6 @@ class ChatEventList extends StatelessWidget {
final horizontalPadding = FluffyThemes.isColumnMode(context) ? 8.0 : 0.0;
final events = timeline.events.filterByVisibleInGui();
- // #Pangea
- if (timeline.room.activityPlan?.endAt != null &&
- timeline.room.activityPlan!.endAt!.isBefore(DateTime.now())) {
- final eventIndex = events.indexWhere(
- (e) => e.originServerTs.isBefore(
- timeline.room.activityPlan!.endAt!,
- ),
- );
-
- if (eventIndex != -1) {
- events.insert(
- eventIndex,
- Event(
- type: PangeaEventTypes.activityPlanEnd,
- eventId: timeline.room.client.generateUniqueTransactionId(),
- senderId: timeline.room.client.userID!,
- originServerTs: timeline.room.activityPlan!.endAt!,
- room: timeline.room,
- content: {},
- ),
- );
- }
- }
- // Pangea#
final animateInEventIndex = controller.animateInEventIndex;
// create a map of eventId --> index to greatly improve performance of
diff --git a/lib/pages/chat/chat_view.dart b/lib/pages/chat/chat_view.dart
index 2f90e7f59..1436cb00b 100644
--- a/lib/pages/chat/chat_view.dart
+++ b/lib/pages/chat/chat_view.dart
@@ -13,11 +13,9 @@ import 'package:fluffychat/pages/chat/chat_app_bar_list_tile.dart';
import 'package:fluffychat/pages/chat/chat_app_bar_title.dart';
import 'package:fluffychat/pages/chat/chat_event_list.dart';
import 'package:fluffychat/pages/chat/pinned_events.dart';
-import 'package:fluffychat/pangea/activities/pinned_activity_message.dart';
import 'package:fluffychat/pangea/chat/widgets/chat_input_bar.dart';
import 'package:fluffychat/pangea/chat/widgets/chat_input_bar_header.dart';
import 'package:fluffychat/pangea/chat/widgets/chat_view_background.dart';
-import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart';
import 'package:fluffychat/utils/account_config.dart';
import 'package:fluffychat/utils/localized_exception_extension.dart';
import 'package:fluffychat/widgets/future_loading_dialog.dart';
@@ -190,13 +188,6 @@ class ChatView extends StatelessWidget {
if (scrollUpBannerEventId != null) {
appbarBottomHeight += ChatAppBarListTile.fixedHeight;
}
- // #Pangea
- if (controller.room.activityPlan != null &&
- controller.room.activityPlan!.endAt != null &&
- controller.room.activityPlan!.endAt!.isAfter(DateTime.now())) {
- appbarBottomHeight += ChatAppBarListTile.fixedHeight;
- }
- // Pangea#
return Scaffold(
appBar: AppBar(
actionsIconTheme: IconThemeData(
@@ -235,9 +226,6 @@ class ChatView extends StatelessWidget {
mainAxisSize: MainAxisSize.min,
children: [
PinnedEvents(controller),
- // #Pangea
- PinnedActivityMessage(controller),
- // Pangea#
if (scrollUpBannerEventId != null)
ChatAppBarListTile(
leading: IconButton(
diff --git a/lib/pages/chat/events/audio_player.dart b/lib/pages/chat/events/audio_player.dart
index 11bbfba52..0831047f4 100644
--- a/lib/pages/chat/events/audio_player.dart
+++ b/lib/pages/chat/events/audio_player.dart
@@ -77,6 +77,8 @@ class AudioPlayerState extends State {
// #Pangea
StreamSubscription? _onAudioPositionChanged;
StreamSubscription? _onAudioStateChanged;
+
+ double playbackSpeed = 1.0;
// Pangea#
@override
@@ -175,6 +177,9 @@ class AudioPlayerState extends State {
: matrix.audioPlayer;
if (currentPlayer != null) {
+ // #Pangea
+ currentPlayer.setSpeed(playbackSpeed);
+ // Pangea#
if (currentPlayer.isAtEndPosition) {
currentPlayer.seek(Duration.zero);
} else if (currentPlayer.playing) {
@@ -204,28 +209,37 @@ class AudioPlayerState extends State {
// #Pangea
// if (!kIsWeb) {
- if (!kIsWeb && matrixFile != null) {
- // Pangea#
- final tempDir = await getTemporaryDirectory();
- final fileName = Uri.encodeComponent(
- // #Pangea
- // widget.event.attachmentOrThumbnailMxcUrl()!.pathSegments.last,
- widget.event!.attachmentOrThumbnailMxcUrl()!.pathSegments.last,
+ if (!kIsWeb) {
+ if (matrixFile != null) {
// Pangea#
- );
- file = File('${tempDir.path}/${fileName}_${matrixFile.name}');
+ final tempDir = await getTemporaryDirectory();
+ final fileName = Uri.encodeComponent(
+ // #Pangea
+ // widget.event.attachmentOrThumbnailMxcUrl()!.pathSegments.last,
+ widget.event!.attachmentOrThumbnailMxcUrl()!.pathSegments.last,
+ // Pangea#
+ );
+ file = File('${tempDir.path}/${fileName}_${matrixFile.name}');
- await file.writeAsBytes(matrixFile.bytes);
+ await file.writeAsBytes(matrixFile.bytes);
- if (Platform.isIOS &&
- matrixFile.mimeType.toLowerCase() == 'audio/ogg') {
- Logs().v('Convert ogg audio file for iOS...');
- final convertedFile = File('${file.path}.caf');
- if (await convertedFile.exists() == false) {
- OpusCaf().convertOpusToCaf(file.path, convertedFile.path);
+ if (Platform.isIOS &&
+ matrixFile.mimeType.toLowerCase() == 'audio/ogg') {
+ Logs().v('Convert ogg audio file for iOS...');
+ final convertedFile = File('${file.path}.caf');
+ if (await convertedFile.exists() == false) {
+ OpusCaf().convertOpusToCaf(file.path, convertedFile.path);
+ }
+ file = convertedFile;
}
- file = convertedFile;
+ // #Pangea
+ } else if (widget.matrixFile != null) {
+ final tempDir = await getTemporaryDirectory();
+
+ file = File('${tempDir.path}/${widget.matrixFile!.name}');
+ await file.writeAsBytes(widget.matrixFile!.bytes);
}
+ // Pangea#
}
setState(() {
@@ -250,6 +264,7 @@ class AudioPlayerState extends State {
final audioPlayer = matrix.audioPlayer = AudioPlayer();
// #Pangea
+ audioPlayer.setSpeed(playbackSpeed);
_onAudioPositionChanged?.cancel();
_onAudioPositionChanged =
matrix.audioPlayer!.positionStream.listen((state) {
@@ -306,7 +321,22 @@ class AudioPlayerState extends State {
void _toggleSpeed() async {
final audioPlayer = matrix.audioPlayer;
+ // #Pangea
+ // if (audioPlayer == null) return;
+ switch (playbackSpeed) {
+ case 1.0:
+ setState(() => playbackSpeed = 0.75);
+ case 0.75:
+ setState(() => playbackSpeed = 0.5);
+ case 0.5:
+ setState(() => playbackSpeed = 1.25);
+ case 1.25:
+ setState(() => playbackSpeed = 1.5);
+ default:
+ setState(() => playbackSpeed = 1.0);
+ }
if (audioPlayer == null) return;
+ // Pangea#
switch (audioPlayer.speed) {
// #Pangea
// case 1.0:
@@ -599,7 +629,7 @@ class AudioPlayerState extends State {
height: 20,
child: Center(
child: Text(
- '${audioPlayer?.speed.toString() ?? 1}x',
+ '${audioPlayer?.speed.toString() ?? playbackSpeed}x',
style: TextStyle(
color: widget.color,
fontSize: 9,
diff --git a/lib/pages/chat/events/html_message.dart b/lib/pages/chat/events/html_message.dart
index 9ddaa4fce..729ff7890 100644
--- a/lib/pages/chat/events/html_message.dart
+++ b/lib/pages/chat/events/html_message.dart
@@ -179,7 +179,9 @@ class HtmlMessage extends StatelessWidget {
// #Pangea
List? get tokens =>
- pangeaMessageEvent?.messageDisplayRepresentation?.tokens;
+ pangeaMessageEvent?.messageDisplayRepresentation?.tokens
+ ?.where((t) => t.pos != "PUNCT")
+ .toList();
PangeaToken? getToken(
String text,
@@ -385,6 +387,8 @@ class HtmlMessage extends StatelessWidget {
overlayController: overlayController,
isTransitionAnimation: isTransitionAnimation,
);
+
+ final fontSize = renderer.fontSize(context) ?? this.fontSize;
// Pangea#
switch (node.localName) {
@@ -500,10 +504,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,
@@ -524,10 +525,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,
),
);
diff --git a/lib/pages/chat/events/message.dart b/lib/pages/chat/events/message.dart
index 30d787343..ada6cceb4 100644
--- a/lib/pages/chat/events/message.dart
+++ b/lib/pages/chat/events/message.dart
@@ -9,9 +9,7 @@ import 'package:fluffychat/config/themes.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/pages/chat/chat.dart';
import 'package:fluffychat/pages/chat/events/room_creation_state_event.dart';
-import 'package:fluffychat/pangea/activities/activity_state_event.dart';
import 'package:fluffychat/pangea/common/widgets/pressable_button.dart';
-import 'package:fluffychat/pangea/events/constants/pangea_event_types.dart';
import 'package:fluffychat/pangea/events/event_wrappers/pangea_message_event.dart';
import 'package:fluffychat/utils/date_time_extension.dart';
import 'package:fluffychat/utils/file_description.dart';
@@ -123,22 +121,6 @@ class Message extends StatelessWidget {
if (event.type == EventTypes.RoomCreate) {
return RoomCreationStateEvent(event: event);
}
- // #Pangea
- if (event.type == PangeaEventTypes.activityPlan) {
- final state = event.room.getState(PangeaEventTypes.activityPlan);
- if (state == null || state is! Event) {
- return const SizedBox.shrink();
- }
-
- return state.originServerTs == event.originServerTs
- ? ActivityStateEvent(event: event)
- : const SizedBox();
- }
-
- if (event.type == PangeaEventTypes.activityPlanEnd) {
- return const ActivityFinishedEvent();
- }
- // Pangea#
return StateMessage(event);
}
diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart
index eccc19960..519ff9218 100644
--- a/lib/pages/chat_list/chat_list.dart
+++ b/lib/pages/chat_list/chat_list.dart
@@ -587,7 +587,6 @@ class ChatListController extends State
if (space != null) {
chatListHandleSpaceTap(
context,
- this,
space,
);
}
@@ -669,6 +668,10 @@ class ChatListController extends State
_activeSpaceId =
widget.activeSpaceId == 'clear' ? null : widget.activeSpaceId;
+
+ WidgetsBinding.instance.addPostFrameCallback((_) {
+ _joinInvitedSpaces();
+ });
// Pangea#
super.initState();
@@ -685,6 +688,16 @@ class ChatListController extends State
: setActiveSpace(widget.activeSpaceId!);
}
}
+
+ Future _joinInvitedSpaces() async {
+ final invitedSpaces = Matrix.of(context).client.rooms.where(
+ (r) => r.isSpace && r.membership == Membership.invite,
+ );
+
+ for (final space in invitedSpaces) {
+ await showInviteDialog(space, context);
+ }
+ }
// Pangea#
@override
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