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 6371dc411..3f07c4cce 100644
--- a/lib/l10n/intl_en.arb
+++ b/lib/l10n/intl_en.arb
@@ -5018,9 +5018,6 @@
"newDirectMessage": "New direct message",
"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",
diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart
index 7d448025d..bc820b81a 100644
--- a/lib/pages/chat/chat.dart
+++ b/lib/pages/chat/chat.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 877ddf428..af380fc27 100644
--- a/lib/pages/chat/events/html_message.dart
+++ b/lib/pages/chat/events/html_message.dart
@@ -155,7 +155,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,
@@ -309,6 +311,8 @@ class HtmlMessage extends StatelessWidget {
overlayController: overlayController,
isTransitionAnimation: isTransitionAnimation,
);
+
+ final fontSize = renderer.fontSize(context) ?? this.fontSize;
// Pangea#
switch (node.localName) {
@@ -423,10 +427,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,
@@ -447,10 +448,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/events/video_player.dart b/lib/pages/chat/events/video_player.dart
index 856bda50c..6b31eb774 100644
--- a/lib/pages/chat/events/video_player.dart
+++ b/lib/pages/chat/events/video_player.dart
@@ -1,3 +1,5 @@
+import 'dart:math';
+
import 'package:flutter/material.dart';
import 'package:flutter_linkify/flutter_linkify.dart';
@@ -36,11 +38,14 @@ class EventVideoPlayer extends StatelessWidget {
.tryGet('xyz.amorgan.blurhash') ??
fallbackBlurHash;
final fileDescription = event.fileDescription;
+ const maxDimension = 300.0;
final infoMap = event.content.tryGetMap('info');
- final videoWidth = infoMap?.tryGet('w') ?? 400;
- final videoHeight = infoMap?.tryGet('h') ?? 300;
- const height = 300.0;
- final width = videoWidth * (height / videoHeight);
+ final videoWidth = infoMap?.tryGet('w') ?? maxDimension;
+ final videoHeight = infoMap?.tryGet('h') ?? maxDimension;
+
+ final modifier = max(videoWidth, videoHeight) / maxDimension;
+ final width = videoWidth / modifier;
+ final height = videoHeight / modifier;
final durationInt = infoMap?.tryGet('duration');
final duration =
diff --git a/lib/pages/chat/send_file_dialog.dart b/lib/pages/chat/send_file_dialog.dart
index c786b6769..7b215496e 100644
--- a/lib/pages/chat/send_file_dialog.dart
+++ b/lib/pages/chat/send_file_dialog.dart
@@ -59,16 +59,22 @@ class SendFileDialogState extends State {
final length = await xfile.length();
final mimeType = xfile.mimeType ?? lookupMimeType(xfile.path);
+ // Generate video thumbnail
+ if (PlatformInfos.isMobile &&
+ mimeType != null &&
+ mimeType.startsWith('video')) {
+ scaffoldMessenger.showLoadingSnackBar(l10n.generatingVideoThumbnail);
+ thumbnail = await xfile.getVideoThumbnail();
+ }
+
// If file is a video, shrink it!
if (PlatformInfos.isMobile &&
mimeType != null &&
- mimeType.startsWith('video') &&
- length > minSizeToCompress &&
- compress) {
+ mimeType.startsWith('video')) {
scaffoldMessenger.showLoadingSnackBar(l10n.compressVideo);
- file = await xfile.resizeVideo();
- scaffoldMessenger.showLoadingSnackBar(l10n.generatingVideoThumbnail);
- thumbnail = await xfile.getVideoThumbnail();
+ file = await xfile.getVideoInfo(
+ compress: length > minSizeToCompress && compress,
+ );
} else {
if (length > maxUploadSize) {
throw FileTooBigMatrixException(length, maxUploadSize);
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