Skip to content

Commit 24dd49e

Browse files
committed
feature: configureStore initial implementation
1 parent eca4c4a commit 24dd49e

File tree

3 files changed

+73
-0
lines changed

3 files changed

+73
-0
lines changed

lib/redux_toolkit.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@ library redux_toolkit;
33
export 'package:reselect/reselect.dart';
44
export './src/action.dart';
55
export './src/async_thunk.dart';
6+
export './src/configure_store.dart';
67
export './src/create_reducer.dart';
78
export './src/nanoid.dart';

lib/src/configure_store.dart

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import 'dart:async';
2+
import 'package:redux/redux.dart';
3+
import 'package:redux_dev_tools/redux_dev_tools.dart';
4+
import 'package:redux_thunk/redux_thunk.dart';
5+
import 'package:redux_remote_devtools/redux_remote_devtools.dart';
6+
7+
typedef StoreBuilderCallback<State> = Function(StoreBuilder<State> builder);
8+
9+
Future<Store<State>> configureStore<State>(StoreBuilderCallback<State> builderCallback) {
10+
final builder = _StoreBuilder<State>();
11+
builderCallback(builder);
12+
return builder.build();
13+
}
14+
15+
abstract class StoreBuilder<State> {
16+
StoreBuilder<State> withPreloadedState(State preloadedState);
17+
StoreBuilder<State> withReducer(Reducer<State> reducer);
18+
StoreBuilder<State> withMiddleware(Middleware<State> middleware);
19+
StoreBuilder<State> usingDevtools(String devToolsIpAddr);
20+
}
21+
22+
class _StoreBuilder<State> implements StoreBuilder<State> {
23+
static final _ipAddrRegex = RegExp(r'^([0-9]{1,3}\.){3}[0-9]{1,3}:[0-9]{1,5}$');
24+
25+
State _preloadedState;
26+
Reducer<State> _reducer;
27+
List<Middleware<State>> _middleware = [thunkMiddleware];
28+
bool _devTools = false;
29+
String _devToolsIpAddr;
30+
31+
StoreBuilder<State> withReducer(Reducer<State> reducer) {
32+
_reducer = reducer;
33+
return this;
34+
}
35+
36+
StoreBuilder<State> withPreloadedState(State preloadedState) {
37+
_preloadedState = preloadedState;
38+
return this;
39+
}
40+
41+
StoreBuilder<State> withMiddleware(Middleware<State> middleware) {
42+
_middleware.add(middleware);
43+
return this;
44+
}
45+
46+
StoreBuilder<State> usingDevtools(String devToolsIpAddr) {
47+
assert(_ipAddrRegex.hasMatch(devToolsIpAddr));
48+
49+
_devTools = true;
50+
_devToolsIpAddr = devToolsIpAddr;
51+
52+
return this;
53+
}
54+
55+
Future<Store<State>> build() async {
56+
assert(_reducer != null);
57+
58+
if (_devTools) {
59+
var remoteDevtools = RemoteDevToolsMiddleware(_devToolsIpAddr);
60+
_middleware.add(remoteDevtools);
61+
final store = DevToolsStore<State>(_reducer, middleware: _middleware, initialState: _preloadedState);
62+
remoteDevtools.store = store;
63+
await remoteDevtools.connect();
64+
return store;
65+
}
66+
67+
final store = Store<State>(_reducer, middleware: _middleware, initialState: _preloadedState);
68+
return store;
69+
}
70+
}

pubspec.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ dependencies:
99
redux: ^4.0.0+2
1010
reselect: ^0.4.0
1111
redux_thunk: ^0.3.0
12+
redux_dev_tools: ^0.5.2
13+
redux_remote_devtools: ^2.0.0
1214

1315
dev_dependencies:
1416
test: ^1.3.0

0 commit comments

Comments
 (0)