Merge branch 'main' of https://github.com/pangeachat/client into fix-reply-scrolling

pull/1384/head
Kelrap 1 year ago
commit b021a2214c

@ -14,7 +14,6 @@ import 'package:fluffychat/pangea/choreographer/widgets/start_igc_button.dart';
import 'package:fluffychat/pangea/extensions/pangea_room_extension/pangea_room_extension.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension/pangea_room_extension.dart';
import 'package:fluffychat/pangea/widgets/chat/chat_floating_action_button.dart'; import 'package:fluffychat/pangea/widgets/chat/chat_floating_action_button.dart';
import 'package:fluffychat/utils/account_config.dart'; import 'package:fluffychat/utils/account_config.dart';
import 'package:fluffychat/utils/platform_infos.dart';
import 'package:fluffychat/widgets/chat_settings_popup_menu.dart'; import 'package:fluffychat/widgets/chat_settings_popup_menu.dart';
import 'package:fluffychat/widgets/connection_status_header.dart'; import 'package:fluffychat/widgets/connection_status_header.dart';
import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/matrix.dart';
@ -299,216 +298,232 @@ class ChatView extends StatelessWidget {
), ),
), ),
SafeArea( SafeArea(
child: Column( child:
children: <Widget>[ // #Pangea
Expanded( Stack(
child: GestureDetector( children: [
onTap: controller.clearSingleSelectedEvent, // Pangea#
child: Builder( Column(
builder: (context) { children: <Widget>[
if (controller.timeline == null) { Expanded(
return const Center( child: GestureDetector(
child: CircularProgressIndicator.adaptive( onTap: controller.clearSingleSelectedEvent,
strokeWidth: 2, child: Builder(
), builder: (context) {
); if (controller.timeline == null) {
} return const Center(
return ChatEventList( child:
controller: controller, CircularProgressIndicator.adaptive(
); strokeWidth: 2,
}, ),
), );
), }
), return ChatEventList(
if (controller.room.canSendDefaultMessages && controller: controller,
controller.room.membership == Membership.join) );
Container( },
margin: EdgeInsets.only( ),
bottom: bottomSheetPadding,
left: bottomSheetPadding,
right: bottomSheetPadding,
),
constraints: const BoxConstraints(
maxWidth: FluffyThemes.columnWidth * 2.5,
),
alignment: Alignment.center,
child: Material(
clipBehavior: Clip.hardEdge,
color: Theme.of(context)
.colorScheme
// ignore: deprecated_member_use
.surfaceVariant,
borderRadius: const BorderRadius.all(
Radius.circular(24),
), ),
child: controller.room.isAbandonedDMRoom == true ),
? Row( if (controller.room.canSendDefaultMessages &&
mainAxisAlignment: controller.room.membership == Membership.join)
MainAxisAlignment.spaceEvenly, Container(
children: [ margin: EdgeInsets.only(
// #Pangea bottom: bottomSheetPadding,
if (controller.room.isRoomAdmin) left: bottomSheetPadding,
TextButton.icon( right: bottomSheetPadding,
style: TextButton.styleFrom( ),
padding: const EdgeInsets.all( constraints: const BoxConstraints(
16, maxWidth: FluffyThemes.columnWidth * 2.5,
), ),
foregroundColor: Theme.of(context) alignment: Alignment.center,
.colorScheme child: Material(
.error, clipBehavior: Clip.hardEdge,
), color: Theme.of(context)
icon: const Icon( .colorScheme
Icons.archive_outlined, // ignore: deprecated_member_use
), .surfaceVariant,
onPressed: controller.archiveChat, borderRadius: const BorderRadius.all(
label: Text( Radius.circular(24),
L10n.of(context)!.archive, ),
), child: controller.room.isAbandonedDMRoom ==
), true
// Pangea# ? Row(
TextButton.icon( mainAxisAlignment:
style: TextButton.styleFrom( MainAxisAlignment.spaceEvenly,
padding: const EdgeInsets.all( children: [
16,
),
foregroundColor: Theme.of(context)
.colorScheme
.error,
),
icon: const Icon(
// #Pangea // #Pangea
// Icons.archive_outlined, if (controller.room.isRoomAdmin)
Icons.arrow_forward, TextButton.icon(
style: TextButton.styleFrom(
padding: const EdgeInsets.all(
16,
),
foregroundColor:
Theme.of(context)
.colorScheme
.error,
),
icon: const Icon(
Icons.archive_outlined,
),
onPressed:
controller.archiveChat,
label: Text(
L10n.of(context)!.archive,
),
),
// Pangea# // Pangea#
), TextButton.icon(
onPressed: controller.leaveChat, style: TextButton.styleFrom(
label: Text( padding: const EdgeInsets.all(
L10n.of(context)!.leave, 16,
), ),
), foregroundColor:
TextButton.icon( Theme.of(context)
style: TextButton.styleFrom( .colorScheme
padding: const EdgeInsets.all( .error,
16, ),
icon: const Icon(
// #Pangea
// Icons.archive_outlined,
Icons.arrow_forward,
// Pangea#
),
onPressed: controller.leaveChat,
label: Text(
L10n.of(context)!.leave,
),
), ),
), TextButton.icon(
icon: const Icon( style: TextButton.styleFrom(
Icons.forum_outlined, padding: const EdgeInsets.all(
), 16,
onPressed: controller.recreateChat, ),
label: Text( ),
L10n.of(context)!.reopenChat, icon: const Icon(
), Icons.forum_outlined,
), ),
], onPressed:
) controller.recreateChat,
: label: Text(
// #Pangea L10n.of(context)!.reopenChat,
null, ),
// Column( ),
// mainAxisSize: MainAxisSize.min, ],
// children: [ )
// const ConnectionStatusHeader(), :
// ITBar( // #Pangea
// choreographer: null,
// controller.choreographer, // Column(
// ), // mainAxisSize: MainAxisSize.min,
// ReactionsPicker(controller), // children: [
// ReplyDisplay(controller), // const ConnectionStatusHeader(),
// ChatInputRow(controller), // ITBar(
// ChatEmojiPicker(controller), // choreographer:
// ], // controller.choreographer,
// ), // ),
// Pangea# // ReactionsPicker(controller),
// ReplyDisplay(controller),
// ChatInputRow(controller),
// ChatEmojiPicker(controller),
// ],
// ),
// Pangea#
),
),
// #Pangea
// Keep messages above minimum input bar height
const SizedBox(
height: 60,
), ),
), // Pangea#
// #Pangea ],
// Keep messages above minimum input bar height
SizedBox(
height: (PlatformInfos.isMobile ? 30 : 60),
), ),
// Pangea# // #Pangea
], Positioned(
), left: 0,
), right: 0,
// #Pangea bottom: 16,
// if (controller.dragging) child: Column(
// Container( mainAxisSize: MainAxisSize.min,
// color: Theme.of(context) crossAxisAlignment: CrossAxisAlignment.center,
// .scaffoldBackgroundColor children: [
// .withOpacity(0.9), if (!controller.selectMode)
// alignment: Alignment.center, Container(
// child: const Icon( margin: EdgeInsets.only(
// Icons.upload_outlined, bottom: 10,
// size: 100, left: bottomSheetPadding,
// ), right: bottomSheetPadding,
// ), ),
Positioned( constraints: const BoxConstraints(
left: 0, maxWidth: FluffyThemes.columnWidth * 2.4,
right: 0, ),
bottom: 16, child: Row(
child: Column( mainAxisAlignment:
mainAxisSize: MainAxisSize.min, MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center, children: [
children: [ StartIGCButton(
if (!controller.selectMode) controller: controller,
Container( ),
margin: EdgeInsets.only( ChatFloatingActionButton(
bottom: 10, controller: controller,
left: bottomSheetPadding, ),
right: bottomSheetPadding, ],
), ),
constraints: const BoxConstraints(
maxWidth: FluffyThemes.columnWidth * 2.4,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
StartIGCButton(
controller: controller,
), ),
ChatFloatingActionButton( Container(
controller: controller, margin: EdgeInsets.only(
bottom: bottomSheetPadding,
left: bottomSheetPadding,
right: bottomSheetPadding,
), ),
], constraints: const BoxConstraints(
), maxWidth: FluffyThemes.columnWidth * 2.5,
),
Container(
margin: EdgeInsets.only(
bottom: bottomSheetPadding,
left: bottomSheetPadding,
right: bottomSheetPadding,
),
constraints: const BoxConstraints(
maxWidth: FluffyThemes.columnWidth * 2.5,
),
alignment: Alignment.center,
child: Material(
clipBehavior: Clip.hardEdge,
color: Theme.of(context)
.colorScheme
.surfaceContainerHighest,
borderRadius: const BorderRadius.all(
Radius.circular(24),
),
child: Column(
children: [
const ConnectionStatusHeader(),
ITBar(
choreographer: controller.choreographer,
), ),
ReactionsPicker(controller), alignment: Alignment.center,
ReplyDisplay(controller), child: Material(
ChatInputRow(controller), clipBehavior: Clip.hardEdge,
ChatEmojiPicker(controller), color: Theme.of(context)
], .colorScheme
), .surfaceContainerHighest,
borderRadius: const BorderRadius.all(
Radius.circular(24),
),
child: Column(
children: [
const ConnectionStatusHeader(),
ITBar(
choreographer: controller.choreographer,
),
ReactionsPicker(controller),
ReplyDisplay(controller),
ChatInputRow(controller),
ChatEmojiPicker(controller),
],
),
),
),
],
), ),
), ),
// Pangea#
], ],
), ),
// #Pangea
// if (controller.dragging)
// Container(
// color: Theme.of(context)
// .scaffoldBackgroundColor
// .withOpacity(0.9),
// alignment: Alignment.center,
// child: const Icon(
// Icons.upload_outlined,
// size: 100,
// ),
// ),
// Pangea#
), ),
// Pangea#
], ],
), ),
); );

@ -911,11 +911,12 @@ class ChatListController extends State<ChatList>
await client.roomsLoading; await client.roomsLoading;
await client.accountDataLoading; await client.accountDataLoading;
await client.userDeviceKeysLoading; await client.userDeviceKeysLoading;
if (client.prevBatch == null) { // #Pangea
// See here for explanation of this change: https://github.com/pangeachat/client/pull/539
// if (client.prevBatch == null) {
if (client.onSync.value?.nextBatch == null) {
// Pangea#
await client.onSync.stream.first; await client.onSync.stream.first;
// #Pangea
pangeaController.startChatWithBotIfNotPresent();
//Pangea#
// Display first login bootstrap if enabled // Display first login bootstrap if enabled
// #Pangea // #Pangea
@ -930,9 +931,19 @@ class ChatListController extends State<ChatList>
} }
// #Pangea // #Pangea
await _initPangeaControllers(client);
// Pangea#
if (!mounted) return;
setState(() {
waitForFirstSync = true;
});
}
// #Pangea
Future<void> _initPangeaControllers(Client client) async {
if (mounted) { if (mounted) {
// TODO try not to await so much
GoogleAnalytics.analyticsUserUpdate(client.userID); GoogleAnalytics.analyticsUserUpdate(client.userID);
pangeaController.startChatWithBotIfNotPresent();
await pangeaController.subscriptionController.initialize(); await pangeaController.subscriptionController.initialize();
await pangeaController.myAnalytics.initialize(); await pangeaController.myAnalytics.initialize();
pangeaController.afterSyncAndFirstLoginInitialization(context); pangeaController.afterSyncAndFirstLoginInitialization(context);
@ -943,14 +954,9 @@ class ChatListController extends State<ChatList>
ErrorHandler.logError( ErrorHandler.logError(
m: "didn't run afterSyncAndFirstLoginInitialization because not mounted", m: "didn't run afterSyncAndFirstLoginInitialization because not mounted",
); );
// debugger(when: kDebugMode);
} }
// Pangea#
if (!mounted) return;
setState(() {
waitForFirstSync = true;
});
} }
// Pangea#
void cancelAction() { void cancelAction() {
if (selectMode == SelectMode.share) { if (selectMode == SelectMode.share) {

@ -435,7 +435,11 @@ class MessageToolbarState extends State<MessageToolbar> {
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
Flexible( Container(
constraints: const BoxConstraints(
minWidth: 300,
maxHeight: 228,
),
child: SingleChildScrollView( child: SingleChildScrollView(
child: AnimatedSize( child: AnimatedSize(
duration: FluffyThemes.animationDuration, duration: FluffyThemes.animationDuration,

Loading…
Cancel
Save