mirror of
https://github.com/twonlyapp/twonly-app.git
synced 2026-01-16 02:48:41 +00:00
141 lines
4.3 KiB
Dart
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);
|
|
},
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|