class ChatScreen extends StatefulWidget {
const ChatScreen({super.key});
@override
State<ChatScreen> createState() => _ChatScreenState();
}
class _ChatScreenState extends State<ChatScreen> {
late final WebViewController _controller;
bool _isLoading = true;
String? _error;
@override
void initState() {
super.initState();
_initializeWebView();
}
void _initializeWebView() {
_controller = WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted)
..enableZoom(false)
..setBackgroundColor(const Color(0x00FFFFFF))
..setNavigationDelegate(
NavigationDelegate(
onPageStarted: (String url) {
setState(() {
_isLoading = true;
_error = null;
});
},
onPageFinished: (String url) {
setState(() {
_isLoading = false;
});
},
onWebResourceError: (WebResourceError error) {
setState(() {
_isLoading = false;
_error = 'Failed to load chat: \${error.description}';
});
},
onNavigationRequest: (NavigationRequest request) {
if (request.url.startsWith('https://cdn.livecaller.io') ||
request.url.startsWith('https://livecaller.io') ||
request.url.startsWith('data:')) {
return NavigationDecision.navigate;
}
return NavigationDecision.prevent;
},
),
)
..loadHtmlString(_chatHtml, baseUrl: 'https://cdn.livecaller.io');
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("LiveCaller Chat"),
leading: IconButton(
icon: const Icon(Icons.arrow_back),
onPressed: () => Navigator.pop(context),
),
),
body: SafeArea(
child: Stack(
children: [
if (_error != null)
Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.error_outline, size: 64, color: Colors.red[300]),
const SizedBox(height: 16),
Text(_error!, textAlign: TextAlign.center),
const SizedBox(height: 16),
ElevatedButton(
onPressed: _initializeWebView,
child: const Text('Retry'),
),
],
),
)
else
WebViewWidget(controller: _controller),
if (_isLoading)
Container(
color: Colors.white,
child: const Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
CircularProgressIndicator(),
SizedBox(height: 16),
Text('Loading chat...'),
],
),
),
),
],
),
),
);
}
}