fix percentage showing

This commit is contained in:
OfficialDakari 2025-10-16 18:08:01 +05:00
parent 7bac9f8a85
commit 314ab88551
72 changed files with 209 additions and 48 deletions

View File

@ -650,7 +650,7 @@ code + .copy-button {
<script type="text/javascript">
function configurationCacheProblems() { return (
// begin-report-data
{"diagnostics":[{"problem":[{"text":"Executing Gradle on JVM versions 16 and lower has been deprecated."}],"severity":"WARNING","problemDetails":[{"text":"This will fail with an error in Gradle 9.0."}],"contextualLabel":"Executing Gradle on JVM versions 16 and lower has been deprecated.","documentationLink":"https://docs.gradle.org/8.13/userguide/upgrading_version_8.html#minimum_daemon_jvm_version","problemId":[{"name":"deprecation","displayName":"Deprecation"},{"name":"executing-gradle-on-jvm-versions-and-lower","displayName":"Executing Gradle on JVM versions 16 and lower has been deprecated."}],"solutions":[[{"text":"Use JVM 17 or greater to execute Gradle. Projects can continue to use older JVM versions via toolchains."}]]}],"problemsReport":{"totalProblemCount":1,"requestedTasks":"","documentationLink":"https://docs.gradle.org/8.13/userguide/reporting_problems.html","documentationLinkCaption":"Problem report","summaries":[]}}
{"diagnostics":[{"problem":[{"text":"Executing Gradle on JVM versions 16 and lower has been deprecated."}],"severity":"WARNING","problemDetails":[{"text":"This will fail with an error in Gradle 9.0."}],"contextualLabel":"Executing Gradle on JVM versions 16 and lower has been deprecated.","documentationLink":"https://docs.gradle.org/8.13/userguide/upgrading_version_8.html#minimum_daemon_jvm_version","problemId":[{"name":"deprecation","displayName":"Deprecation"},{"name":"executing-gradle-on-jvm-versions-and-lower","displayName":"Executing Gradle on JVM versions 16 and lower has been deprecated."}],"solutions":[[{"text":"Use JVM 17 or greater to execute Gradle. Projects can continue to use older JVM versions via toolchains."}]]},{"problem":[{"text":"No variants exist that would match the request"}],"severity":"ERROR","contextualLabel":"Dependency requires at least JVM runtime version 11. This build uses a Java 8 JVM.","documentationLink":"https://docs.gradle.org/8.13/userguide/variant_model.html#sec:variant-select-errors","problemId":[{"name":"dependency-variant-resolution","displayName":"Variant resolution"},{"name":"no-compatible-variants","displayName":"No variants exist that would match the request"}]}],"problemsReport":{"totalProblemCount":2,"requestedTasks":"","documentationLink":"https://docs.gradle.org/8.13/userguide/reporting_problems.html","documentationLinkCaption":"Problem report","summaries":[]}}
// end-report-data
);}
</script>

View File

@ -1 +1 @@
[{"family":"MaterialIcons","fonts":[{"asset":"fonts/MaterialIcons-Regular.otf"}]},{"family":"packages/cupertino_icons/CupertinoIcons","fonts":[{"asset":"packages/cupertino_icons/assets/CupertinoIcons.ttf"}]},{"family":"packages/material/Material","fonts":[{"asset":"packages/material/lib/fonts/material.ttf"}]}]
[{"family":"MaterialIcons","fonts":[{"asset":"fonts/MaterialIcons-Regular.otf"}]},{"family":"packages/material/Material","fonts":[{"asset":"packages/material/lib/fonts/material.ttf"}]},{"family":"packages/cupertino_icons/CupertinoIcons","fonts":[{"asset":"packages/cupertino_icons/assets/CupertinoIcons.ttf"}]}]

View File

@ -223,6 +223,12 @@ abstract class L10n {
/// **'Resume'**
String get resume;
/// No description provided for @endPoll.
///
/// In en, this message translates to:
/// **'End poll'**
String get endPoll;
/// No description provided for @anonymousPoll.
///
/// In en, this message translates to:

View File

@ -24,6 +24,9 @@ class L10nAr extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nBe extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nBn extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nBo extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nCa extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nCs extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nDe extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nEl extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nEn extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nEo extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nEs extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nEt extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nEu extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nFa extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nFi extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nFil extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nFr extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nGa extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nGl extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nHe extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nHi extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nHr extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nHu extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nIa extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nId extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nIe extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nIt extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nJa extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nKa extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nKo extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nLt extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nLv extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nNb extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nNl extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nPl extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nPt extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nRo extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nRu extends L10n {
@override
String get resume => 'Продолжить';
@override
String get endPoll => 'Завершить опрос';
@override
String get anonymousPoll => 'Анонимный';

View File

@ -24,6 +24,9 @@ class L10nSk extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nSl extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nSr extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nSv extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nTa extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nTe extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nTh extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nTr extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nUk extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nVi extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -24,6 +24,9 @@ class L10nZh extends L10n {
@override
String get resume => 'Resume';
@override
String get endPoll => 'End poll';
@override
String get anonymousPoll => 'Anonymous';

View File

@ -1,5 +1,6 @@
import 'package:extera_next/generated/l10n/l10n.dart';
import 'package:extera_next/utils/poll_events.dart';
import 'package:extera_next/widgets/matrix.dart';
import 'package:flutter/material.dart';
import 'package:matrix/matrix.dart';
@ -29,6 +30,7 @@ class PollWidgetState extends State<PollWidget> {
Map<String, int>? pollResults;
bool hasVoted = false;
bool isLoading = false;
bool hasEnded = false;
@override
void initState() {
@ -38,8 +40,7 @@ class PollWidgetState extends State<PollWidget> {
void _loadPollData() {
final event = widget.event;
final content =
event.content[PollEvents.PollStart] as Map<String, dynamic>;
final content = event.content[PollEvents.PollStart] as Map<String, dynamic>;
// Check if user has already voted
_checkExistingVote();
@ -51,47 +52,49 @@ class PollWidgetState extends State<PollWidget> {
}
}
void _checkExistingVote() {
void _checkExistingVote() async {
final room = widget.event.room;
final currentUserId = room.client.userID;
final rel = await Matrix.of(context)
.client
.getRelatingEventsWithRelTypeAndEventType(room.id, widget.event.eventId,
"m.reference", "org.matrix.msc3381.poll.response");
// Find existing poll response events from current user
final responses = widget.timeline!.events.where((e) {
return e.type == 'org.matrix.msc3381.poll.response' &&
e.senderId == currentUserId &&
e.relationshipEventId == widget.event.eventId;
}).toList();
// Get all poll response events for this poll
final responses = rel.chunk;
if (responses.isNotEmpty) {
// Use the latest response
final latestResponse = responses.last;
final responseContent = latestResponse
.content['org.matrix.msc3381.poll.response'] as Map<String, dynamic>;
if (responseContent != null) {
final List<dynamic> answers = responseContent['answers'];
setState(() {
selectedAnswers = answers.cast<String>();
originalVote = List.from(answers.cast<String>()); // Store original vote
hasVoted = true;
});
for (final response in responses) {
final responseContent =
response.content['org.matrix.msc3381.poll.response']
as Map<String, dynamic>;
if (responseContent != null && response.senderId == currentUserId) {
final List<dynamic> answers = responseContent['answers'];
setState(() {
selectedAnswers = answers.cast<String>();
originalVote =
List.from(answers.cast<String>()); // Store original vote
hasVoted = true;
});
}
}
}
}
void _calculateResults() {
void _calculateResults() async {
final room = widget.event.room;
final pollEventId = widget.event.eventId;
final results = <String, int>{};
final rel = await Matrix.of(context)
.client
.getRelatingEventsWithRelTypeAndEventType(room.id, pollEventId,
"m.reference", "org.matrix.msc3381.poll.response");
// Get all poll response events for this poll
final responses = widget.timeline!.events.where((e) {
return e.type == 'org.matrix.msc3381.poll.response' &&
e.relationshipEventId == pollEventId;
}).toList();
final responses = rel.chunk;
// Count votes for each answer
for (final response in responses) {
@ -121,18 +124,15 @@ class PollWidgetState extends State<PollWidget> {
final room = widget.event.room;
// Send poll response event
await room.sendEvent(
{
'm.relates_to': {
'rel_type': 'm.reference',
'event_id': widget.event.eventId,
},
'org.matrix.msc3381.poll.response': {
'answers': answers,
},
await room.sendEvent({
'm.relates_to': {
'rel_type': 'm.reference',
'event_id': widget.event.eventId,
},
type: 'org.matrix.msc3381.poll.response'
);
'org.matrix.msc3381.poll.response': {
'answers': answers,
},
}, type: 'org.matrix.msc3381.poll.response');
setState(() {
selectedAnswers = answers;
@ -206,30 +206,35 @@ class PollWidgetState extends State<PollWidget> {
final isDisclosed = kind == 'org.matrix.msc3381.disclosed';
final isEnded = _isPollEnded();
return isDisclosed || isEnded || hasVoted;
return isDisclosed ? (isEnded || hasVoted) : isEnded;
}
double _getAnswerPercentage(String answerId) {
if (pollResults == null || pollResults!.isEmpty) return 0.0;
final totalVotes = pollResults!.values.reduce((a, b) => a + b);
if (totalVotes == 0) return 0.0;
return pollResults![answerId]?.toDouble() ?? 0 / totalVotes.toDouble();
// if (_shouldShowResults()) {
// Logs().w("Get answer percentage for $answerId");
// Logs().w(pollResults.toString());
// Logs().w("${pollResults![answerId]?.toDouble() ?? 0} / $totalVotes");
// }
return (pollResults![answerId]?.toDouble() ?? 0) / totalVotes.toDouble();
}
// Check if the current selection is different from the original vote
bool _hasSelectionChanged() {
if (selectedAnswers.length != originalVote.length) return true;
// Sort both lists to compare regardless of order
final sortedSelected = List.from(selectedAnswers)..sort();
final sortedOriginal = List.from(originalVote)..sort();
for (int i = 0; i < sortedSelected.length; i++) {
if (sortedSelected[i] != sortedOriginal[i]) return true;
}
return false;
}
@ -364,7 +369,9 @@ class PollWidgetState extends State<PollWidget> {
height: 16,
child: CircularProgressIndicator(strokeWidth: 2),
)
: Text(hasVoted ? L10n.of(context).changeVote : L10n.of(context).vote),
: Text(hasVoted
? L10n.of(context).changeVote
: L10n.of(context).vote),
),
const Spacer(),
@ -386,7 +393,8 @@ class PollWidgetState extends State<PollWidget> {
Padding(
padding: const EdgeInsets.only(top: 8),
child: Text(
L10n.of(context).choicesSelected(selectedAnswers.length, maxSelections),
L10n.of(context)
.choicesSelected(selectedAnswers.length, maxSelections),
style: TextStyle(
fontSize: widget.fontSize - 2,
color: widget.color.withOpacity(0.6),
@ -397,4 +405,4 @@ class PollWidgetState extends State<PollWidget> {
),
);
}
}
}