-
-
Notifications
You must be signed in to change notification settings - Fork 47
/
calculator_asc_materials_sessions_order_bloc.dart
56 lines (45 loc) · 2.13 KB
/
calculator_asc_materials_sessions_order_bloc.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import 'dart:async';
import 'package:bloc/bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:shiori/application/bloc.dart';
import 'package:shiori/domain/models/models.dart';
import 'package:shiori/domain/services/data_service.dart';
part 'calculator_asc_materials_sessions_order_bloc.freezed.dart';
part 'calculator_asc_materials_sessions_order_event.dart';
part 'calculator_asc_materials_sessions_order_state.dart';
const _initialState = CalculatorAscMaterialsSessionsOrderState.initial(sessions: []);
class CalculatorAscMaterialsSessionsOrderBloc extends Bloc<CalculatorAscMaterialsSessionsOrderEvent, CalculatorAscMaterialsSessionsOrderState> {
final DataService _dataService;
final CalculatorAscMaterialsSessionsBloc _sessionsBloc;
CalculatorAscMaterialsSessionsOrderBloc(this._dataService, this._sessionsBloc) : super(_initialState);
@override
Stream<CalculatorAscMaterialsSessionsOrderState> mapEventToState(CalculatorAscMaterialsSessionsOrderEvent event) async* {
final s = await event.map(
init: (e) async => state.copyWith.call(sessions: [...e.sessions]),
positionChanged: (e) async {
final updatedSessions = <CalculatorSessionModel>[];
final session = state.sessions.elementAt(e.oldIndex);
for (int i = 0; i < state.sessions.length; i++) {
if (i == e.oldIndex) {
continue;
}
final item = state.sessions[i];
updatedSessions.add(item);
}
final newIndex = e.newIndex >= state.sessions.length ? state.sessions.length - 1 : e.newIndex;
updatedSessions.insert(newIndex, session);
return state.copyWith.call(sessions: updatedSessions);
},
applyChanges: (_) async {
for (var i = 0; i < state.sessions.length; i++) {
final session = state.sessions[i];
await _dataService.calculator.updateCalAscMatSession(session.key, session.name, i);
}
await _dataService.calculator.redistributeAllInventoryMaterials();
_sessionsBloc.add(const CalculatorAscMaterialsSessionsEvent.init());
return state;
},
);
yield s;
}
}