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

113 lines
3.8 KiB
Dart

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../labels.dart';
import '../models/models.dart';
import '../services/auth_controller.dart';
import '../theme/app_theme.dart';
import '../ui/feedback.dart';
import 'stock_detail_screen.dart';
import 'stock_form_screen.dart';
class DealerStockScreen extends StatefulWidget {
const DealerStockScreen({super.key, required this.dealer, required this.dealers});
final Dealer dealer;
final List<Dealer> dealers;
@override
State<DealerStockScreen> createState() => _DealerStockScreenState();
}
class _DealerStockScreenState extends State<DealerStockScreen> {
List<StockItem>? _stocks;
bool _loading = true;
@override
void initState() {
super.initState();
_load();
}
Future<void> _load() async {
try {
final stocks = await context.read<AuthController>().api.stocks(dealerId: widget.dealer.id);
if (!mounted) return;
setState(() {
_stocks = stocks;
_loading = false;
});
} catch (error) {
if (!mounted) return;
setState(() => _loading = false);
showError(context, error);
}
}
@override
Widget build(BuildContext context) {
final role = context.watch<AuthController>().user?.role;
final stocks = _stocks ?? [];
final canAdd = role == 'dealer' || role == 'salesRep' || role == 'superAdmin';
return Scaffold(
appBar: AppBar(title: Text(widget.dealer.name)),
floatingActionButton: canAdd
? FloatingActionButton.extended(
onPressed: () async {
final created = await Navigator.of(context).push<bool>(
MaterialPageRoute(
builder: (_) => StockFormScreen(dealers: [widget.dealer]),
),
);
if (created == true) _load();
},
icon: const Icon(Icons.add),
label: const Text('Add stock'),
)
: null,
body: _loading && _stocks == null
? const Center(child: CircularProgressIndicator())
: RefreshIndicator(
onRefresh: _load,
child: ListView(
padding: const EdgeInsets.fromLTRB(16, 12, 16, 96),
children: [
if (stocks.isEmpty)
const Padding(
padding: EdgeInsets.symmetric(vertical: 32),
child: Center(child: Text('No bikes for this dealer.')),
),
for (final stock in stocks)
Card(
child: ListTile(
leading: CircleAvatar(
backgroundColor: badgeColor(stock.badge),
child: Text(
'${stock.ageInDays}',
style: const TextStyle(color: Colors.white, fontSize: 12),
),
),
title: Text('${modelLabel(stock.model)} · ${stock.color}'),
subtitle: Text(
'${stock.chassisNumber}${stock.plateNumber == null ? '' : ' · ${stock.plateNumber}'}\n${stageLabel(stock.currentStage)}',
),
isThreeLine: true,
trailing: Text('${stock.ageInDays}d'),
onTap: () async {
await Navigator.of(context).push<bool>(
MaterialPageRoute(
builder: (_) => StockDetailScreen(stock: stock, dealers: widget.dealers),
),
);
if (mounted) _load();
},
),
),
],
),
),
);
}
}