From f6e7e46728b94b837bf655e3d94e7b9146d3a1a4 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 31 Jul 2018 09:58:47 +0300 Subject: [PATCH] Refresh data --- lib/data/repositories/auth_repository.dart | 19 ++++++++++++++-- lib/redux/app/app_actions.dart | 5 ++++- lib/redux/app/app_middleware.dart | 18 +++++++-------- lib/redux/app/app_reducer.dart | 2 +- lib/redux/auth/auth_middleware.dart | 26 ++++++++++++++++++++++ lib/redux/company/company_reducer.dart | 6 ++++- lib/redux/static/static_reducer.dart | 5 +++++ lib/ui/settings/settings_list_vm.dart | 4 +++- 8 files changed, 70 insertions(+), 15 deletions(-) diff --git a/lib/data/repositories/auth_repository.dart b/lib/data/repositories/auth_repository.dart index 2e1ea9a96..59de3e7f5 100644 --- a/lib/data/repositories/auth_repository.dart +++ b/lib/data/repositories/auth_repository.dart @@ -22,9 +22,23 @@ class AuthRepository { 'password': password, }; + return sendRequest(url, credentials); + } + + Future refresh(String url, String token, String platform) async { + + final credentials = { + 'token_name': 'invoice-ninja-$platform-app', + }; + + return sendRequest(url, credentials, token); + } + + Future sendRequest(String url, dynamic data, [String token]) async { + url = formatApiUrlMachine(url); - final dynamic response = await webClient.post(url + '/login?include=tax_rates&include_static=true', '', json.encode(credentials)); + final dynamic response = await webClient.post(url + '/login?include=tax_rates&include_static=true', token ?? '', json.encode(data)); final LoginResponse loginResponse = serializers.deserializeWith( LoginResponse.serializer, response); @@ -34,5 +48,6 @@ class AuthRepository { } return loginResponse.data; - } + } + } \ No newline at end of file diff --git a/lib/redux/app/app_actions.dart b/lib/redux/app/app_actions.dart index 059bf564f..cc358977d 100644 --- a/lib/redux/app/app_actions.dart +++ b/lib/redux/app/app_actions.dart @@ -27,4 +27,7 @@ class LoadDataSuccess { LoadDataSuccess({this.loginResponse, this.completer}); } -class RefreshData {} \ No newline at end of file +class RefreshData { + final String platform; + RefreshData(this.platform); +} \ No newline at end of file diff --git a/lib/redux/app/app_middleware.dart b/lib/redux/app/app_middleware.dart index ea4c3ce04..10c4d5adf 100644 --- a/lib/redux/app/app_middleware.dart +++ b/lib/redux/app/app_middleware.dart @@ -74,9 +74,9 @@ List> createStorePersistenceMiddleware([ company4Repository, company5Repository); - final loadData = _createLoadData(); + final dataLoaded = _createDataLoaded(); - final dataLoaded = _createDataLoaded(company1Repository, company2Repository, + final persistData = _createPersistData(company1Repository, company2Repository, company3Repository, company4Repository, company5Repository); final userLoggedIn = _createUserLoggedIn( @@ -89,7 +89,7 @@ List> createStorePersistenceMiddleware([ company4Repository, company5Repository); - final uiChange = _createUIChange(uiRepository); + final persistUI = _createPersistUI(uiRepository); final deleteState = _createDeleteState( authRepository, @@ -105,9 +105,9 @@ List> createStorePersistenceMiddleware([ TypedMiddleware(deleteState), TypedMiddleware(loadState), TypedMiddleware(userLoggedIn), - TypedMiddleware(loadData), - TypedMiddleware(dataLoaded), - TypedMiddleware(uiChange), + TypedMiddleware(dataLoaded), + TypedMiddleware(persistData), + TypedMiddleware(persistUI), ]; } @@ -253,7 +253,7 @@ Middleware _createUserLoggedIn( }; } -Middleware _createUIChange(PersistenceRepository uiRepository) { +Middleware _createPersistUI(PersistenceRepository uiRepository) { return (Store store, dynamic action, NextDispatcher next) { next(action); @@ -261,7 +261,7 @@ Middleware _createUIChange(PersistenceRepository uiRepository) { }; } -Middleware _createLoadData() { +Middleware _createDataLoaded() { return (Store store, dynamic action, NextDispatcher next) { final dynamic data = action.loginResponse; store.dispatch(LoadStaticSuccess(data.static)); @@ -278,7 +278,7 @@ Middleware _createLoadData() { }; } -Middleware _createDataLoaded( +Middleware _createPersistData( PersistenceRepository company1Repository, PersistenceRepository company2Repository, PersistenceRepository company3Repository, diff --git a/lib/redux/app/app_reducer.dart b/lib/redux/app/app_reducer.dart index 0da0e9122..c9ee894bc 100644 --- a/lib/redux/app/app_reducer.dart +++ b/lib/redux/app/app_reducer.dart @@ -32,6 +32,6 @@ AppState appReducer(AppState state, dynamic action) { ? companyReducer(state.companyState4, action) : state.companyState4) ..companyState5.replace(state.uiState.selectedCompanyIndex == 5 ? companyReducer(state.companyState5, action) : state.companyState5) - ..uiState.replace(uiReducer(state.uiState, action)) + ..uiState.replace(uiReducer(state.uiState, action)) ); } diff --git a/lib/redux/auth/auth_middleware.dart b/lib/redux/auth/auth_middleware.dart index 3af499eeb..3570d42d1 100644 --- a/lib/redux/auth/auth_middleware.dart +++ b/lib/redux/auth/auth_middleware.dart @@ -14,10 +14,12 @@ List> createStoreAuthMiddleware([ ]) { final loginInit = _createLoginInit(); final loginRequest = _createLoginRequest(repository); + final refreshRequest = _createRefreshRequest(repository); return [ TypedMiddleware(loginInit), TypedMiddleware(loginRequest), + TypedMiddleware(refreshRequest), ]; } @@ -79,6 +81,30 @@ Middleware _createLoginRequest(AuthRepository repository) { }; } +Middleware _createRefreshRequest(AuthRepository repository) { + return (Store store, dynamic action, NextDispatcher next) { + final authState = store.state.authState; + final companyState = store.state.selectedCompany; + repository + .refresh(authState.url, companyState.token, action.platform) + .then((data) { + _saveAuthLocal(action); + + if (_isVersionSupported(data.version)) { + store.dispatch(LoadDataSuccess(completer: action.completer, loginResponse: data)); + } else { + store.dispatch(UserLoginFailure( + 'The minimum version is v$kMinMajorAppVersion.$kMinMinorAppVersion')); + } + }).catchError((Object error) { + print(error); + store.dispatch(UserLoginFailure(error.toString())); + }); + + next(action); + }; +} + bool _isVersionSupported(String version) { final parts = version.split('.'); diff --git a/lib/redux/company/company_reducer.dart b/lib/redux/company/company_reducer.dart index d3bc8af9a..3a0817b2a 100644 --- a/lib/redux/company/company_reducer.dart +++ b/lib/redux/company/company_reducer.dart @@ -1,3 +1,4 @@ +import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:redux/redux.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/company/company_state.dart'; @@ -8,10 +9,13 @@ import 'package:invoiceninja_flutter/redux/dashboard/dashboard_reducer.dart'; import 'package:invoiceninja_flutter/redux/company/company_actions.dart'; CompanyState companyReducer(CompanyState state, dynamic action) { + if (action == RefreshData) { + return CompanyState(); + } return state.rebuild((b) => b - ..clientState.replace(clientsReducer(state.clientState, action)) ..company.replace(companyEntityReducer(state.company, action)) + ..clientState.replace(clientsReducer(state.clientState, action)) ..dashboardState.replace(dashboardReducer(state.dashboardState, action)) ..productState.replace(productsReducer(state.productState, action)) ..invoiceState.replace(invoicesReducer(state.invoiceState, action)) diff --git a/lib/redux/static/static_reducer.dart b/lib/redux/static/static_reducer.dart index 2002c7a4b..c6bea35f1 100644 --- a/lib/redux/static/static_reducer.dart +++ b/lib/redux/static/static_reducer.dart @@ -4,8 +4,13 @@ import 'package:redux/redux.dart'; Reducer staticReducer = combineReducers([ TypedReducer(staticLoadedReducer), + TypedReducer(refreshData), ]); +StaticState refreshData(StaticState staticState, RefreshData action) { + return StaticState(); +} + StaticState staticLoadedReducer(StaticState staticState, LoadStaticSuccess action) { return StaticState().rebuild((b) => b ..currencyMap.addAll(Map.fromIterable( diff --git a/lib/ui/settings/settings_list_vm.dart b/lib/ui/settings/settings_list_vm.dart index 0b5174f23..f55957a67 100644 --- a/lib/ui/settings/settings_list_vm.dart +++ b/lib/ui/settings/settings_list_vm.dart @@ -61,7 +61,9 @@ class SettingsListVM { store.dispatch(UserLogout()); }, onRefreshTap: (BuildContext context) { - + store.dispatch(RefreshData( + Theme.of(context).platform == TargetPlatform.iOS ? 'ios' : 'android', + )); }, onDarkModeChanged: (BuildContext context, bool value) async { final SharedPreferences prefs = await SharedPreferences.getInstance();