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),
 | 
						|
        ],
 | 
						|
      ),
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 |