feat(garage): show selected motorcycle photo during confirmation
This commit is contained in:
parent
aae1b5fca1
commit
0e13422cd1
|
|
@ -3,6 +3,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
import '../../models/motorcycle_models.dart';
|
import '../../models/motorcycle_models.dart';
|
||||||
import 'garage_providers.dart';
|
import 'garage_providers.dart';
|
||||||
|
import 'widgets/motorcycle_photo.dart';
|
||||||
|
|
||||||
class AddMotorcycleScreen extends ConsumerStatefulWidget {
|
class AddMotorcycleScreen extends ConsumerStatefulWidget {
|
||||||
const AddMotorcycleScreen({super.key});
|
const AddMotorcycleScreen({super.key});
|
||||||
|
|
@ -19,10 +20,10 @@ class _AddMotorcycleScreenState extends ConsumerState<AddMotorcycleScreen> {
|
||||||
MotorcycleModel? _selectedModel;
|
MotorcycleModel? _selectedModel;
|
||||||
MotorcycleVariant? _selectedVariant;
|
MotorcycleVariant? _selectedVariant;
|
||||||
MotorcycleSpecification? _previewSpec;
|
MotorcycleSpecification? _previewSpec;
|
||||||
|
|
||||||
final TextEditingController _nicknameController = TextEditingController();
|
final TextEditingController _nicknameController = TextEditingController();
|
||||||
final TextEditingController _searchController = TextEditingController();
|
final TextEditingController _searchController = TextEditingController();
|
||||||
|
|
||||||
bool _isLoading = false;
|
bool _isLoading = false;
|
||||||
List<MotorcycleYear> _years = [];
|
List<MotorcycleYear> _years = [];
|
||||||
List<MotorcycleMake> _makes = [];
|
List<MotorcycleMake> _makes = [];
|
||||||
|
|
@ -89,7 +90,7 @@ class _AddMotorcycleScreenState extends ConsumerState<AddMotorcycleScreen> {
|
||||||
});
|
});
|
||||||
final repo = ref.read(motorcycleRepositoryProvider);
|
final repo = ref.read(motorcycleRepositoryProvider);
|
||||||
final variants = await repo.getVariants(_selectedYear!, _selectedMake!.id, model.id);
|
final variants = await repo.getVariants(_selectedYear!, _selectedMake!.id, model.id);
|
||||||
|
|
||||||
if (variants.length <= 1) {
|
if (variants.length <= 1) {
|
||||||
_selectedVariant = variants.isNotEmpty ? variants.first : null;
|
_selectedVariant = variants.isNotEmpty ? variants.first : null;
|
||||||
await _loadSpecSummary();
|
await _loadSpecSummary();
|
||||||
|
|
@ -103,9 +104,7 @@ class _AddMotorcycleScreenState extends ConsumerState<AddMotorcycleScreen> {
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _selectVariant(MotorcycleVariant variant) async {
|
Future<void> _selectVariant(MotorcycleVariant variant) async {
|
||||||
setState(() {
|
setState(() => _selectedVariant = variant);
|
||||||
_selectedVariant = variant;
|
|
||||||
});
|
|
||||||
await _loadSpecSummary();
|
await _loadSpecSummary();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -171,23 +170,22 @@ class _AddMotorcycleScreenState extends ConsumerState<AddMotorcycleScreen> {
|
||||||
return PopScope(
|
return PopScope(
|
||||||
canPop: _step == 1,
|
canPop: _step == 1,
|
||||||
onPopInvokedWithResult: (didPop, result) {
|
onPopInvokedWithResult: (didPop, result) {
|
||||||
if (!didPop && _step > 1) {
|
if (!didPop && _step > 1) _goBack();
|
||||||
_goBack();
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
child: Scaffold(
|
child: Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
title: Text(_getStepTitle()),
|
title: Text(_getStepTitle()),
|
||||||
leading: IconButton(
|
leading: IconButton(icon: const Icon(Icons.arrow_back), onPressed: _goBack),
|
||||||
icon: const Icon(Icons.arrow_back),
|
|
||||||
onPressed: _goBack,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
body: _isLoading
|
body: _isLoading
|
||||||
? const Center(child: CircularProgressIndicator())
|
? const Center(child: CircularProgressIndicator())
|
||||||
: Column(
|
: Column(
|
||||||
children: [
|
children: [
|
||||||
LinearProgressIndicator(value: _step / 5.0, backgroundColor: Colors.white10, valueColor: const AlwaysStoppedAnimation(Colors.cyanAccent)),
|
LinearProgressIndicator(
|
||||||
|
value: _step / 5.0,
|
||||||
|
backgroundColor: Colors.white10,
|
||||||
|
valueColor: const AlwaysStoppedAnimation(Colors.cyanAccent),
|
||||||
|
),
|
||||||
Expanded(child: _buildStepContent()),
|
Expanded(child: _buildStepContent()),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
@ -197,35 +195,23 @@ class _AddMotorcycleScreenState extends ConsumerState<AddMotorcycleScreen> {
|
||||||
|
|
||||||
String _getStepTitle() {
|
String _getStepTitle() {
|
||||||
switch (_step) {
|
switch (_step) {
|
||||||
case 1:
|
case 1: return 'Select Year';
|
||||||
return 'Select Year';
|
case 2: return 'Select Manufacturer';
|
||||||
case 2:
|
case 3: return 'Select Model (${_selectedMake?.name ?? ""})';
|
||||||
return 'Select Manufacturer';
|
case 4: return 'Select Variant';
|
||||||
case 3:
|
case 5: return 'Confirm Motorcycle';
|
||||||
return 'Select Model (${_selectedMake?.name ?? ""})';
|
default: return 'Add Motorcycle';
|
||||||
case 4:
|
|
||||||
return 'Select Variant';
|
|
||||||
case 5:
|
|
||||||
return 'Confirm Motorcycle';
|
|
||||||
default:
|
|
||||||
return 'Add Motorcycle';
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildStepContent() {
|
Widget _buildStepContent() {
|
||||||
switch (_step) {
|
switch (_step) {
|
||||||
case 1:
|
case 1: return _buildYearStep();
|
||||||
return _buildYearStep();
|
case 2: return _buildMakeStep();
|
||||||
case 2:
|
case 3: return _buildModelStep();
|
||||||
return _buildMakeStep();
|
case 4: return _buildVariantStep();
|
||||||
case 3:
|
case 5: return _buildConfirmStep();
|
||||||
return _buildModelStep();
|
default: return const SizedBox();
|
||||||
case 4:
|
|
||||||
return _buildVariantStep();
|
|
||||||
case 5:
|
|
||||||
return _buildConfirmStep();
|
|
||||||
default:
|
|
||||||
return const SizedBox();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -256,7 +242,6 @@ class _AddMotorcycleScreenState extends ConsumerState<AddMotorcycleScreen> {
|
||||||
Widget _buildMakeStep() {
|
Widget _buildMakeStep() {
|
||||||
final query = _searchController.text.toLowerCase();
|
final query = _searchController.text.toLowerCase();
|
||||||
final filtered = _makes.where((m) => m.name.toLowerCase().contains(query)).toList();
|
final filtered = _makes.where((m) => m.name.toLowerCase().contains(query)).toList();
|
||||||
|
|
||||||
return Column(
|
return Column(
|
||||||
children: [
|
children: [
|
||||||
Padding(
|
Padding(
|
||||||
|
|
@ -295,7 +280,6 @@ class _AddMotorcycleScreenState extends ConsumerState<AddMotorcycleScreen> {
|
||||||
Widget _buildModelStep() {
|
Widget _buildModelStep() {
|
||||||
final query = _searchController.text.toLowerCase();
|
final query = _searchController.text.toLowerCase();
|
||||||
final filtered = _models.where((m) => m.name.toLowerCase().contains(query)).toList();
|
final filtered = _models.where((m) => m.name.toLowerCase().contains(query)).toList();
|
||||||
|
|
||||||
return Column(
|
return Column(
|
||||||
children: [
|
children: [
|
||||||
Padding(
|
Padding(
|
||||||
|
|
@ -358,7 +342,7 @@ class _AddMotorcycleScreenState extends ConsumerState<AddMotorcycleScreen> {
|
||||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||||
children: [
|
children: [
|
||||||
Container(
|
Container(
|
||||||
padding: const EdgeInsets.all(20),
|
padding: const EdgeInsets.all(12),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: Colors.white10,
|
color: Colors.white10,
|
||||||
borderRadius: BorderRadius.circular(16),
|
borderRadius: BorderRadius.circular(16),
|
||||||
|
|
@ -366,8 +350,14 @@ class _AddMotorcycleScreenState extends ConsumerState<AddMotorcycleScreen> {
|
||||||
),
|
),
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
const Icon(Icons.two_wheeler, size: 64, color: Colors.cyanAccent),
|
MotorcyclePhoto(
|
||||||
const SizedBox(height: 12),
|
year: _selectedYear!,
|
||||||
|
make: _selectedMake!.name,
|
||||||
|
model: _selectedModel!.name,
|
||||||
|
height: 220,
|
||||||
|
borderRadius: BorderRadius.circular(10),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 14),
|
||||||
Text(
|
Text(
|
||||||
'$_selectedYear ${_selectedMake?.name} ${_selectedModel?.name}',
|
'$_selectedYear ${_selectedMake?.name} ${_selectedModel?.name}',
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue