Poll editor

This commit is contained in:
2025-02-12 23:56:45 +08:00
parent d612097bb1
commit 4937dee182
16 changed files with 1187 additions and 29 deletions

View File

@ -16,7 +16,6 @@ import 'package:surface/providers/sn_network.dart';
import 'package:surface/providers/userinfo.dart';
import 'package:surface/types/post.dart';
import 'package:surface/widgets/account/account_image.dart';
import 'package:surface/widgets/app_bar_leading.dart';
import 'package:surface/widgets/dialog.dart';
import 'package:surface/widgets/loading_indicator.dart';
import 'package:surface/widgets/navigation/app_scaffold.dart';

View File

@ -6,7 +6,6 @@ import 'package:gap/gap.dart';
import 'package:go_router/go_router.dart';
import 'package:material_symbols_icons/symbols.dart';
import 'package:provider/provider.dart';
import 'package:responsive_framework/responsive_framework.dart';
import 'package:styled_widget/styled_widget.dart';
import 'package:surface/providers/post.dart';
import 'package:surface/providers/userinfo.dart';
@ -17,7 +16,6 @@ import 'package:surface/widgets/navigation/app_background.dart';
import 'package:surface/widgets/navigation/app_scaffold.dart';
import 'package:surface/widgets/post/post_comment_list.dart';
import 'package:surface/widgets/post/post_item.dart';
import 'package:surface/widgets/post/post_mini_editor.dart';
class PostDetailScreen extends StatefulWidget {
final String slug;

View File

@ -18,8 +18,10 @@ import 'package:surface/providers/config.dart';
import 'package:surface/providers/sn_attachment.dart';
import 'package:surface/providers/sn_network.dart';
import 'package:surface/types/attachment.dart';
import 'package:surface/types/poll.dart';
import 'package:surface/types/post.dart';
import 'package:surface/widgets/account/account_image.dart';
import 'package:surface/widgets/attachment/attachment_input.dart';
import 'package:surface/widgets/attachment/attachment_item.dart';
import 'package:surface/widgets/attachment/pending_attachment_alt.dart';
import 'package:surface/widgets/attachment/pending_attachment_boost.dart';
@ -30,10 +32,9 @@ import 'package:surface/widgets/post/post_media_pending_list.dart';
import 'package:surface/widgets/post/post_meta_editor.dart';
import 'package:surface/widgets/dialog.dart';
import 'package:provider/provider.dart';
import 'package:surface/widgets/post/post_poll.dart';
import 'package:uuid/uuid.dart';
import '../../widgets/attachment/attachment_input.dart';
class PostEditorExtra {
final String? text;
final String? title;
@ -140,6 +141,23 @@ class _PostEditorScreenState extends State<PostEditorScreen> {
);
}
void _showPollEditorDialog() async {
final poll = await showDialog<dynamic>(
context: context,
builder: (context) => PollEditorDialog(
poll: _writeController.poll,
),
);
if (poll == null) return;
if (!mounted) return;
if (poll == false) {
_writeController.setPoll(null);
} else {
_writeController.setPoll(poll);
}
}
@override
void dispose() {
_writeController.dispose();
@ -238,7 +256,7 @@ class _PostEditorScreenState extends State<PostEditorScreen> {
children: [
SingleChildScrollView(
padding: EdgeInsets.only(bottom: 160),
child: switch (_writeController.mode) {
child: StyledWidget(switch (_writeController.mode) {
'stories' => _PostStoryEditor(
controller: _writeController,
onTapPublisher: _showPublisherPopup,
@ -256,7 +274,8 @@ class _PostEditorScreenState extends State<PostEditorScreen> {
onTapPublisher: _showPublisherPopup,
),
_ => const Placeholder(),
},
})
.padding(top: 8),
),
if (_writeController.attachments.isNotEmpty || _writeController.thumbnail != null)
Positioned(
@ -304,7 +323,6 @@ class _PostEditorScreenState extends State<PostEditorScreen> {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
LoadingIndicator(isActive: _isLoading),
if (_writeController.isBusy && _writeController.progress != null)
TweenAnimationBuilder<double>(
tween: Tween(begin: 0, end: _writeController.progress),
@ -313,6 +331,8 @@ class _PostEditorScreenState extends State<PostEditorScreen> {
)
else if (_writeController.isBusy)
const LinearProgressIndicator(value: null, minHeight: 2),
LoadingIndicator(isActive: _isLoading),
const Gap(4),
Container(
child: _writeController.temporaryRestored
? Container(
@ -360,6 +380,18 @@ class _PostEditorScreenState extends State<PostEditorScreen> {
});
},
),
if (_writeController.mode == 'stories')
IconButton(
icon: Icon(Symbols.poll, color: Theme.of(context).colorScheme.primary),
style: ButtonStyle(
backgroundColor: _writeController.poll == null
? null
: WidgetStatePropertyAll(Theme.of(context).colorScheme.surfaceContainer),
),
onPressed: () {
_showPollEditorDialog();
},
),
],
),
),
@ -382,7 +414,6 @@ class _PostEditorScreenState extends State<PostEditorScreen> {
],
).padding(
bottom: MediaQuery.of(context).padding.bottom + 8,
top: 4,
),
),
],

View File

@ -1,7 +1,6 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:gap/gap.dart';
import 'package:go_router/go_router.dart';
import 'package:material_symbols_icons/symbols.dart';
import 'package:provider/provider.dart';
import 'package:styled_widget/styled_widget.dart';
@ -261,7 +260,7 @@ class _RealmJoinPopupState extends State<_RealmJoinPopup> {
itemBuilder: (context, index) {
final channel = _channels![index];
return CheckboxListTile(
value: _planJoinChannels.contains(channel.alias) ?? false,
value: _planJoinChannels.contains(channel.alias),
title: Text(channel.name),
subtitle: Text(
channel.description,