import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../../core/api/api_client_provider.dart'; import '../../../core/chat/widgets/sensitivity_badge.dart'; import '../../../core/chat/widgets/sensitivity_theme.dart'; import '../../../core/constants.dart'; class MitraChatTranscriptScreen extends ConsumerStatefulWidget { final String sessionId; const MitraChatTranscriptScreen({super.key, required this.sessionId}); @override ConsumerState createState() => _MitraChatTranscriptScreenState(); } class _MitraChatTranscriptScreenState extends ConsumerState { List> _messages = []; List> _closures = []; TopicSensitivity _topicSensitivity = TopicSensitivity.regular; bool _loading = true; @override void initState() { super.initState(); _loadTranscript(); } Future _loadTranscript() async { try { final api = ref.read(apiClientProvider); final results = await Future.wait([ api.get('/api/shared/chat/${widget.sessionId}/transcript'), api.get('/api/shared/chat/${widget.sessionId}/info'), ]); final data = results[0]['data'] as Map; final info = results[1]['data'] as Map?; setState(() { _messages = (data['messages'] as List).cast>(); _closures = (data['closures'] as List).cast>(); _topicSensitivity = TopicSensitivity.fromString(info?['topic_sensitivity'] as String?); _loading = false; }); } catch (_) { setState(() => _loading = false); } } @override Widget build(BuildContext context) { final isSensitive = _topicSensitivity == TopicSensitivity.sensitive; return Scaffold( backgroundColor: isSensitive ? SensitivityTheme.sensitive.bgTint : null, appBar: AppBar( title: Row( mainAxisSize: MainAxisSize.min, children: [ const Text('Transkrip Chat'), if (isSensitive) ...[ const SizedBox(width: 8), SensitivityBadge(sensitivity: _topicSensitivity, fontSize: 11), ], ], ), ), body: _loading ? const Center(child: CircularProgressIndicator()) : ListView( padding: const EdgeInsets.all(16), children: [ ..._messages.map((m) { final isMe = m['sender_type'] == UserType.mitra; final time = DateTime.parse(m['created_at'] as String).toLocal(); return Align( alignment: isMe ? Alignment.centerRight : Alignment.centerLeft, child: Container( margin: const EdgeInsets.symmetric(vertical: 4), padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 10), constraints: BoxConstraints(maxWidth: MediaQuery.of(context).size.width * 0.75), decoration: BoxDecoration( color: isMe ? Colors.green.shade100 : Colors.grey.shade200, borderRadius: BorderRadius.circular(16), ), child: Column( crossAxisAlignment: CrossAxisAlignment.end, children: [ Text(m['content'] as String, style: const TextStyle(fontSize: 15)), const SizedBox(height: 4), Text( '${time.hour.toString().padLeft(2, '0')}:${time.minute.toString().padLeft(2, '0')}', style: const TextStyle(fontSize: 10, color: Colors.grey), ), ], ), ), ); }), if (_closures.isNotEmpty) ...[ const Divider(height: 32), const Text('Pesan Penutup', style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16)), const SizedBox(height: 8), ..._closures.map((c) => Card( child: ListTile( title: Text(c['user_type'] == UserType.mitra ? 'Kamu' : 'Customer'), subtitle: Text(c['message'] as String), ), )), ], ], ), ); } }