update the app
This commit is contained in:
@@ -0,0 +1,149 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:webview_flutter/webview_flutter.dart';
|
||||
import '../../../core/constants/app_constants.dart';
|
||||
|
||||
class AgencyDashboardWebViewScreen extends StatefulWidget {
|
||||
const AgencyDashboardWebViewScreen({super.key});
|
||||
|
||||
@override
|
||||
State<AgencyDashboardWebViewScreen> createState() =>
|
||||
_AgencyDashboardWebViewScreenState();
|
||||
}
|
||||
|
||||
class _AgencyDashboardWebViewScreenState
|
||||
extends State<AgencyDashboardWebViewScreen> {
|
||||
late final WebViewController _controller;
|
||||
bool _isLoading = true;
|
||||
bool _hasError = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_controller = WebViewController()
|
||||
..setJavaScriptMode(JavaScriptMode.unrestricted)
|
||||
..setNavigationDelegate(
|
||||
NavigationDelegate(
|
||||
onPageStarted: (_) => setState(() {
|
||||
_isLoading = true;
|
||||
_hasError = false;
|
||||
}),
|
||||
onPageFinished: (_) => setState(() => _isLoading = false),
|
||||
onWebResourceError: (_) => setState(() {
|
||||
_isLoading = false;
|
||||
_hasError = true;
|
||||
}),
|
||||
),
|
||||
)
|
||||
..loadRequest(
|
||||
Uri.parse('${AppConstants.dashboardBaseUrl}/dashboard'),
|
||||
);
|
||||
}
|
||||
|
||||
void _reload() {
|
||||
setState(() {
|
||||
_hasError = false;
|
||||
_isLoading = true;
|
||||
});
|
||||
_controller.reload();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text('Agency Dashboard'),
|
||||
leading: BackButton(onPressed: () => context.go('/landing')),
|
||||
actions: [
|
||||
if (!_isLoading)
|
||||
IconButton(
|
||||
icon: const Icon(Icons.refresh_rounded),
|
||||
onPressed: _reload,
|
||||
tooltip: 'Reload',
|
||||
),
|
||||
PopupMenuButton<String>(
|
||||
onSelected: (value) {
|
||||
if (value == 'employee_login') {
|
||||
context.push('/login/employee');
|
||||
}
|
||||
},
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
),
|
||||
itemBuilder: (_) => [
|
||||
const PopupMenuItem(
|
||||
value: 'employee_login',
|
||||
child: Row(
|
||||
children: [
|
||||
Icon(Icons.login_rounded, size: 18),
|
||||
SizedBox(width: 10),
|
||||
Text('Employee App Login'),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
body: Stack(
|
||||
children: [
|
||||
WebViewWidget(controller: _controller),
|
||||
if (_isLoading)
|
||||
const LinearProgressIndicator(minHeight: 3),
|
||||
if (_hasError && !_isLoading)
|
||||
_ErrorOverlay(onRetry: _reload),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class _ErrorOverlay extends StatelessWidget {
|
||||
final VoidCallback onRetry;
|
||||
|
||||
const _ErrorOverlay({required this.onRetry});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final cs = Theme.of(context).colorScheme;
|
||||
return ColoredBox(
|
||||
color: cs.surface,
|
||||
child: Center(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(32),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Icon(
|
||||
Icons.cloud_off_rounded,
|
||||
size: 56,
|
||||
color: cs.onSurfaceVariant,
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
Text(
|
||||
'Could not load dashboard',
|
||||
style: TextStyle(
|
||||
fontSize: 17,
|
||||
fontWeight: FontWeight.w600,
|
||||
color: cs.onSurface,
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
Text(
|
||||
'Make sure the agency dashboard server is running.',
|
||||
style: TextStyle(color: cs.onSurfaceVariant, fontSize: 13),
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
const SizedBox(height: 24),
|
||||
OutlinedButton.icon(
|
||||
onPressed: onRetry,
|
||||
icon: const Icon(Icons.refresh_rounded),
|
||||
label: const Text('Try Again'),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user