wip polls

This commit is contained in:
Henry Hiles 2026-01-11 13:41:05 -05:00
commit 7d9d03deb1
No known key found for this signature in database
6 changed files with 195 additions and 14 deletions

View file

@ -3,11 +3,13 @@ import "package:flutter_chat_core/flutter_chat_core.dart";
import "package:flutter_chat_ui/flutter_chat_ui.dart";
import "package:flutter_hooks/flutter_hooks.dart";
import "package:flutter_link_previewer/flutter_link_previewer.dart";
import "package:flutter_polls/flutter_polls.dart";
import "package:flyer_chat_file_message/flyer_chat_file_message.dart";
import "package:flyer_chat_image_message/flyer_chat_image_message.dart";
import "package:flyer_chat_system_message/flyer_chat_system_message.dart";
import "package:flyer_chat_text_message/flyer_chat_text_message.dart";
import "package:hooks_riverpod/hooks_riverpod.dart";
import "package:matrix/matrix.dart";
import "package:nexus/controllers/selected_room_controller.dart";
import "package:nexus/controllers/room_chat_controller.dart";
import "package:nexus/helpers/extensions/better_when.dart";
@ -236,6 +238,108 @@ class RoomChat extends HookConsumerWidget {
replyToMessage.value = null,
room: room.roomData,
),
customMessageBuilder:
(
context,
message,
index, {
required bool isSentByMe,
MessageGroupStatus? groupStatus,
}) {
final poll =
message.metadata?["poll"]
as PollStartContent;
final responses =
(message.metadata?["responses"]
as Map<
String,
Set<String>
>)
.values
.expand((set) => set)
.fold(<String, int>{}, (
acc,
value,
) {
acc[value] =
(acc[value] ?? 0) + 1;
return acc;
});
return Container(
decoration: BoxDecoration(
border: Border.all(
color: theme
.colorScheme
.primaryContainer,
width: 4,
),
borderRadius:
BorderRadius.circular(12),
),
padding: EdgeInsets.all(8),
width: 500,
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
TopWidget(
message,
headers: room
.roomData
.client
.headers,
groupStatus: groupStatus,
),
FlutterPolls(
votedCheckmark: const Icon(
Icons
.check_circle_outline_rounded,
size: 16,
),
pollId: message.id,
onVoted:
(
pollOption,
newTotalVotes,
) async {
return true;
},
pollOptionsSplashColor: theme
.colorScheme
.primaryContainer,
voteInProgressColor: theme
.colorScheme
.primaryContainer,
leadingVotedProgessColor:
theme
.colorScheme
.primaryContainer,
votedBackgroundColor: theme
.colorScheme
.surfaceContainer,
pollTitle: Text(
poll.question.mText,
),
pollOptions: poll.answers
.map(
(option) => PollOption(
title: Text(
option.mText,
),
votes:
responses[option
.id] ??
0,
),
)
.toList(),
),
],
),
);
},
textMessageBuilder:
(
context,