|
| 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 | +} |
0 commit comments