import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../../core/chat/chat_opening_provider.dart'; import '../../../core/chat/session_closure_notifier.dart'; import '../../../core/constants.dart'; /// Extension-only pricing sheet. /// /// Used solely for in-session extension requests; the initial pairing flow /// goes through `/payment` instead. Free-trial is never offered for extensions. /// /// Submit triggers [SessionClosure.requestExtension], which internally /// runs the payment-session create+confirm and then the extend POST. class PricingBottomSheet extends ConsumerWidget { /// Required — the in-progress chat session id this extension targets. final String extensionSessionId; const PricingBottomSheet({super.key, required this.extensionSessionId}); /// Show for session extension (from chat screen). static Future showForExtension(BuildContext context, {required String sessionId}) { return showModalBottomSheet( context: context, isScrollControlled: true, builder: (_) => PricingBottomSheet(extensionSessionId: sessionId), ); } @override Widget build(BuildContext context, WidgetRef ref) { final pricingAsync = ref.watch(chatPricingProvider); return pricingAsync.when( loading: () => const SizedBox( height: 200, child: Center(child: CircularProgressIndicator()), ), error: (error, _) => const SizedBox( height: 200, child: Center(child: Text('Gagal memuat harga. Coba lagi.')), ), data: (pricing) => DraggableScrollableSheet( initialChildSize: 0.6, minChildSize: 0.4, maxChildSize: 0.8, expand: false, builder: (_, scrollController) { return Padding( padding: const EdgeInsets.all(24), child: ListView( controller: scrollController, children: [ const Text( 'Perpanjang Durasi', style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), textAlign: TextAlign.center, ), const SizedBox(height: 16), // No free-trial path for extensions. ...pricing.tiers.map((tier) => Card( child: ListTile( title: Text(tier.label), trailing: Text( formatRupiah(tier.price), style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 16), ), onTap: () { Navigator.of(context).pop(); ref.read(sessionClosureProvider.notifier).requestExtension( extensionSessionId, durationMinutes: tier.durationMinutes, price: tier.price, ); }, ), )), ], ), ); }, ), ); } }