141 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
import 'package:flutter/material.dart';
 | 
						|
import 'package:flutter_hooks/flutter_hooks.dart';
 | 
						|
import 'package:gap/gap.dart';
 | 
						|
import 'package:hooks_riverpod/hooks_riverpod.dart';
 | 
						|
import 'package:island/pods/network.dart';
 | 
						|
import 'package:island/screens/account/me/settings_connections.dart';
 | 
						|
import 'package:island/widgets/alert.dart';
 | 
						|
import 'package:island/widgets/content/sheet.dart';
 | 
						|
import 'package:easy_localization/easy_localization.dart';
 | 
						|
import 'package:styled_widget/styled_widget.dart';
 | 
						|
 | 
						|
class RestorePurchaseSheet extends HookConsumerWidget {
 | 
						|
  const RestorePurchaseSheet({super.key});
 | 
						|
 | 
						|
  @override
 | 
						|
  Widget build(BuildContext context, WidgetRef ref) {
 | 
						|
    final selectedProvider = useState<String?>(null);
 | 
						|
    final orderIdController = useTextEditingController();
 | 
						|
    final isLoading = useState(false);
 | 
						|
 | 
						|
    final providers = ['afdian'];
 | 
						|
 | 
						|
    Future<void> restorePurchase() async {
 | 
						|
      if (selectedProvider.value == null ||
 | 
						|
          orderIdController.text.trim().isEmpty) {
 | 
						|
        showErrorAlert('Please fill in all fields');
 | 
						|
        return;
 | 
						|
      }
 | 
						|
 | 
						|
      isLoading.value = true;
 | 
						|
      try {
 | 
						|
        final client = ref.read(apiClientProvider);
 | 
						|
        await client.post(
 | 
						|
          '/pass/subscriptions/order/restore/${selectedProvider.value!}',
 | 
						|
          data: {'order_id': orderIdController.text.trim()},
 | 
						|
        );
 | 
						|
 | 
						|
        if (context.mounted) {
 | 
						|
          Navigator.pop(context);
 | 
						|
          showSnackBar('Purchase restored successfully!');
 | 
						|
        }
 | 
						|
      } catch (err) {
 | 
						|
        showErrorAlert(err);
 | 
						|
      } finally {
 | 
						|
        isLoading.value = false;
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    return SheetScaffold(
 | 
						|
      titleText: 'restorePurchase'.tr(),
 | 
						|
      child: SingleChildScrollView(
 | 
						|
        child: Column(
 | 
						|
          crossAxisAlignment: CrossAxisAlignment.stretch,
 | 
						|
          children: [
 | 
						|
            Text(
 | 
						|
              'restorePurchaseDescription'.tr(),
 | 
						|
              style: Theme.of(context).textTheme.bodyMedium?.copyWith(
 | 
						|
                color: Theme.of(context).colorScheme.onSurfaceVariant,
 | 
						|
              ),
 | 
						|
            ),
 | 
						|
            const Gap(24),
 | 
						|
 | 
						|
            // Provider Selection
 | 
						|
            Text(
 | 
						|
              'provider'.tr(),
 | 
						|
              style: Theme.of(context).textTheme.titleMedium,
 | 
						|
            ),
 | 
						|
            const Gap(8),
 | 
						|
            Container(
 | 
						|
              decoration: BoxDecoration(
 | 
						|
                border: Border.all(
 | 
						|
                  color: Theme.of(context).colorScheme.outline,
 | 
						|
                ),
 | 
						|
                borderRadius: BorderRadius.circular(8),
 | 
						|
              ),
 | 
						|
              child: DropdownButtonHideUnderline(
 | 
						|
                child: DropdownButton<String>(
 | 
						|
                  value: selectedProvider.value,
 | 
						|
                  hint: Text('selectProvider'.tr()),
 | 
						|
                  isExpanded: true,
 | 
						|
                  padding: const EdgeInsets.symmetric(horizontal: 12),
 | 
						|
                  items:
 | 
						|
                      providers.map((provider) {
 | 
						|
                        return DropdownMenuItem<String>(
 | 
						|
                          value: provider,
 | 
						|
                          child: Row(
 | 
						|
                            children: [
 | 
						|
                              getProviderIcon(
 | 
						|
                                provider,
 | 
						|
                                size: 20,
 | 
						|
                                color: Theme.of(context).colorScheme.onSurface,
 | 
						|
                              ),
 | 
						|
                              const Gap(12),
 | 
						|
                              Text(getLocalizedProviderName(provider)),
 | 
						|
                            ],
 | 
						|
                          ),
 | 
						|
                        );
 | 
						|
                      }).toList(),
 | 
						|
                  onChanged: (value) {
 | 
						|
                    selectedProvider.value = value;
 | 
						|
                  },
 | 
						|
                ),
 | 
						|
              ),
 | 
						|
            ),
 | 
						|
            const Gap(16),
 | 
						|
 | 
						|
            // Order ID Input
 | 
						|
            Text(
 | 
						|
              'orderId'.tr(),
 | 
						|
              style: Theme.of(context).textTheme.titleMedium,
 | 
						|
            ),
 | 
						|
            const Gap(8),
 | 
						|
            TextField(
 | 
						|
              controller: orderIdController,
 | 
						|
              decoration: InputDecoration(
 | 
						|
                hintText: 'enterOrderId'.tr(),
 | 
						|
                border: const OutlineInputBorder(),
 | 
						|
              ),
 | 
						|
            ),
 | 
						|
            const Gap(24),
 | 
						|
 | 
						|
            // Restore Button
 | 
						|
            FilledButton(
 | 
						|
              onPressed: isLoading.value ? null : restorePurchase,
 | 
						|
              child:
 | 
						|
                  isLoading.value
 | 
						|
                      ? const SizedBox(
 | 
						|
                        height: 20,
 | 
						|
                        width: 20,
 | 
						|
                        child: CircularProgressIndicator(strokeWidth: 2),
 | 
						|
                      )
 | 
						|
                      : Text('restore'.tr()),
 | 
						|
            ),
 | 
						|
            const Gap(16),
 | 
						|
          ],
 | 
						|
        ).padding(all: 16),
 | 
						|
      ),
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 |