diff --git a/lib/model.dart b/lib/model.dart index bead765..e468f01 100644 --- a/lib/model.dart +++ b/lib/model.dart @@ -429,7 +429,7 @@ class MessageState extends ChangeNotifier { } else { var parts = message['d'].toString().split("||"); if (parts.length == 2) { - print("jsondecoding: "+utf8.fuse(base64).decode(parts[1].substring(5))); + print("jsondecoding: " + utf8.fuse(base64).decode(parts[1].substring(5))); var jsonObj = jsonDecode(utf8.fuse(base64).decode(parts[1].substring(5))); this._inviteTarget = jsonObj['GroupID']; this._inviteNick = jsonObj['GroupName']; diff --git a/lib/views/messageview.dart b/lib/views/messageview.dart index f163348..090a52d 100644 --- a/lib/views/messageview.dart +++ b/lib/views/messageview.dart @@ -81,18 +81,16 @@ class _MessageViewState extends State { void _sendMessage([String ignoredParam]) { ChatMessage cm = new ChatMessage(o: 1, d: ctrlrCompose.value.text); - Provider.of(context, listen: false).cwtch.SendMessage( - Provider.of(context, listen: false).profileOnion, - Provider.of(context, listen: false).onion, - jsonEncode(cm)); + Provider.of(context, listen: false) + .cwtch + .SendMessage(Provider.of(context, listen: false).profileOnion, Provider.of(context, listen: false).onion, jsonEncode(cm)); _sendMessageHelper(); } void _sendInvitation([String ignoredParam]) { - Provider.of(context, listen: false).cwtch.SendInvitation( - Provider.of(context, listen: false).profileOnion, - Provider.of(context, listen: false).onion, - this.selectedContact); + Provider.of(context, listen: false) + .cwtch + .SendInvitation(Provider.of(context, listen: false).profileOnion, Provider.of(context, listen: false).onion, this.selectedContact); _sendMessageHelper(); } @@ -121,23 +119,25 @@ class _MessageViewState extends State { textInputAction: TextInputAction.send, onSubmitted: _sendMessage, )), - Column(children:[SizedBox( - width: 100, - height: 50, - child: Padding( - padding: EdgeInsets.fromLTRB(2, 2, 2, 2), - child: ElevatedButton( - child: Icon(Icons.send, size: 24, color: Provider.of(context).theme.mainTextColor()), - style: ButtonStyle( - fixedSize: MaterialStateProperty.all(Size(86, 50)), - backgroundColor: MaterialStateProperty.all(Provider.of(context).theme.defaultButtonColor()), - ), - onPressed: _sendMessage, - ))), - SizedBox( - width: 86, height: 40, - child: IconButton(icon: Icon(Icons.insert_invitation, size: 12, color: Provider.of(context).theme.mainTextColor()), onPressed: () => _modalSendInvitation(context)) - ),]) + Column(children: [ + SizedBox( + width: 100, + height: 50, + child: Padding( + padding: EdgeInsets.fromLTRB(2, 2, 2, 2), + child: ElevatedButton( + child: Icon(Icons.send, size: 24, color: Provider.of(context).theme.mainTextColor()), + style: ButtonStyle( + fixedSize: MaterialStateProperty.all(Size(86, 50)), + backgroundColor: MaterialStateProperty.all(Provider.of(context).theme.defaultButtonColor()), + ), + onPressed: _sendMessage, + ))), + SizedBox( + width: 86, + height: 40, + child: IconButton(icon: Icon(Icons.insert_invitation, size: 12, color: Provider.of(context).theme.mainTextColor()), onPressed: () => _modalSendInvitation(context))), + ]) ], ), ); @@ -165,10 +165,16 @@ class _MessageViewState extends State { SizedBox( height: 20, ), - ChangeNotifierProvider.value(value: Provider.of(ctx, listen: false), child: DropdownContacts(onChanged: (newVal) { - setState((){ this.selectedContact = newVal; }); - })), - SizedBox(height: 20,), + ChangeNotifierProvider.value( + value: Provider.of(ctx, listen: false), + child: DropdownContacts(onChanged: (newVal) { + setState(() { + this.selectedContact = newVal; + }); + })), + SizedBox( + height: 20, + ), ElevatedButton( child: Text(AppLocalizations.of(bcontext).inviteBtn, semanticsLabel: AppLocalizations.of(bcontext).inviteBtn), onPressed: () { diff --git a/lib/widgets/DropdownContacts.dart b/lib/widgets/DropdownContacts.dart index 9ea288e..5a8d80a 100644 --- a/lib/widgets/DropdownContacts.dart +++ b/lib/widgets/DropdownContacts.dart @@ -8,7 +8,9 @@ import '../model.dart'; // Displays nicknames to UI but uses handles as values // Pass an onChanged handler to access value class DropdownContacts extends StatefulWidget { - DropdownContacts({this.onChanged,}); + DropdownContacts({ + this.onChanged, + }); final Function(dynamic) onChanged; @override @@ -20,15 +22,18 @@ class _DropdownContactsState extends State { @override Widget build(BuildContext context) { - return DropdownButton(value: this.selected, items: Provider.of(context, listen: false).contactList.contacts.map>((ContactInfoState contact) { - return DropdownMenuItem(value: contact.onion, child: Text(contact.nickname??contact.onion)); - }).toList(), onChanged: (newVal) { - setState(() { - this.selected = newVal; - }); - if (widget.onChanged != null) { - widget.onChanged(newVal); - } - }); + return DropdownButton( + value: this.selected, + items: Provider.of(context, listen: false).contactList.contacts.map>((ContactInfoState contact) { + return DropdownMenuItem(value: contact.onion, child: Text(contact.nickname ?? contact.onion)); + }).toList(), + onChanged: (newVal) { + setState(() { + this.selected = newVal; + }); + if (widget.onChanged != null) { + widget.onChanged(newVal); + } + }); } } diff --git a/lib/widgets/invitationbubble.dart b/lib/widgets/invitationbubble.dart index 32fcc41..8f52d0b 100644 --- a/lib/widgets/invitationbubble.dart +++ b/lib/widgets/invitationbubble.dart @@ -43,27 +43,33 @@ class InvitationBubbleState extends State { senderDisplayStr = contact.nickname ?? contact.onion; } } - var wdgSender = Center(widthFactor:1, child: SelectableText(senderDisplayStr + '\u202F', - style: TextStyle(fontSize: 9.0, color: fromMe ? Provider.of(context).theme.messageFromMeTextColor() : Provider.of(context).theme.messageFromOtherTextColor()))); + var wdgSender = Center( + widthFactor: 1, + child: SelectableText(senderDisplayStr + '\u202F', + style: TextStyle(fontSize: 9.0, color: fromMe ? Provider.of(context).theme.messageFromMeTextColor() : Provider.of(context).theme.messageFromOtherTextColor()))); // todo: translations var messageStr = ""; if (fromMe) { //todo: get group name? - messageStr = "You sent an invitation for "+(isGroup ? "a group" : Provider.of(context).message ?? ""); + messageStr = "You sent an invitation for " + (isGroup ? "a group" : Provider.of(context).message ?? ""); } else { - messageStr = (isGroup ? "You have been invited to join "+(Provider.of(context).inviteNick??"") : "This is a contact suggestion for:") + "\n" + (Provider.of(context).inviteTarget ?? ""); + messageStr = (isGroup ? "You have been invited to join " + (Provider.of(context).inviteNick ?? "") : "This is a contact suggestion for:") + + "\n" + + (Provider.of(context).inviteTarget ?? ""); } - var wdgMessage = Center(widthFactor:1, child: SelectableText( - messageStr + '\u202F', - key: Key(myKey), - focusNode: _focus, - style: TextStyle( - color: fromMe ? Provider.of(context).theme.messageFromMeTextColor() : Provider.of(context).theme.messageFromOtherTextColor(), - ), - textAlign: TextAlign.left, - textWidthBasis: TextWidthBasis.longestLine, - )); + var wdgMessage = Center( + widthFactor: 1, + child: SelectableText( + messageStr + '\u202F', + key: Key(myKey), + focusNode: _focus, + style: TextStyle( + color: fromMe ? Provider.of(context).theme.messageFromMeTextColor() : Provider.of(context).theme.messageFromOtherTextColor(), + ), + textAlign: TextAlign.left, + textWidthBasis: TextWidthBasis.longestLine, + )); Widget wdgDecorations; if (fromMe) { @@ -72,15 +78,14 @@ class InvitationBubbleState extends State { child: Row( mainAxisSize: MainAxisSize.min, children: [ - Text(prettyDate, style: TextStyle( - fontSize: 9.0, - color: fromMe ? Provider.of(context).theme.messageFromMeTextColor() : Provider.of(context).theme.messageFromOtherTextColor() - ), textAlign: fromMe ? TextAlign.right : TextAlign.left), + Text(prettyDate, + style: TextStyle(fontSize: 9.0, color: fromMe ? Provider.of(context).theme.messageFromMeTextColor() : Provider.of(context).theme.messageFromOtherTextColor()), + textAlign: fromMe ? TextAlign.right : TextAlign.left), !fromMe ? SizedBox(width: 1, height: 1) : Provider.of(context).ackd - ? Icon(Icons.check_circle_outline, color: Provider.of(context).theme.messageFromMeTextColor(), size: 12) - : Icon(Icons.hourglass_bottom_outlined, color: Provider.of(context).theme.messageFromMeTextColor(), size: 12) + ? Icon(Icons.check_circle_outline, color: Provider.of(context).theme.messageFromMeTextColor(), size: 12) + : Icon(Icons.hourglass_bottom_outlined, color: Provider.of(context).theme.messageFromMeTextColor(), size: 12) ], )); } else if (isAccepted) { @@ -88,10 +93,12 @@ class InvitationBubbleState extends State { } else if (this.rejected) { wdgDecorations = Text("Rejected."); } else { - wdgDecorations = Center(widthFactor:1,child:Row(children: [ - Padding(padding: EdgeInsets.all(5), child: TextButton(child: Text("Reject"), onPressed: _btnReject)), - Padding(padding: EdgeInsets.all(5), child: TextButton(child: Text("Accept"), onPressed: _btnAccept)), - ])); + wdgDecorations = Center( + widthFactor: 1, + child: Row(children: [ + Padding(padding: EdgeInsets.all(5), child: TextButton(child: Text("Reject"), onPressed: _btnReject)), + Padding(padding: EdgeInsets.all(5), child: TextButton(child: Text("Accept"), onPressed: _btnAccept)), + ])); } return LayoutBuilder(builder: (context, constraints) { @@ -110,21 +117,26 @@ class InvitationBubbleState extends State { bottomRight: fromMe ? Radius.zero : Radius.circular(borderRadiousEh), ), ), - child: Center(widthFactor: 1.0,child:Padding( - padding: EdgeInsets.all(9.0), - child: Row(mainAxisSize: MainAxisSize.min, children: [Center(widthFactor: 1,child: Padding(padding:EdgeInsets.all(4), child:Icon(Icons.group_add, size: 32))), - Center(widthFactor: 1.0,child: Column( - crossAxisAlignment: fromMe ? CrossAxisAlignment.end : CrossAxisAlignment.start, - mainAxisAlignment: fromMe ? MainAxisAlignment.end : MainAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: fromMe ? [wdgMessage, wdgDecorations] : [wdgSender, wdgMessage, wdgDecorations])), - ]))))); + child: Center( + widthFactor: 1.0, + child: Padding( + padding: EdgeInsets.all(9.0), + child: Row(mainAxisSize: MainAxisSize.min, children: [ + Center(widthFactor: 1, child: Padding(padding: EdgeInsets.all(4), child: Icon(Icons.group_add, size: 32))), + Center( + widthFactor: 1.0, + child: Column( + crossAxisAlignment: fromMe ? CrossAxisAlignment.end : CrossAxisAlignment.start, + mainAxisAlignment: fromMe ? MainAxisAlignment.end : MainAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: fromMe ? [wdgMessage, wdgDecorations] : [wdgSender, wdgMessage, wdgDecorations])), + ]))))); }); } void _btnReject() { //todo: how should we track inline invite rejections? - setState(()=>this.rejected = true); + setState(() => this.rejected = true); } void _btnAccept() { diff --git a/lib/widgets/messageloadingbubble.dart b/lib/widgets/messageloadingbubble.dart index 237c770..f9605d1 100644 --- a/lib/widgets/messageloadingbubble.dart +++ b/lib/widgets/messageloadingbubble.dart @@ -13,6 +13,6 @@ class MessageLoadingBubble extends StatefulWidget { class MessageLoadingBubbleState extends State { @override Widget build(BuildContext context) { - return Center(child:Row(children:[SizedBox(width:40, height:100, child: Text(""))])); + return Center(child: Row(children: [SizedBox(width: 40, height: 100, child: Text(""))])); } } diff --git a/lib/widgets/messagerow.dart b/lib/widgets/messagerow.dart index 25385ee..385ad34 100644 --- a/lib/widgets/messagerow.dart +++ b/lib/widgets/messagerow.dart @@ -24,7 +24,8 @@ class _MessageRowState extends State { Widget build(BuildContext context) { var fromMe = Provider.of(context).senderOnion == Provider.of(context).onion; - Widget wdgBubble = Flexible(flex: 3, fit: FlexFit.loose, child: Provider.of(context).loaded == true ? widgetForOverlay(Provider.of(context).overlay) : MessageLoadingBubble()); + Widget wdgBubble = + Flexible(flex: 3, fit: FlexFit.loose, child: Provider.of(context).loaded == true ? widgetForOverlay(Provider.of(context).overlay) : MessageLoadingBubble()); Widget wdgIcons = Icon(Icons.delete_forever_outlined, color: Provider.of(context).theme.dropShadowColor()); Widget wdgSpacer = Expanded(child: SizedBox(width: 60, height: 10)); var widgetRow = []; @@ -38,12 +39,12 @@ class _MessageRowState extends State { } else { var contact = Provider.of(context); Widget wdgPortrait = GestureDetector( - onTap: _btnAdd, - child: ProfileImage( - diameter: 48.0, - imagePath: Provider.of(context).senderImage ?? contact.imagePath, - //maskOut: contact.status != "Authenticated", - border: contact.status == "Authenticated" ? Provider.of(context).theme.portraitOnlineBorderColor() : Provider.of(context).theme.portraitOfflineBorderColor())); + onTap: _btnAdd, + child: ProfileImage( + diameter: 48.0, + imagePath: Provider.of(context).senderImage ?? contact.imagePath, + //maskOut: contact.status != "Authenticated", + border: contact.status == "Authenticated" ? Provider.of(context).theme.portraitOnlineBorderColor() : Provider.of(context).theme.portraitOfflineBorderColor())); widgetRow = [ wdgPortrait, @@ -58,9 +59,11 @@ class _MessageRowState extends State { Widget widgetForOverlay(int o) { switch (o) { - case 1: return MessageBubble(); + case 1: + return MessageBubble(); case 100: - case 101: return InvitationBubble(); + case 101: + return InvitationBubble(); } return null; }