Compare commits
	
		
			2 Commits
		
	
	
		
			73c6a1febf
			...
			215ca705ac
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						
						
							
						
						215ca705ac
	
				 | 
					
					
						|||
| 
						
						
							
						
						03457af04a
	
				 | 
					
					
						
@@ -1,3 +1,4 @@
 | 
				
			|||||||
 | 
					import 'package:easy_localization/easy_localization.dart';
 | 
				
			||||||
import 'package:flutter/material.dart';
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
import 'package:gap/gap.dart';
 | 
					import 'package:gap/gap.dart';
 | 
				
			||||||
import 'package:go_router/go_router.dart';
 | 
					import 'package:go_router/go_router.dart';
 | 
				
			||||||
@@ -10,6 +11,7 @@ import 'package:material_symbols_icons/symbols.dart';
 | 
				
			|||||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
 | 
					import 'package:riverpod_annotation/riverpod_annotation.dart';
 | 
				
			||||||
import 'package:riverpod_paging_utils/riverpod_paging_utils.dart';
 | 
					import 'package:riverpod_paging_utils/riverpod_paging_utils.dart';
 | 
				
			||||||
import 'package:island/widgets/extended_refresh_indicator.dart';
 | 
					import 'package:island/widgets/extended_refresh_indicator.dart';
 | 
				
			||||||
 | 
					import 'package:styled_widget/styled_widget.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
part 'poll_list.g.dart';
 | 
					part 'poll_list.g.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -117,14 +119,14 @@ class CreatorPollListScreen extends HookConsumerWidget {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class _CreatorPollItem extends StatelessWidget {
 | 
					class _CreatorPollItem extends HookConsumerWidget {
 | 
				
			||||||
  final String pubName;
 | 
					  final String pubName;
 | 
				
			||||||
  const _CreatorPollItem({required this.pollWithStats, required this.pubName});
 | 
					  const _CreatorPollItem({required this.pollWithStats, required this.pubName});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  final SnPollWithStats pollWithStats;
 | 
					  final SnPollWithStats pollWithStats;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @override
 | 
					  @override
 | 
				
			||||||
  Widget build(BuildContext context) {
 | 
					  Widget build(BuildContext context, WidgetRef ref) {
 | 
				
			||||||
    final theme = Theme.of(context);
 | 
					    final theme = Theme.of(context);
 | 
				
			||||||
    final ended = pollWithStats.endedAt;
 | 
					    final ended = pollWithStats.endedAt;
 | 
				
			||||||
    final endedText =
 | 
					    final endedText =
 | 
				
			||||||
@@ -167,7 +169,7 @@ class _CreatorPollItem extends StatelessWidget {
 | 
				
			|||||||
                    children: [
 | 
					                    children: [
 | 
				
			||||||
                      const Icon(Symbols.edit),
 | 
					                      const Icon(Symbols.edit),
 | 
				
			||||||
                      const Gap(16),
 | 
					                      const Gap(16),
 | 
				
			||||||
                      Text('Edit'),
 | 
					                      Text('edit').tr(),
 | 
				
			||||||
                    ],
 | 
					                    ],
 | 
				
			||||||
                  ),
 | 
					                  ),
 | 
				
			||||||
                  onTap: () {
 | 
					                  onTap: () {
 | 
				
			||||||
@@ -177,6 +179,61 @@ class _CreatorPollItem extends StatelessWidget {
 | 
				
			|||||||
                    );
 | 
					                    );
 | 
				
			||||||
                  },
 | 
					                  },
 | 
				
			||||||
                ),
 | 
					                ),
 | 
				
			||||||
 | 
					                PopupMenuItem(
 | 
				
			||||||
 | 
					                  child: Row(
 | 
				
			||||||
 | 
					                    children: [
 | 
				
			||||||
 | 
					                      const Icon(Symbols.delete, color: Colors.red),
 | 
				
			||||||
 | 
					                      const Gap(16),
 | 
				
			||||||
 | 
					                      Text('delete').tr().textColor(Colors.red),
 | 
				
			||||||
 | 
					                    ],
 | 
				
			||||||
 | 
					                  ),
 | 
				
			||||||
 | 
					                  onTap: () async {
 | 
				
			||||||
 | 
					                    final confirmed = await showDialog<bool>(
 | 
				
			||||||
 | 
					                      context: context,
 | 
				
			||||||
 | 
					                      builder:
 | 
				
			||||||
 | 
					                          (context) => AlertDialog(
 | 
				
			||||||
 | 
					                            title: Text('Delete Poll'),
 | 
				
			||||||
 | 
					                            content: Text(
 | 
				
			||||||
 | 
					                              'Are you sure you want to delete this poll?',
 | 
				
			||||||
 | 
					                            ),
 | 
				
			||||||
 | 
					                            actions: [
 | 
				
			||||||
 | 
					                              TextButton(
 | 
				
			||||||
 | 
					                                onPressed:
 | 
				
			||||||
 | 
					                                    () => Navigator.of(context).pop(false),
 | 
				
			||||||
 | 
					                                child: Text('Cancel'),
 | 
				
			||||||
 | 
					                              ),
 | 
				
			||||||
 | 
					                              TextButton(
 | 
				
			||||||
 | 
					                                onPressed:
 | 
				
			||||||
 | 
					                                    () => Navigator.of(context).pop(true),
 | 
				
			||||||
 | 
					                                child: Text('Delete'),
 | 
				
			||||||
 | 
					                              ),
 | 
				
			||||||
 | 
					                            ],
 | 
				
			||||||
 | 
					                          ),
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                    if (confirmed == true) {
 | 
				
			||||||
 | 
					                      try {
 | 
				
			||||||
 | 
					                        final client = ref.read(apiClientProvider);
 | 
				
			||||||
 | 
					                        await client.delete(
 | 
				
			||||||
 | 
					                          '/sphere/polls/${pollWithStats.id}',
 | 
				
			||||||
 | 
					                        );
 | 
				
			||||||
 | 
					                        ref.invalidate(pollListNotifierProvider(pubName));
 | 
				
			||||||
 | 
					                        if (context.mounted) {
 | 
				
			||||||
 | 
					                          ScaffoldMessenger.of(context).showSnackBar(
 | 
				
			||||||
 | 
					                            SnackBar(
 | 
				
			||||||
 | 
					                              content: Text('Poll deleted successfully'),
 | 
				
			||||||
 | 
					                            ),
 | 
				
			||||||
 | 
					                          );
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                      } catch (e) {
 | 
				
			||||||
 | 
					                        if (context.mounted) {
 | 
				
			||||||
 | 
					                          ScaffoldMessenger.of(context).showSnackBar(
 | 
				
			||||||
 | 
					                            SnackBar(content: Text('Failed to delete poll')),
 | 
				
			||||||
 | 
					                          );
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                      }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                  },
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
              ],
 | 
					              ],
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
        onTap: () {
 | 
					        onTap: () {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,6 +10,7 @@ import 'package:island/pods/network.dart';
 | 
				
			|||||||
import 'package:island/widgets/alert.dart';
 | 
					import 'package:island/widgets/alert.dart';
 | 
				
			||||||
import 'package:island/models/poll.dart';
 | 
					import 'package:island/models/poll.dart';
 | 
				
			||||||
import 'package:island/widgets/app_scaffold.dart';
 | 
					import 'package:island/widgets/app_scaffold.dart';
 | 
				
			||||||
 | 
					import 'package:styled_widget/styled_widget.dart';
 | 
				
			||||||
import 'package:uuid/uuid.dart';
 | 
					import 'package:uuid/uuid.dart';
 | 
				
			||||||
import 'package:easy_localization/easy_localization.dart';
 | 
					import 'package:easy_localization/easy_localization.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -516,8 +517,7 @@ class PollEditorScreen extends ConsumerWidget {
 | 
				
			|||||||
                  if (model.questions.isEmpty)
 | 
					                  if (model.questions.isEmpty)
 | 
				
			||||||
                    _EmptyState(
 | 
					                    _EmptyState(
 | 
				
			||||||
                      title: 'pollNoQuestionsYet'.tr(),
 | 
					                      title: 'pollNoQuestionsYet'.tr(),
 | 
				
			||||||
                      subtitle:
 | 
					                      subtitle: 'pollNoQuestionsHint'.tr(),
 | 
				
			||||||
                          'pollNoQuestionsHint'.tr(),
 | 
					 | 
				
			||||||
                    )
 | 
					                    )
 | 
				
			||||||
                  else
 | 
					                  else
 | 
				
			||||||
                    ReorderableListView.builder(
 | 
					                    ReorderableListView.builder(
 | 
				
			||||||
@@ -579,24 +579,32 @@ class PollEditorScreen extends ConsumerWidget {
 | 
				
			|||||||
              ),
 | 
					              ),
 | 
				
			||||||
            ),
 | 
					            ),
 | 
				
			||||||
          ),
 | 
					          ),
 | 
				
			||||||
          Row(
 | 
					          Material(
 | 
				
			||||||
            children: [
 | 
					            elevation: 2,
 | 
				
			||||||
              OutlinedButton.icon(
 | 
					            color: Theme.of(context).colorScheme.surfaceContainer,
 | 
				
			||||||
                onPressed: () {
 | 
					            child: Row(
 | 
				
			||||||
                  Navigator.of(context).maybePop();
 | 
					              children: [
 | 
				
			||||||
                },
 | 
					                OutlinedButton.icon(
 | 
				
			||||||
                icon: const Icon(Icons.close),
 | 
					                  onPressed: () {
 | 
				
			||||||
                label: Text('cancel'.tr()),
 | 
					                    Navigator.of(context).maybePop();
 | 
				
			||||||
              ),
 | 
					                  },
 | 
				
			||||||
              const Spacer(),
 | 
					                  icon: const Icon(Icons.close),
 | 
				
			||||||
              FilledButton.icon(
 | 
					                  label: Text('cancel'.tr()),
 | 
				
			||||||
                onPressed: () {
 | 
					                ),
 | 
				
			||||||
                  _submitPoll(context, ref);
 | 
					                const Spacer(),
 | 
				
			||||||
                },
 | 
					                FilledButton.icon(
 | 
				
			||||||
                icon: const Icon(Icons.cloud_upload_outlined),
 | 
					                  onPressed: () {
 | 
				
			||||||
                label: Text(model.id == null ? 'create'.tr() : 'update'.tr()),
 | 
					                    _submitPoll(context, ref);
 | 
				
			||||||
              ),
 | 
					                  },
 | 
				
			||||||
            ],
 | 
					                  icon: const Icon(Icons.cloud_upload_outlined),
 | 
				
			||||||
 | 
					                  label: Text(model.id == null ? 'create'.tr() : 'update'.tr()),
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
 | 
					              ],
 | 
				
			||||||
 | 
					            ).padding(
 | 
				
			||||||
 | 
					              horizontal: 24,
 | 
				
			||||||
 | 
					              top: 16,
 | 
				
			||||||
 | 
					              bottom: MediaQuery.of(context).padding.bottom + 16,
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
          ),
 | 
					          ),
 | 
				
			||||||
        ],
 | 
					        ],
 | 
				
			||||||
      ),
 | 
					      ),
 | 
				
			||||||
@@ -1049,7 +1057,9 @@ class _TextAnswerPreview extends StatelessWidget {
 | 
				
			|||||||
      maxLines: long ? 4 : 1,
 | 
					      maxLines: long ? 4 : 1,
 | 
				
			||||||
      decoration: InputDecoration(
 | 
					      decoration: InputDecoration(
 | 
				
			||||||
        labelText:
 | 
					        labelText:
 | 
				
			||||||
            long ? 'pollLongTextAnswerPreview'.tr() : 'pollShortTextAnswerPreview'.tr(),
 | 
					            long
 | 
				
			||||||
 | 
					                ? 'pollLongTextAnswerPreview'.tr()
 | 
				
			||||||
 | 
					                : 'pollShortTextAnswerPreview'.tr(),
 | 
				
			||||||
        border: const OutlineInputBorder(
 | 
					        border: const OutlineInputBorder(
 | 
				
			||||||
          borderRadius: BorderRadius.all(Radius.circular(16)),
 | 
					          borderRadius: BorderRadius.all(Radius.circular(16)),
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
@@ -1083,9 +1093,15 @@ class _EmptyState extends StatelessWidget {
 | 
				
			|||||||
            child: Column(
 | 
					            child: Column(
 | 
				
			||||||
              crossAxisAlignment: CrossAxisAlignment.start,
 | 
					              crossAxisAlignment: CrossAxisAlignment.start,
 | 
				
			||||||
              children: [
 | 
					              children: [
 | 
				
			||||||
                Text('pollNoQuestionsYet'.tr(), style: Theme.of(context).textTheme.titleMedium),
 | 
					                Text(
 | 
				
			||||||
 | 
					                  'pollNoQuestionsYet'.tr(),
 | 
				
			||||||
 | 
					                  style: Theme.of(context).textTheme.titleMedium,
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
                const Gap(4),
 | 
					                const Gap(4),
 | 
				
			||||||
                Text('pollNoQuestionsHint'.tr(), style: Theme.of(context).textTheme.bodyMedium),
 | 
					                Text(
 | 
				
			||||||
 | 
					                  'pollNoQuestionsHint'.tr(),
 | 
				
			||||||
 | 
					                  style: Theme.of(context).textTheme.bodyMedium,
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
              ],
 | 
					              ],
 | 
				
			||||||
            ),
 | 
					            ),
 | 
				
			||||||
          ),
 | 
					          ),
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user