-
Notifications
You must be signed in to change notification settings - Fork 556
/
Copy pathstub_edit_vm
113 lines (107 loc) · 3.89 KB
/
stub_edit_vm
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
import 'package:redux/redux.dart';
import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart';
import 'package:invoiceninja_flutter/ui/stub/view/stub_view_vm.dart';
import 'package:invoiceninja_flutter/redux/stub/stub_actions.dart';
import 'package:invoiceninja_flutter/ui/stub/edit/stub_edit.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:flutter_styled_toast/flutter_styled_toast.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
class StubEditScreen extends StatelessWidget {
const StubEditScreen({Key key}) : super(key: key);
static const String route = '/stub/edit';
@override
Widget build(BuildContext context) {
return StoreConnector<AppState, StubEditVM>(
converter: (Store<AppState> store) {
return StubEditVM.fromStore(store);
},
builder: (context, viewModel) {
return StubEdit(
viewModel: viewModel,
key: ValueKey(viewModel.stub.updatedAt),
);
},
);
}
}
class StubEditVM {
StubEditVM({
@required this.state,
@required this.stub,
@required this.company,
@required this.onChanged,
@required this.isSaving,
@required this.origStub,
@required this.onSavePressed,
@required this.onCancelPressed,
@required this.isLoading,
});
factory StubEditVM.fromStore(Store<AppState> store) {
final state = store.state;
final stub = state.stubUIState.editing;
return StubEditVM(
state: state,
isLoading: state.isLoading,
isSaving: state.isSaving,
origStub: state.stubState.map[stub.id],
stub: stub,
company: state.company,
onChanged: (StubEntity stub) {
store.dispatch(UpdateStub(stub));
},
onCancelPressed: (BuildContext context) {
createEntity(context: context, entity: StubEntity(), force: true);
if (state.stubUIState.cancelCompleter != null) {
state.stubUIState.cancelCompleter.complete();
} else {
store.dispatch(UpdateCurrentRoute(state.uiState.previousRoute));
}
},
onSavePressed: (BuildContext context) {
Debouncer.runOnComplete(() {
final stub = store.state.stubUIState.editing;
final localization = AppLocalization.of(context);
final Completer<StubEntity> completer = new Completer<StubEntity>();
store.dispatch(SaveStubRequest(completer: completer, stub: stub));
return completer.future.then((savedStub) {
showToast(stub.isNew
? localization.createdStub
: localization.updatedStub);
if (state.prefState.isMobile) {
store.dispatch(UpdateCurrentRoute(StubViewScreen.route));
if (stub.isNew) {
Navigator.of(context).pushReplacementNamed(StubViewScreen.route);
} else {
Navigator.of(context).pop(savedStub);
}
} else {
viewEntity( entity: savedStub, force: true);
}
}).catchError((Object error) {
showDialog<ErrorDialog>(
context: context,
builder: (BuildContext context) {
return ErrorDialog(error);
});
});
});
},
);
}
final StubEntity stub;
final CompanyEntity company;
final Function(StubEntity) onChanged;
final Function(BuildContext) onSavePressed;
final Function(BuildContext) onCancelPressed;
final bool isLoading;
final bool isSaving;
final StubEntity origStub;
final AppState state;
}