Files
moxxy/lib/ui/pages/newconversation.dart
Alexander "PapaTutuWawa 6a22a32724 ui: Fix the conversation's back button not working
When opening a new conversation from the NewConversationPage,
the navigation stack would be empty.
2022-08-06 20:44:37 +02:00

106 lines
3.5 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:moxxyv2/shared/constants.dart';
import 'package:moxxyv2/ui/bloc/newconversation_bloc.dart';
import 'package:moxxyv2/ui/constants.dart';
import 'package:moxxyv2/ui/helpers.dart';
import 'package:moxxyv2/ui/widgets/avatar.dart';
import 'package:moxxyv2/ui/widgets/conversation.dart';
import 'package:moxxyv2/ui/widgets/topbar.dart';
class NewConversationPage extends StatelessWidget {
const NewConversationPage({ Key? key }) : super(key: key);
static MaterialPageRoute<dynamic> get route => MaterialPageRoute<dynamic>(
builder: (_) => const NewConversationPage(),
settings: const RouteSettings(
name: newConversationRoute,
),
);
Widget _renderIconEntry(IconData icon, String text, void Function() onTap) {
return InkWell(
onTap: onTap,
child: Row(
children: [
Padding(
padding: const EdgeInsets.all(8),
child: AvatarWrapper(
radius: 35,
altIcon: icon,
),
),
Padding(
padding: const EdgeInsets.all(8),
child: Text(
text,
style: const TextStyle(
fontSize: 19,
fontWeight: FontWeight.bold,
),
),
)
],
),
);
}
@override
Widget build(BuildContext context) {
final maxTextWidth = MediaQuery.of(context).size.width * 0.6;
return Scaffold(
appBar: BorderlessTopbar.simple('Start new chat'),
body: BlocBuilder<NewConversationBloc, NewConversationState>(
builder: (BuildContext context, NewConversationState state) => ListView.builder(
itemCount: state.roster.length + 2,
itemBuilder: (context, index) {
switch(index) {
case 0: return _renderIconEntry(
Icons.person_add,
'Add contact',
() => Navigator.pushNamed(context, addContactRoute),
);
case 1: return _renderIconEntry(
Icons.group_add,
'Create groupchat',
() => showNotImplementedDialog('groupchat', context),
);
default:
final item = state.roster[index - 2];
return Dismissible(
key: ValueKey('roster;${item.jid}'),
onDismissed: (_) => context.read<NewConversationBloc>().add(
NewConversationRosterItemRemovedEvent(item.jid),
),
background: ColoredBox(
color: Colors.red,
child: Padding(
padding: const EdgeInsets.all(16),
child: Row(
children: const [
Icon(Icons.delete),
Spacer(),
Icon(Icons.delete)
],
),
),
),
child: InkWell(
onTap: () => context.read<NewConversationBloc>().add(
NewConversationAddedEvent(
item.jid,
item.title,
item.avatarUrl,
),
),
child: ConversationsListRow(item.avatarUrl, item.title, item.jid, 0, maxTextWidth, timestampNever, false),
),
);
}
},
),
),
);
}
}