twonly-app/lib/src/components/best_friends_selector.dart
2025-02-07 19:52:14 +01:00

141 lines
4.3 KiB
Dart

import 'dart:collection';
import 'package:fixnum/fixnum.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:twonly/src/providers/messages_change_provider.dart';
import 'package:twonly/src/utils/misc.dart';
import 'package:twonly/src/components/flame.dart';
import 'package:twonly/src/components/headline.dart';
import 'package:twonly/src/components/initialsavatar.dart';
import 'package:twonly/src/model/contacts_model.dart';
class BestFriendsSelector extends StatelessWidget {
final List<Contact> users;
final Function(Int64, bool) updateStatus;
final HashSet<Int64> selectedUserIds;
final int maxTotalMediaCounter;
const BestFriendsSelector({
super.key,
required this.users,
required this.maxTotalMediaCounter,
required this.updateStatus,
required this.selectedUserIds,
});
@override
Widget build(BuildContext context) {
if (users.isEmpty) {
return Container();
}
return Column(
children: [
HeadLineComponent(context.lang.shareImageBestFriends),
Column(
spacing: 8,
children: List.generate(
(users.length + 1) ~/ 2,
(rowIndex) {
final firstUserIndex = rowIndex * 2;
final secondUserIndex = firstUserIndex + 1;
return Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Expanded(
child: UserCheckbox(
isChecked: selectedUserIds
.contains(users[firstUserIndex].userId),
user: users[firstUserIndex],
onChanged: updateStatus,
maxTotalMediaCounter: maxTotalMediaCounter,
),
),
(secondUserIndex < users.length)
? Expanded(
child: UserCheckbox(
isChecked: selectedUserIds
.contains(users[secondUserIndex].userId),
user: users[secondUserIndex],
onChanged: updateStatus,
maxTotalMediaCounter: maxTotalMediaCounter),
)
: Expanded(
child: Container(),
),
],
);
},
),
),
],
);
}
}
class UserCheckbox extends StatelessWidget {
final Contact user;
final Function(Int64, bool) onChanged;
final bool isChecked;
final int maxTotalMediaCounter;
const UserCheckbox({
super.key,
required this.user,
required this.maxTotalMediaCounter,
required this.onChanged,
required this.isChecked,
});
@override
Widget build(BuildContext context) {
int flameCounter = context
.watch<MessagesChangeProvider>()
.flamesCounter[user.userId.toInt()] ??
0;
return Container(
padding:
EdgeInsets.symmetric(horizontal: 3), // Padding inside the container
child: GestureDetector(
onTap: () {
onChanged(user.userId, !isChecked);
},
child: Container(
padding: EdgeInsets.symmetric(horizontal: 10, vertical: 0),
decoration: BoxDecoration(
border: Border.all(
color: Theme.of(context).colorScheme.outline,
width: 1.0,
),
borderRadius: BorderRadius.circular(8.0),
),
child: Row(
children: [
InitialsAvatar(
fontSize: 15,
displayName: user.displayName,
),
SizedBox(width: 8),
Text(
user.displayName.length > 10
? '${user.displayName.substring(0, 10)}...'
: user.displayName,
overflow: TextOverflow.ellipsis,
),
if (flameCounter > 0)
FlameCounterWidget(user, flameCounter, maxTotalMediaCounter),
Expanded(child: Container()),
Checkbox(
value: isChecked,
onChanged: (bool? value) {
onChanged(user.userId, value ?? false);
},
),
],
),
),
),
);
}
}