cwtch-ui/lib/widgets/contactrow.dart

143 lines
6.6 KiB
Dart
Raw Normal View History

2021-08-16 22:04:05 +00:00
import 'dart:io';
import 'package:cwtch/views/contactsview.dart';
2021-06-24 23:10:45 +00:00
import 'package:flutter/material.dart';
import 'package:flutter/painting.dart';
import 'package:cwtch/views/messageview.dart';
import 'package:cwtch/widgets/profileimage.dart';
import 'package:provider/provider.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import '../main.dart';
import '../model.dart';
import '../settings.dart';
import 'package:intl/intl.dart';
class ContactRow extends StatefulWidget {
@override
_ContactRowState createState() => _ContactRowState();
}
class _ContactRowState extends State<ContactRow> {
@override
Widget build(BuildContext context) {
var contact = Provider.of<ContactInfoState>(context);
return Card(
clipBehavior: Clip.antiAlias,
color: Provider.of<AppState>(context).selectedConversation == contact.identifier ? Provider.of<Settings>(context).theme.backgroundHilightElementColor : null,
2021-06-24 23:10:45 +00:00
borderOnForeground: false,
margin: EdgeInsets.all(0.0),
2021-06-24 23:10:45 +00:00
child: InkWell(
child: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
Padding(
padding: const EdgeInsets.all(6.0), //border size
2021-06-24 23:10:45 +00:00
child: ProfileImage(
badgeCount: contact.unreadMessages,
badgeColor: Provider.of<Settings>(context).theme.portraitContactBadgeColor,
badgeTextColor: Provider.of<Settings>(context).theme.portraitContactBadgeTextColor,
2021-06-24 23:10:45 +00:00
diameter: 64.0,
imagePath: contact.imagePath,
maskOut: !contact.isOnline(),
2021-06-30 20:59:52 +00:00
border: contact.isOnline()
? Provider.of<Settings>(context).theme.portraitOnlineBorderColor
2021-06-30 20:59:52 +00:00
: contact.isBlocked
? Provider.of<Settings>(context).theme.portraitBlockedBorderColor
: Provider.of<Settings>(context).theme.portraitOfflineBorderColor),
2021-06-24 23:10:45 +00:00
),
Expanded(
child: Padding(
padding: EdgeInsets.all(10.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
contact.nickname, //(contact.isInvitation ? "invite " : "non-invite ") + (contact.isBlocked ? "blokt" : "nonblokt"),//
2021-06-30 20:59:52 +00:00
style: TextStyle(
fontSize: Provider.of<Settings>(context).theme.contactOnionTextSize(),
color: contact.isBlocked
? Provider.of<Settings>(context).theme.portraitBlockedTextColor
: Provider.of<Settings>(context).theme.mainTextColor), //Provider.of<FlwtchState>(context).biggerFont,
2021-06-24 23:10:45 +00:00
softWrap: true,
overflow: TextOverflow.visible,
),
Visibility(
visible: contact.isGroup && contact.status == "Authenticated",
child: LinearProgressIndicator(
color: Provider.of<Settings>(context).theme.defaultButtonActiveColor,
)),
Visibility(
visible: !Provider.of<Settings>(context).streamerMode,
child: Text(contact.onion,
style: TextStyle(color: contact.isBlocked ? Provider.of<Settings>(context).theme.portraitBlockedTextColor : Provider.of<Settings>(context).theme.mainTextColor)),
)
],
2021-06-24 23:10:45 +00:00
))),
Padding(
padding: const EdgeInsets.all(5.0),
child: contact.isInvitation == true
? Wrap(direction: Axis.vertical, children: <Widget>[
IconButton(
padding: EdgeInsets.zero,
iconSize: 16,
2021-06-30 20:59:52 +00:00
icon: Icon(
Icons.favorite,
color: Provider.of<Settings>(context).theme.mainTextColor,
2021-06-30 20:59:52 +00:00
),
tooltip: AppLocalizations.of(context)!.tooltipAcceptContactRequest,
2021-06-24 23:10:45 +00:00
onPressed: _btnApprove,
),
IconButton(
padding: EdgeInsets.zero,
iconSize: 16,
icon: Icon(Icons.delete, color: Provider.of<Settings>(context).theme.mainTextColor),
tooltip: AppLocalizations.of(context)!.tooltipRejectContactRequest,
2021-06-24 23:10:45 +00:00
onPressed: _btnReject,
)
])
: (contact.isBlocked != null && contact.isBlocked
? IconButton(
padding: EdgeInsets.zero,
iconSize: 16,
icon: Icon(Icons.block, color: Provider.of<Settings>(context).theme.mainTextColor),
2021-06-24 23:10:45 +00:00
onPressed: () {},
)
: Text(dateToNiceString(contact.lastMessageTime))),
),
]),
onTap: () {
2021-11-18 23:44:54 +00:00
selectConversation(context, contact.identifier);
2021-06-24 23:10:45 +00:00
},
));
}
void _btnApprove() {
// Update the UI
Provider.of<ContactInfoState>(context, listen: false).authorization = ContactAuthorization.approved;
2021-06-24 23:10:45 +00:00
Provider.of<FlwtchState>(context, listen: false)
.cwtch
2021-11-18 23:44:54 +00:00
.AcceptContact(Provider.of<ContactInfoState>(context, listen: false).profileOnion, Provider.of<ContactInfoState>(context, listen: false).identifier);
2021-06-24 23:10:45 +00:00
}
void _btnReject() {
ContactInfoState contact = Provider.of<ContactInfoState>(context, listen: false);
if (contact.isGroup == true) {
2021-12-03 19:28:10 +00:00
// FIXME This flow is incrorect. Groups never just show up on the contact list anymore
2021-06-24 23:10:45 +00:00
Provider.of<ProfileInfoState>(context, listen: false).removeContact(contact.onion);
} else {
2021-11-18 23:44:54 +00:00
Provider.of<FlwtchState>(context, listen: false).cwtch.BlockContact(Provider.of<ContactInfoState>(context, listen: false).profileOnion, contact.identifier);
2021-06-24 23:10:45 +00:00
}
}
String dateToNiceString(DateTime date) {
if (date.millisecondsSinceEpoch == 0) {
return AppLocalizations.of(context)!.dateNever;
}
// If the last message was over a day ago, just state the date
if (DateTime.now().difference(date).inDays > 1) {
2021-08-16 22:04:05 +00:00
return DateFormat.yMd(Platform.localeName).format(date.toLocal());
2021-06-24 23:10:45 +00:00
}
// Otherwise just state the time.
2021-08-16 22:04:05 +00:00
return DateFormat.Hm(Platform.localeName).format(date.toLocal());
2021-06-24 23:10:45 +00:00
}
}