From b68bec9ebdcae243962f66a0a7a8ef21c80e9a4b Mon Sep 17 00:00:00 2001 From: lars Date: Fri, 10 Oct 2025 11:39:57 +0200 Subject: [PATCH] WIP: add option to vote on polls --- .../talk/getPoll/getPollState.dart | 6 +--- .../marianumcloud/talk/votePoll/votePoll.dart | 30 +++++++++++++++++++ .../talk/votePoll/votePollParams.dart | 14 +++++++++ .../talk/votePoll/votePollParams.g.dart | 19 ++++++++++++ .../pages/talk/components/chatBubble.dart | 11 +++---- 5 files changed, 70 insertions(+), 10 deletions(-) create mode 100644 lib/api/marianumcloud/talk/votePoll/votePoll.dart create mode 100644 lib/api/marianumcloud/talk/votePoll/votePollParams.dart create mode 100644 lib/api/marianumcloud/talk/votePoll/votePollParams.g.dart diff --git a/lib/api/marianumcloud/talk/getPoll/getPollState.dart b/lib/api/marianumcloud/talk/getPoll/getPollState.dart index e7950c8..503c1d0 100644 --- a/lib/api/marianumcloud/talk/getPoll/getPollState.dart +++ b/lib/api/marianumcloud/talk/getPoll/getPollState.dart @@ -1,5 +1,4 @@ import 'dart:convert'; -import 'dart:developer'; import 'package:http/http.dart' as http; @@ -12,10 +11,7 @@ class GetPollState extends TalkApi { GetPollState({required this.token, required this.pollId}) : super('v1/poll/$token/$pollId', null); @override - GetPollStateResponse assemble(String raw) { - log(raw); - return GetPollStateResponse.fromJson(jsonDecode(raw)['ocs']); - } + GetPollStateResponse assemble(String raw) => GetPollStateResponse.fromJson(jsonDecode(raw)['ocs']); @override Future request(Uri uri, Object? body, Map? headers) => http.get(uri, headers: headers); diff --git a/lib/api/marianumcloud/talk/votePoll/votePoll.dart b/lib/api/marianumcloud/talk/votePoll/votePoll.dart new file mode 100644 index 0000000..076b49f --- /dev/null +++ b/lib/api/marianumcloud/talk/votePoll/votePoll.dart @@ -0,0 +1,30 @@ +import 'dart:convert'; +import 'dart:developer'; + +import 'package:http/http.dart' as http; +import 'package:http/http.dart'; + +import '../getPoll/getPollStateResponse.dart'; +import '../talkApi.dart'; +import 'votePollParams.dart'; + +class VotePoll extends TalkApi { + String token; + int pollId; + VotePoll({required this.token, required this.pollId, required VotePollParams params}) : super('v1/poll/$token/$pollId', params); + + @override + GetPollStateResponse assemble(String raw) { + log(raw); + return GetPollStateResponse.fromJson(jsonDecode(raw)['ocs']); + } + + @override + Future? request(Uri uri, Object? body, Map? headers) { + if(body is VotePollParams) { + log(body.toJson().toString()); + return http.post(uri, headers: headers, body: body.toJson().toString()); + } + return null; + } +} diff --git a/lib/api/marianumcloud/talk/votePoll/votePollParams.dart b/lib/api/marianumcloud/talk/votePoll/votePollParams.dart new file mode 100644 index 0000000..c8a7bca --- /dev/null +++ b/lib/api/marianumcloud/talk/votePoll/votePollParams.dart @@ -0,0 +1,14 @@ +import 'package:json_annotation/json_annotation.dart'; + +import '../../../apiParams.dart'; + +part 'votePollParams.g.dart'; + +@JsonSerializable() +class VotePollParams extends ApiParams { + List optionIds; + + VotePollParams({required this.optionIds}); + factory VotePollParams.fromJson(Map json) => _$VotePollParamsFromJson(json); + Map toJson() => _$VotePollParamsToJson(this); +} \ No newline at end of file diff --git a/lib/api/marianumcloud/talk/votePoll/votePollParams.g.dart b/lib/api/marianumcloud/talk/votePoll/votePollParams.g.dart new file mode 100644 index 0000000..cb7d6f0 --- /dev/null +++ b/lib/api/marianumcloud/talk/votePoll/votePollParams.g.dart @@ -0,0 +1,19 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'votePollParams.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +VotePollParams _$VotePollParamsFromJson(Map json) => + VotePollParams( + optionIds: (json['optionIds'] as List) + .map((e) => (e as num).toInt()) + .toList(), + ); + +Map _$VotePollParamsToJson(VotePollParams instance) => + { + 'optionIds': instance.optionIds, + }; diff --git a/lib/view/pages/talk/components/chatBubble.dart b/lib/view/pages/talk/components/chatBubble.dart index 9d1dcf6..e45a5bf 100644 --- a/lib/view/pages/talk/components/chatBubble.dart +++ b/lib/view/pages/talk/components/chatBubble.dart @@ -1,5 +1,3 @@ -import 'dart:developer'; - import 'package:bubble/bubble.dart'; import 'package:emoji_picker_flutter/emoji_picker_flutter.dart' as emojis; import 'package:flowder/flowder.dart'; @@ -9,6 +7,8 @@ import 'package:flutter/services.dart'; import 'package:jiffy/jiffy.dart'; import 'package:open_filex/open_filex.dart'; import '../../../../api/marianumcloud/talk/getPoll/getPollState.dart'; +import '../../../../api/marianumcloud/talk/votePoll/votePoll.dart'; +import '../../../../api/marianumcloud/talk/votePoll/votePollParams.dart'; import '../../../../extensions/text.dart'; import 'package:provider/provider.dart'; @@ -303,8 +303,8 @@ class _ChatBubbleState extends State with SingleTickerProviderStateM onDoubleTap: showOptionsDialog, onTap: () { if(message.originalData?['object']?.type == RichObjectStringObjectType.talkPoll) { - log(message.originalData!['object']!.id); - var pollState = GetPollState(token: widget.bubbleData.token, pollId: int.parse(message.originalData!['object']!.id)).run(); + var pollId = int.parse(message.originalData!['object']!.id); + var pollState = GetPollState(token: widget.bubbleData.token, pollId: pollId).run(); List? ownVotes; showDialog(context: context, builder: (context) => AlertDialog( title: Text(message.originalData!['object']!.name, textScaler: TextScaler.linear(0.9)), @@ -323,9 +323,10 @@ class _ChatBubbleState extends State with SingleTickerProviderStateM ), actions: [ TextButton( - onPressed: () { + onPressed: () async { Navigator.of(context).pop(); if(ownVotes == null) return; + VotePoll(pollId: pollId, token: widget.bubbleData.token, params: VotePollParams(optionIds: ownVotes!)).run(); }, child: const Text('Stimme abgeben') ),