Added Streams to TourRepository

This commit is contained in:
Dennis Nemec
2026-01-03 01:29:21 +01:00
parent edb8676f5a
commit 9111dc92db
43 changed files with 1232 additions and 931 deletions

View File

@ -43,7 +43,11 @@ class _ArticleListItem extends State<ArticleListItem> {
onPressed: () {
showDialog(
context: context,
builder: (context) => ArticleUnscanDialog(article: widget.article),
builder:
(context) => ArticleUnscanDialog(
article: widget.article,
deliveryId: widget.deliveryId,
),
);
},
icon: Icon(
@ -61,7 +65,10 @@ class _ArticleListItem extends State<ArticleListItem> {
showDialog(
context: context,
builder:
(context) => ResetArticleAmountDialog(article: widget.article),
(context) => ResetArticleAmountDialog(
article: widget.article,
deliveryId: widget.deliveryId,
),
);
},
icon: Icon(

View File

@ -1,14 +1,19 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:hl_lieferservice/feature/delivery/detail/bloc/delivery_bloc.dart';
import 'package:hl_lieferservice/feature/delivery/detail/bloc/delivery_event.dart';
import 'package:hl_lieferservice/feature/delivery/overview/bloc/tour_bloc.dart';
import 'package:hl_lieferservice/feature/delivery/overview/bloc/tour_event.dart';
import '../../../../../model/article.dart';
class ResetArticleAmountDialog extends StatefulWidget {
const ResetArticleAmountDialog({super.key, required this.article});
const ResetArticleAmountDialog({
super.key,
required this.article,
required this.deliveryId,
});
final Article article;
final String deliveryId;
@override
State<StatefulWidget> createState() => _ResetArticleAmountDialogState();
@ -16,8 +21,11 @@ class ResetArticleAmountDialog extends StatefulWidget {
class _ResetArticleAmountDialogState extends State<ResetArticleAmountDialog> {
void _reset() {
context.read<DeliveryBloc>().add(
ResetScanAmountEvent(articleId: widget.article.internalId.toString()),
context.read<TourBloc>().add(
ResetScanAmountEvent(
articleId: widget.article.internalId.toString(),
deliveryId: widget.deliveryId,
),
);
Navigator.pop(context);

View File

@ -1,14 +1,15 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:hl_lieferservice/feature/delivery/detail/bloc/delivery_bloc.dart';
import 'package:hl_lieferservice/feature/delivery/detail/bloc/delivery_event.dart';
import 'package:hl_lieferservice/feature/delivery/overview/bloc/tour_bloc.dart';
import 'package:hl_lieferservice/feature/delivery/overview/bloc/tour_event.dart';
import '../../../../../model/article.dart';
class ArticleUnscanDialog extends StatefulWidget {
const ArticleUnscanDialog({super.key, required this.article});
const ArticleUnscanDialog({super.key, required this.article, required this.deliveryId});
final String deliveryId;
final Article article;
@override
@ -22,8 +23,9 @@ class _ArticleUnscanDialogState extends State<ArticleUnscanDialog> {
final _formKey = GlobalKey<FormState>();
void _unscan() {
context.read<DeliveryBloc>().add(
context.read<TourBloc>().add(
UnscanArticleEvent(
deliveryId: widget.deliveryId,
articleId: widget.article.internalId.toString(),
newAmount: int.parse(unscanAmountController.text),
reason: unscanNoteController.text,

View File

@ -3,23 +3,19 @@ import 'dart:typed_data';
import 'package:easy_stepper/easy_stepper.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:hl_lieferservice/feature/delivery/detail/bloc/delivery_bloc.dart';
import 'package:hl_lieferservice/feature/delivery/detail/bloc/delivery_event.dart';
import 'package:hl_lieferservice/feature/delivery/detail/bloc/delivery_state.dart';
import 'package:hl_lieferservice/feature/delivery/detail/bloc/note_bloc.dart';
import 'package:hl_lieferservice/feature/delivery/detail/bloc/note_event.dart';
import 'package:hl_lieferservice/feature/delivery/detail/bloc/note_state.dart';
import 'package:hl_lieferservice/feature/delivery/detail/presentation/delivery_sign.dart';
import 'package:hl_lieferservice/feature/delivery/detail/presentation/steps/step.dart';
import 'package:hl_lieferservice/feature/delivery/overview/bloc/tour_bloc.dart';
import 'package:hl_lieferservice/feature/delivery/overview/bloc/tour_event.dart';
import 'package:hl_lieferservice/feature/delivery/overview/bloc/tour_state.dart';
import 'package:hl_lieferservice/model/delivery.dart' as model;
import 'package:hl_lieferservice/model/delivery.dart';
class DeliveryDetail extends StatefulWidget {
final model.Delivery delivery;
final String deliveryId;
const DeliveryDetail({super.key, required this.delivery});
const DeliveryDetail({super.key, required this.deliveryId});
@override
State<StatefulWidget> createState() => _DeliveryDetailState();
@ -33,11 +29,6 @@ class _DeliveryDetailState extends State<DeliveryDetail> {
void initState() {
super.initState();
// Initialize BLOC
context.read<DeliveryBloc>().add(
LoadDeliveryEvent(delivery: widget.delivery),
);
// Reset Note BLOC
// otherwise the notes of the previously
// opened delivery would be loaded
@ -124,28 +115,27 @@ class _DeliveryDetailState extends State<DeliveryDetail> {
}
}
void _openSignatureView() {
void _openSignatureView(Delivery delivery) {
Navigator.of(context).push(
MaterialPageRoute(
builder:
(context) =>
SignatureView(onSigned: _onSign, delivery: widget.delivery),
SignatureView(onSigned: _onSign, delivery: delivery),
),
);
}
void _onSign(Uint8List customer, Uint8List driver) async {
final currentState = context.read<DeliveryBloc>().state as DeliveryLoaded;
context.read<DeliveryBloc>().add(
context.read<TourBloc>().add(
FinishDeliveryEvent(
delivery: currentState.delivery,
deliveryId: widget.deliveryId,
customerSignature: customer,
driverSignature: driver,
),
);
}
Widget _stepsNavigation() {
Widget _stepsNavigation(Delivery delivery) {
return SizedBox(
width: double.infinity,
height: 90,
@ -160,9 +150,9 @@ class _DeliveryDetailState extends State<DeliveryDetail> {
padding: const EdgeInsets.only(left: 20),
child: FilledButton(
onPressed:
_step == _steps.length - 1
? _openSignatureView
: _clickForward,
() => _step == _steps.length - 1
? _openSignatureView(delivery)
: _clickForward,
child:
_step == _steps.length - 1
? const Text("Unterschreiben")
@ -178,48 +168,27 @@ class _DeliveryDetailState extends State<DeliveryDetail> {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text("Auslieferungsdetails")),
body: BlocConsumer<DeliveryBloc, DeliveryState>(
listener: (context, state) {
if (state is DeliveryFinished) {
final tourState = context.read<TourBloc>().state as TourLoaded;
final newTour = tourState.tour.copyWith(
deliveries:
tourState.tour.deliveries.map((delivery) {
if (delivery.id == state.delivery.id) {
return state.delivery;
}
body: BlocBuilder<TourBloc, TourState>(builder: (context, state) {
final currentState = state;
return delivery;
}).toList(),
);
if (currentState is TourLoaded) {
Delivery delivery = currentState.tour.deliveries.firstWhere((delivery) => delivery.id == widget.deliveryId);
return Column(
children: [
_stepInfo(),
const Divider(),
Expanded(
child:
StepFactory().make(_step, delivery) ??
_stepMissingWarning(),
),
_stepsNavigation(delivery),
],
);
}
context.read<TourBloc>().add(UpdateTour(tour: newTour));
Navigator.pop(context);
Navigator.pop(context);
}
},
builder: (context, state) {
final currentState = state;
if (currentState is DeliveryLoaded) {
return Column(
children: [
_stepInfo(),
const Divider(),
Expanded(
child:
StepFactory().make(_step, currentState.delivery) ??
_stepMissingWarning(),
),
_stepsNavigation(),
],
);
}
return Container();
},
),
return const Center(child: CircularProgressIndicator(),);
}),
);
}
}

View File

@ -1,9 +1,10 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:hl_lieferservice/feature/delivery/detail/bloc/delivery_bloc.dart';
import 'package:hl_lieferservice/feature/delivery/detail/bloc/delivery_event.dart';
import 'package:hl_lieferservice/feature/delivery/overview/bloc/tour_bloc.dart';
import 'package:hl_lieferservice/model/delivery.dart';
import '../../overview/bloc/tour_event.dart';
class DeliveryDiscount extends StatefulWidget {
const DeliveryDiscount({
super.key,
@ -126,14 +127,14 @@ class _DeliveryDiscountState extends State<DeliveryDiscount> {
_isUpdated = false;
});
context.read<DeliveryBloc>().add(
context.read<TourBloc>().add(
RemoveDiscountEvent(deliveryId: widget.deliveryId),
);
}
void _updateValues() async {
if (_isUpdated) {
context.read<DeliveryBloc>().add(
context.read<TourBloc>().add(
UpdateDiscountEvent(
deliveryId: widget.deliveryId,
value: _discountValue,
@ -141,7 +142,7 @@ class _DeliveryDiscountState extends State<DeliveryDiscount> {
),
);
} else {
context.read<DeliveryBloc>().add(
context.read<TourBloc>().add(
AddDiscountEvent(
deliveryId: widget.deliveryId,
value: _discountValue,

View File

@ -1,13 +1,15 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:hl_lieferservice/feature/delivery/detail/bloc/delivery_bloc.dart';
import 'package:hl_lieferservice/feature/delivery/detail/bloc/delivery_event.dart';
import 'package:hl_lieferservice/feature/delivery/overview/bloc/tour_bloc.dart';
import 'package:hl_lieferservice/model/delivery.dart' as model;
import '../../overview/bloc/tour_event.dart';
class DeliveryOptionsView extends StatefulWidget {
const DeliveryOptionsView({super.key, required this.options});
const DeliveryOptionsView({super.key, required this.options, required this.deliveryId});
final List<model.DeliveryOption> options;
final String deliveryId;
@override
State<StatefulWidget> createState() => _DeliveryOptionsViewState();
@ -28,17 +30,16 @@ class _DeliveryOptionsViewState extends State<DeliveryOptionsView> {
debugPrint(option.key);
if (value is bool) {
context.read<DeliveryBloc>().add(
UpdateDeliveryOptionEvent(key: option.key, value: !value),
context.read<TourBloc>().add(
UpdateDeliveryOptionEvent(key: option.key, value: !value, deliveryId: widget.deliveryId),
);
return;
}
context.read<DeliveryBloc>().add(
UpdateDeliveryOptionEvent(key: option.key, value: value),
context.read<TourBloc>().add(
UpdateDeliveryOptionEvent(key: option.key, value: value, deliveryId: widget.deliveryId),
);
}
List<Widget> _options() {

View File

@ -1,8 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:hl_lieferservice/feature/delivery/detail/bloc/delivery_bloc.dart';
import 'package:hl_lieferservice/feature/delivery/detail/bloc/delivery_event.dart';
import 'package:hl_lieferservice/feature/delivery/overview/bloc/tour_bloc.dart';
import 'package:hl_lieferservice/feature/delivery/overview/bloc/tour_event.dart';
import 'package:hl_lieferservice/feature/delivery/overview/bloc/tour_state.dart';
import 'package:hl_lieferservice/model/delivery.dart';
@ -97,11 +96,10 @@ class _DeliverySummaryState extends State<DeliverySummary> {
dropdownMenuEntries: entries,
initialSelection: widget.delivery.payment.id,
onSelected: (id) {
context.read<DeliveryBloc>().add(
context.read<TourBloc>().add(
UpdateSelectedPaymentMethodEvent(
payment: _paymentMethods.firstWhere(
(payment) => payment.id == id,
),
deliveryId: widget.delivery.id,
payment: _paymentMethods.firstWhere((payment) => payment.id == id),
),
);
},

View File

@ -9,7 +9,7 @@ import 'package:hl_lieferservice/feature/delivery/detail/bloc/note_event.dart';
import 'package:hl_lieferservice/model/delivery.dart';
class NoteImageOverview extends StatefulWidget {
final List<(ImageNote, Uint8List)> images;
final List<ImageNote> images;
final String deliveryId;
const NoteImageOverview({
@ -26,7 +26,7 @@ class _NoteImageOverviewState extends State<NoteImageOverview> {
int? _imageDeleting;
void _onRemoveImage(int index) {
ImageNote note = widget.images[index].$1;
ImageNote note = widget.images[index];
context.read<NoteBloc>().add(
RemoveImageNote(objectId: note.objectId, deliveryId: widget.deliveryId),
@ -42,8 +42,7 @@ class _NoteImageOverviewState extends State<NoteImageOverview> {
),
items:
widget.images.mapIndexed((index, data) {
ImageNote note = data.$1;
Uint8List bytes = data.$2;
Uint8List bytes = data.data!;
return Builder(
builder: (BuildContext context) {

View File

@ -16,7 +16,7 @@ import 'package:image_picker/image_picker.dart';
class NoteOverview extends StatefulWidget {
final List<NoteInformation> notes;
final List<NoteTemplate> templates;
final List<(ImageNote, Uint8List)> images;
final List<ImageNote> images;
final String deliveryId;
const NoteOverview({

View File

@ -17,6 +17,9 @@ class _DeliveryStepInfo extends State<DeliveryStepOptions> {
debugPrint(
"${widget.delivery.options.map((option) => "${option.display}, ${option.value}")}",
);
return DeliveryOptionsView(options: widget.delivery.options);
return DeliveryOptionsView(
options: widget.delivery.options,
deliveryId: widget.delivery.id,
);
}
}

View File

@ -41,7 +41,7 @@ class _DeliveryStepInfo extends State<DeliveryStepNote> {
BuildContext context,
List<Note> notes,
List<NoteTemplate> templates,
List<(ImageNote, Uint8List)> images,
List<ImageNote> images,
) {
List<NoteInformation> hydratedNotes =
notes
@ -75,8 +75,8 @@ class _DeliveryStepInfo extends State<DeliveryStepNote> {
return _notesOverview(
context,
state.notes,
state.templates,
state.images,
(state.templates ?? []),
(state.images ?? []),
);
}