125 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'package:easy_localization/easy_localization.dart';
 | |
| import 'package:flutter/material.dart';
 | |
| import 'package:flutter_hooks/flutter_hooks.dart';
 | |
| import 'package:hooks_riverpod/hooks_riverpod.dart';
 | |
| import 'package:island/models/post.dart';
 | |
| import 'package:island/pods/network.dart';
 | |
| import 'package:island/widgets/alert.dart';
 | |
| import 'package:island/widgets/content/sheet.dart';
 | |
| import 'package:material_symbols_icons/symbols.dart';
 | |
| import 'package:styled_widget/styled_widget.dart';
 | |
| 
 | |
| class PostPinSheet extends HookConsumerWidget {
 | |
|   final SnPost post;
 | |
|   const PostPinSheet({super.key, required this.post});
 | |
| 
 | |
|   @override
 | |
|   Widget build(BuildContext context, WidgetRef ref) {
 | |
|     final mode = useState(0);
 | |
| 
 | |
|     Future<void> pinPost() async {
 | |
|       try {
 | |
|         showLoadingModal(context);
 | |
|         final client = ref.watch(apiClientProvider);
 | |
|         await client.post(
 | |
|           '/sphere/posts/${post.id}/pin',
 | |
|           data: {'mode': mode.value},
 | |
|         );
 | |
| 
 | |
|         if (context.mounted) Navigator.of(context).pop(mode.value);
 | |
|       } catch (e) {
 | |
|         showErrorAlert(e);
 | |
|       } finally {
 | |
|         if (context.mounted) hideLoadingModal(context);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     return SheetScaffold(
 | |
|       titleText: 'pinPost'.tr(),
 | |
|       heightFactor: 0.6,
 | |
|       child: Column(
 | |
|         crossAxisAlignment: CrossAxisAlignment.stretch,
 | |
|         children: [
 | |
|           // Publisher page pin option (always available)
 | |
|           ListTile(
 | |
|             leading: Radio<int>(
 | |
|               value: 0,
 | |
|               groupValue: mode.value,
 | |
|               onChanged: (value) {
 | |
|                 mode.value = value!;
 | |
|               },
 | |
|             ),
 | |
|             title: Text('publisherPage'.tr()),
 | |
|             subtitle: Text('pinPostPublisherHint'.tr()),
 | |
|             onTap: () {
 | |
|               mode.value = 0;
 | |
|             },
 | |
|           ),
 | |
| 
 | |
|           // Realm page pin option (show always, but disabled when not available)
 | |
|           ListTile(
 | |
|             leading: Radio<int>(
 | |
|               value: 1,
 | |
|               groupValue: mode.value,
 | |
|               onChanged:
 | |
|                   post.realmId != null && post.realmId!.isNotEmpty
 | |
|                       ? (value) {
 | |
|                         mode.value = value!;
 | |
|                       }
 | |
|                       : null,
 | |
|             ),
 | |
|             title: Text('realmPage'.tr()),
 | |
|             subtitle:
 | |
|                 post.realmId != null && post.realmId!.isNotEmpty
 | |
|                     ? Text('pinPostRealmHint'.tr())
 | |
|                     : Text('pinPostRealmDisabledHint'.tr()),
 | |
|             onTap:
 | |
|                 post.realmId != null && post.realmId!.isNotEmpty
 | |
|                     ? () {
 | |
|                       mode.value = 1;
 | |
|                     }
 | |
|                     : null,
 | |
|             enabled: post.realmId != null && post.realmId!.isNotEmpty,
 | |
|           ),
 | |
| 
 | |
|           // Reply page pin option (show always, but disabled when not available)
 | |
|           // Disabled for now because im being lazy
 | |
|           // ListTile(
 | |
|           //   leading: Radio<int>(
 | |
|           //     value: 2,
 | |
|           //     groupValue: mode.value,
 | |
|           //     onChanged:
 | |
|           //         post.repliedPostId != null && post.repliedPostId!.isNotEmpty
 | |
|           //             ? (value) {
 | |
|           //               mode.value = value!;
 | |
|           //             }
 | |
|           //             : null,
 | |
|           //   ),
 | |
|           //   title: Text('replyPage'.tr()),
 | |
|           //   subtitle:
 | |
|           //       post.repliedPostId != null && post.repliedPostId!.isNotEmpty
 | |
|           //           ? Text('pinPostReplyHint'.tr())
 | |
|           //           : Text('pinPostReplyDisabledHint'.tr()),
 | |
|           //   onTap:
 | |
|           //       post.repliedPostId != null && post.repliedPostId!.isNotEmpty
 | |
|           //           ? () {
 | |
|           //             mode.value = 2;
 | |
|           //           }
 | |
|           //           : null,
 | |
|           //   enabled:
 | |
|           //       post.repliedPostId != null && post.repliedPostId!.isNotEmpty,
 | |
|           // ),
 | |
|           const SizedBox(height: 16),
 | |
| 
 | |
|           // Pin button
 | |
|           FilledButton.icon(
 | |
|             onPressed: pinPost,
 | |
|             icon: const Icon(Symbols.keep),
 | |
|             label: Text('pin'.tr()),
 | |
|           ).padding(horizontal: 24),
 | |
|         ],
 | |
|       ),
 | |
|     );
 | |
|   }
 | |
| }
 |