Refresh data
This commit is contained in:
parent
96d025ef87
commit
f6e7e46728
|
|
@ -22,9 +22,23 @@ class AuthRepository {
|
||||||
'password': password,
|
'password': password,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
return sendRequest(url, credentials);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<LoginResponseData> refresh(String url, String token, String platform) async {
|
||||||
|
|
||||||
|
final credentials = {
|
||||||
|
'token_name': 'invoice-ninja-$platform-app',
|
||||||
|
};
|
||||||
|
|
||||||
|
return sendRequest(url, credentials, token);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<LoginResponseData> sendRequest(String url, dynamic data, [String token]) async {
|
||||||
|
|
||||||
url = formatApiUrlMachine(url);
|
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(
|
final LoginResponse loginResponse = serializers.deserializeWith(
|
||||||
LoginResponse.serializer, response);
|
LoginResponse.serializer, response);
|
||||||
|
|
@ -34,5 +48,6 @@ class AuthRepository {
|
||||||
}
|
}
|
||||||
|
|
||||||
return loginResponse.data;
|
return loginResponse.data;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -27,4 +27,7 @@ class LoadDataSuccess {
|
||||||
LoadDataSuccess({this.loginResponse, this.completer});
|
LoadDataSuccess({this.loginResponse, this.completer});
|
||||||
}
|
}
|
||||||
|
|
||||||
class RefreshData {}
|
class RefreshData {
|
||||||
|
final String platform;
|
||||||
|
RefreshData(this.platform);
|
||||||
|
}
|
||||||
|
|
@ -74,9 +74,9 @@ List<Middleware<AppState>> createStorePersistenceMiddleware([
|
||||||
company4Repository,
|
company4Repository,
|
||||||
company5Repository);
|
company5Repository);
|
||||||
|
|
||||||
final loadData = _createLoadData();
|
final dataLoaded = _createDataLoaded();
|
||||||
|
|
||||||
final dataLoaded = _createDataLoaded(company1Repository, company2Repository,
|
final persistData = _createPersistData(company1Repository, company2Repository,
|
||||||
company3Repository, company4Repository, company5Repository);
|
company3Repository, company4Repository, company5Repository);
|
||||||
|
|
||||||
final userLoggedIn = _createUserLoggedIn(
|
final userLoggedIn = _createUserLoggedIn(
|
||||||
|
|
@ -89,7 +89,7 @@ List<Middleware<AppState>> createStorePersistenceMiddleware([
|
||||||
company4Repository,
|
company4Repository,
|
||||||
company5Repository);
|
company5Repository);
|
||||||
|
|
||||||
final uiChange = _createUIChange(uiRepository);
|
final persistUI = _createPersistUI(uiRepository);
|
||||||
|
|
||||||
final deleteState = _createDeleteState(
|
final deleteState = _createDeleteState(
|
||||||
authRepository,
|
authRepository,
|
||||||
|
|
@ -105,9 +105,9 @@ List<Middleware<AppState>> createStorePersistenceMiddleware([
|
||||||
TypedMiddleware<AppState, UserLogout>(deleteState),
|
TypedMiddleware<AppState, UserLogout>(deleteState),
|
||||||
TypedMiddleware<AppState, LoadStateRequest>(loadState),
|
TypedMiddleware<AppState, LoadStateRequest>(loadState),
|
||||||
TypedMiddleware<AppState, UserLoginSuccess>(userLoggedIn),
|
TypedMiddleware<AppState, UserLoginSuccess>(userLoggedIn),
|
||||||
TypedMiddleware<AppState, LoadDataSuccess>(loadData),
|
TypedMiddleware<AppState, LoadDataSuccess>(dataLoaded),
|
||||||
TypedMiddleware<AppState, PersistData>(dataLoaded),
|
TypedMiddleware<AppState, PersistData>(persistData),
|
||||||
TypedMiddleware<AppState, PersistUI>(uiChange),
|
TypedMiddleware<AppState, PersistUI>(persistUI),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -253,7 +253,7 @@ Middleware<AppState> _createUserLoggedIn(
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
Middleware<AppState> _createUIChange(PersistenceRepository uiRepository) {
|
Middleware<AppState> _createPersistUI(PersistenceRepository uiRepository) {
|
||||||
return (Store<AppState> store, dynamic action, NextDispatcher next) {
|
return (Store<AppState> store, dynamic action, NextDispatcher next) {
|
||||||
next(action);
|
next(action);
|
||||||
|
|
||||||
|
|
@ -261,7 +261,7 @@ Middleware<AppState> _createUIChange(PersistenceRepository uiRepository) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
Middleware<AppState> _createLoadData() {
|
Middleware<AppState> _createDataLoaded() {
|
||||||
return (Store<AppState> store, dynamic action, NextDispatcher next) {
|
return (Store<AppState> store, dynamic action, NextDispatcher next) {
|
||||||
final dynamic data = action.loginResponse;
|
final dynamic data = action.loginResponse;
|
||||||
store.dispatch(LoadStaticSuccess(data.static));
|
store.dispatch(LoadStaticSuccess(data.static));
|
||||||
|
|
@ -278,7 +278,7 @@ Middleware<AppState> _createLoadData() {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
Middleware<AppState> _createDataLoaded(
|
Middleware<AppState> _createPersistData(
|
||||||
PersistenceRepository company1Repository,
|
PersistenceRepository company1Repository,
|
||||||
PersistenceRepository company2Repository,
|
PersistenceRepository company2Repository,
|
||||||
PersistenceRepository company3Repository,
|
PersistenceRepository company3Repository,
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,6 @@ AppState appReducer(AppState state, dynamic action) {
|
||||||
? companyReducer(state.companyState4, action) : state.companyState4)
|
? companyReducer(state.companyState4, action) : state.companyState4)
|
||||||
..companyState5.replace(state.uiState.selectedCompanyIndex == 5
|
..companyState5.replace(state.uiState.selectedCompanyIndex == 5
|
||||||
? companyReducer(state.companyState5, action) : state.companyState5)
|
? companyReducer(state.companyState5, action) : state.companyState5)
|
||||||
..uiState.replace(uiReducer(state.uiState, action))
|
..uiState.replace(uiReducer(state.uiState, action))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,10 +14,12 @@ List<Middleware<AppState>> createStoreAuthMiddleware([
|
||||||
]) {
|
]) {
|
||||||
final loginInit = _createLoginInit();
|
final loginInit = _createLoginInit();
|
||||||
final loginRequest = _createLoginRequest(repository);
|
final loginRequest = _createLoginRequest(repository);
|
||||||
|
final refreshRequest = _createRefreshRequest(repository);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
TypedMiddleware<AppState, LoadUserLogin>(loginInit),
|
TypedMiddleware<AppState, LoadUserLogin>(loginInit),
|
||||||
TypedMiddleware<AppState, UserLoginRequest>(loginRequest),
|
TypedMiddleware<AppState, UserLoginRequest>(loginRequest),
|
||||||
|
TypedMiddleware<AppState, RefreshData>(refreshRequest),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -79,6 +81,30 @@ Middleware<AppState> _createLoginRequest(AuthRepository repository) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Middleware<AppState> _createRefreshRequest(AuthRepository repository) {
|
||||||
|
return (Store<AppState> 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) {
|
bool _isVersionSupported(String version) {
|
||||||
final parts = version.split('.');
|
final parts = version.split('.');
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
|
||||||
import 'package:redux/redux.dart';
|
import 'package:redux/redux.dart';
|
||||||
import 'package:invoiceninja_flutter/data/models/models.dart';
|
import 'package:invoiceninja_flutter/data/models/models.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/company/company_state.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';
|
import 'package:invoiceninja_flutter/redux/company/company_actions.dart';
|
||||||
|
|
||||||
CompanyState companyReducer(CompanyState state, dynamic action) {
|
CompanyState companyReducer(CompanyState state, dynamic action) {
|
||||||
|
if (action == RefreshData) {
|
||||||
|
return CompanyState();
|
||||||
|
}
|
||||||
|
|
||||||
return state.rebuild((b) => b
|
return state.rebuild((b) => b
|
||||||
..clientState.replace(clientsReducer(state.clientState, action))
|
|
||||||
..company.replace(companyEntityReducer(state.company, action))
|
..company.replace(companyEntityReducer(state.company, action))
|
||||||
|
..clientState.replace(clientsReducer(state.clientState, action))
|
||||||
..dashboardState.replace(dashboardReducer(state.dashboardState, action))
|
..dashboardState.replace(dashboardReducer(state.dashboardState, action))
|
||||||
..productState.replace(productsReducer(state.productState, action))
|
..productState.replace(productsReducer(state.productState, action))
|
||||||
..invoiceState.replace(invoicesReducer(state.invoiceState, action))
|
..invoiceState.replace(invoicesReducer(state.invoiceState, action))
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,13 @@ import 'package:redux/redux.dart';
|
||||||
|
|
||||||
Reducer<StaticState> staticReducer = combineReducers([
|
Reducer<StaticState> staticReducer = combineReducers([
|
||||||
TypedReducer<StaticState, LoadStaticSuccess>(staticLoadedReducer),
|
TypedReducer<StaticState, LoadStaticSuccess>(staticLoadedReducer),
|
||||||
|
TypedReducer<StaticState, RefreshData>(refreshData),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
StaticState refreshData(StaticState staticState, RefreshData action) {
|
||||||
|
return StaticState();
|
||||||
|
}
|
||||||
|
|
||||||
StaticState staticLoadedReducer(StaticState staticState, LoadStaticSuccess action) {
|
StaticState staticLoadedReducer(StaticState staticState, LoadStaticSuccess action) {
|
||||||
return StaticState().rebuild((b) => b
|
return StaticState().rebuild((b) => b
|
||||||
..currencyMap.addAll(Map.fromIterable(
|
..currencyMap.addAll(Map.fromIterable(
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,9 @@ class SettingsListVM {
|
||||||
store.dispatch(UserLogout());
|
store.dispatch(UserLogout());
|
||||||
},
|
},
|
||||||
onRefreshTap: (BuildContext context) {
|
onRefreshTap: (BuildContext context) {
|
||||||
|
store.dispatch(RefreshData(
|
||||||
|
Theme.of(context).platform == TargetPlatform.iOS ? 'ios' : 'android',
|
||||||
|
));
|
||||||
},
|
},
|
||||||
onDarkModeChanged: (BuildContext context, bool value) async {
|
onDarkModeChanged: (BuildContext context, bool value) async {
|
||||||
final SharedPreferences prefs = await SharedPreferences.getInstance();
|
final SharedPreferences prefs = await SharedPreferences.getInstance();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue