Files
senaro_dealer_app/lib/screens/login_requests_screen.dart
T
2026-10-01 16:03:32 +05:30

103 lines
3.3 KiB
Dart

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../models/models.dart';
import '../services/auth_controller.dart';
import '../ui/feedback.dart';
class LoginRequestsScreen extends StatefulWidget {
const LoginRequestsScreen({super.key});
@override
State<LoginRequestsScreen> createState() => _LoginRequestsScreenState();
}
class _LoginRequestsScreenState extends State<LoginRequestsScreen> {
List<LoginRequestItem>? _requests;
bool _loading = true;
@override
void initState() {
super.initState();
_load();
}
Future<void> _load() async {
try {
final requests = await context.read<AuthController>().api.loginRequests();
if (!mounted) return;
setState(() {
_requests = requests;
_loading = false;
});
} catch (error) {
if (!mounted) return;
setState(() => _loading = false);
showError(context, error);
}
}
Future<void> _decide(LoginRequestItem request, {required bool approve}) async {
final api = context.read<AuthController>().api;
try {
if (approve) {
await api.approveLogin(request.id);
} else {
await api.rejectLogin(request.id);
}
await _load();
} catch (error) {
if (mounted) showError(context, error);
}
}
@override
Widget build(BuildContext context) {
final requests = _requests ?? [];
return Scaffold(
appBar: AppBar(title: const Text('Login requests')),
body: _loading && _requests == null
? const Center(child: CircularProgressIndicator())
: RefreshIndicator(
onRefresh: _load,
child: ListView(
padding: const EdgeInsets.all(16),
children: [
if (requests.isEmpty)
const Padding(
padding: EdgeInsets.symmetric(vertical: 32),
child: Center(child: Text('No dealers are waiting to sign in.')),
),
for (final request in requests)
Card(
child: Padding(
padding: const EdgeInsets.all(12),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(request.name, style: Theme.of(context).textTheme.titleMedium),
Text(request.phone),
if (request.dealerName != null) Text(request.dealerName!),
Row(
children: [
TextButton(
onPressed: () => _decide(request, approve: false),
child: const Text('Reject'),
),
FilledButton(
onPressed: () => _decide(request, approve: true),
child: const Text('Approve'),
),
],
),
],
),
),
),
],
),
),
);
}
}