Line data Source code
1 : import 'package:flutter/material.dart';
2 : import 'package:mvvm_builder/mvvm_builder.dart';
3 : import 'package:pal/src/injectors/editor_app/editor_app_injector.dart';
4 : import 'package:pal/src/services/package_version.dart';
5 : import 'package:pal/src/theme.dart';
6 : import 'package:pal/src/ui/editor/pages/create_helper/steps/create_helper_infos/create_helper_infos_step.dart';
7 : import 'package:pal/src/ui/editor/pages/create_helper/steps/create_helper_theme/create_helper_theme_step.dart';
8 : import 'package:pal/src/ui/editor/pages/create_helper/steps/create_helper_type/create_helper_type_step.dart';
9 : import 'package:pal/src/ui/editor/pages/helper_editor/editor_router.dart';
10 : import 'package:pal/src/ui/editor/pages/create_helper/create_helper_presenter.dart';
11 : import 'package:pal/src/ui/editor/pages/create_helper/create_helper_viewmodel.dart';
12 : import 'package:pal/src/ui/editor/widgets/nested_navigator.dart';
13 : import 'package:pal/src/ui/editor/widgets/progress_widget/progress_bar_widget.dart';
14 :
15 : import '../../../../pal_navigator_observer.dart';
16 :
17 : class CreateHelperPageArguments {
18 : final GlobalKey<NavigatorState> hostedAppNavigatorKey;
19 : final String pageId;
20 :
21 1 : CreateHelperPageArguments(
22 : this.hostedAppNavigatorKey,
23 : this.pageId,
24 : );
25 : }
26 :
27 : abstract class CreateHelperView {
28 :
29 : void launchHelperEditor(final String pageRoute, final CreateHelperModel model);
30 :
31 : void changeStep(GlobalKey<NavigatorState> nestedNavigationKey, int index);
32 :
33 : void popStep(GlobalKey<NavigatorState> nestedNavigationKey);
34 :
35 : void checkSteps(CreateHelperModel model, CreateHelperPresenter presenter);
36 : }
37 :
38 : class CreateHelperPage extends StatelessWidget implements CreateHelperView {
39 :
40 : final GlobalKey<NavigatorState> hostedAppNavigatorKey;
41 : final PalRouteObserver routeObserver;
42 : final String pageId;
43 : final PackageVersionReader packageVersionReader;
44 :
45 : final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey();
46 :
47 1 : CreateHelperPage({
48 : Key key,
49 : this.hostedAppNavigatorKey,
50 : this.packageVersionReader,
51 : this.pageId,
52 : this.routeObserver
53 : });
54 :
55 : final _mvvmPageBuilder = MVVMPageBuilder<CreateHelperPresenter, CreateHelperModel>();
56 :
57 1 : @override
58 : Widget build(BuildContext context) {
59 2 : return _mvvmPageBuilder.build(
60 1 : key: UniqueKey(),
61 : context: context,
62 2 : presenterBuilder: (context) => CreateHelperPresenter(
63 : this,
64 1 : routeObserver: routeObserver
65 0 : ?? EditorInjector.of(context).routeObserver,
66 1 : packageVersionReader: packageVersionReader
67 0 : ?? EditorInjector.of(context).packageVersionReader,
68 : ),
69 1 : builder: (context, presenter, model)
70 1 : => Scaffold(
71 1 : key: _scaffoldKey,
72 1 : appBar: AppBar(
73 : elevation: 0,
74 : backgroundColor: Colors.transparent,
75 1 : iconTheme: IconThemeData(
76 4 : color: PalTheme.of(context.buildContext).colors.dark,
77 : ),
78 1 : title: Text(
79 : 'Create new helper',
80 1 : style: TextStyle(
81 4 : color: PalTheme.of(context.buildContext).colors.dark,
82 : ),
83 : ),
84 : ),
85 2 : body: this._buildPage(context.buildContext, presenter, model),
86 : ),
87 : );
88 : }
89 :
90 1 : Widget _buildPage(
91 : final BuildContext context,
92 : final CreateHelperPresenter presenter,
93 : final CreateHelperModel model,
94 : ) {
95 1 : return SafeArea(
96 1 : child: Container(
97 : width: double.infinity,
98 1 : child: Column(
99 1 : children: [
100 1 : Padding(
101 : padding: const EdgeInsets.only(
102 : top: 23.0,
103 : bottom: 17.0,
104 : left: 16.0,
105 : right: 16.0,
106 : ),
107 1 : child: _buildProgressBar(model),
108 : ),
109 1 : Expanded(
110 1 : child: NestedNavigator(
111 1 : navigationKey: model.nestedNavigationKey,
112 : initialRoute: 'create/infos',
113 1 : onWillPop: presenter.decrementStep,
114 1 : routes: {
115 2 : 'create/infos': (context) => CreateHelperInfosStep(
116 : model: model,
117 : presenter: presenter,
118 : ),
119 0 : 'create/type': (context) => CreateHelperTypeStep(
120 : model: model,
121 : presenter: presenter,
122 : ),
123 0 : 'create/theme': (context) => CreateHelperThemeStep(
124 : model: model,
125 : presenter: presenter,
126 : ),
127 : },
128 : ),
129 : ),
130 1 : Padding(
131 : padding: const EdgeInsets.only(
132 : top: 8.0,
133 : bottom: 8.0,
134 : left: 16.0,
135 : right: 16.0,
136 : ),
137 1 : child: Container(
138 : width: double.infinity,
139 1 : child: _buildNextButton(context, model, presenter),
140 : ),
141 : ),
142 : ],
143 : ),
144 : ),
145 : );
146 : }
147 :
148 1 : Widget _buildProgressBar(final CreateHelperModel model) {
149 1 : return Column(
150 : crossAxisAlignment: CrossAxisAlignment.start,
151 1 : children: [
152 1 : Text(
153 2 : (model?.step?.value != null)
154 4 : ? model.stepsTitle[model?.step?.value]
155 : : '',
156 1 : style: TextStyle(
157 : fontWeight: FontWeight.bold,
158 : fontSize: 20,
159 : ),
160 : ),
161 1 : SizedBox(height: 15.0),
162 1 : ProgressBarWidget(
163 : nbSteps: 3,
164 1 : step: model.step,
165 : ),
166 : ],
167 : );
168 : }
169 :
170 1 : Widget _buildNextButton(
171 : final BuildContext context,
172 : final CreateHelperModel model,
173 : final CreateHelperPresenter presenter,
174 : ) {
175 1 : return RaisedButton(
176 1 : key: ValueKey('palCreateHelperNextButton'),
177 3 : disabledColor: PalTheme.of(context).colors.color4,
178 1 : child: Text(
179 : 'Next',
180 1 : style: TextStyle(
181 : color: Colors.white,
182 : ),
183 : ),
184 3 : color: PalTheme.of(context).colors.color1,
185 2 : onPressed: (model.isFormValid) ? presenter.incrementStep : null,
186 1 : shape: RoundedRectangleBorder(
187 1 : borderRadius: BorderRadius.circular(8.0),
188 : ),
189 : );
190 : }
191 :
192 0 : @override
193 : void launchHelperEditor(final String pageRoute, final CreateHelperModel model) {
194 0 : new EditorRouter(hostedAppNavigatorKey).createHelper(pageRoute, model);
195 : // Go back
196 0 : Navigator.of(_scaffoldKey.currentContext).pop(true);
197 : }
198 :
199 0 : @override
200 : void changeStep(GlobalKey<NavigatorState> nestedNavigationKey, int index) {
201 : String routeName;
202 : switch (index) {
203 0 : case 0:
204 : routeName = 'infos';
205 : break;
206 0 : case 1:
207 : routeName = 'type';
208 : break;
209 0 : case 2:
210 : routeName = 'theme';
211 : break;
212 : default:
213 : }
214 :
215 0 : Navigator.of(nestedNavigationKey.currentContext)
216 0 : .pushNamed('create/$routeName');
217 : }
218 :
219 0 : @override
220 : void popStep(GlobalKey<NavigatorState> nestedNavigationKey) {
221 0 : Navigator.of(nestedNavigationKey.currentContext).pop();
222 : }
223 :
224 0 : @override
225 : void checkSteps(CreateHelperModel model, CreateHelperPresenter presenter) {
226 0 : switch (model.step.value) {
227 0 : case 0:
228 0 : model.isFormValid = model.infosForm.currentState.validate();
229 : break;
230 0 : case 1:
231 0 : model.isFormValid = model.selectedHelperType != null;
232 : break;
233 0 : case 2:
234 0 : model.isFormValid = model.selectedHelperType != null;
235 : break;
236 : default:
237 : }
238 :
239 0 : presenter.refreshView();
240 : }
241 : }
|