From 4e68fdb696e5641c75476c7fdd00effbb3da706d Mon Sep 17 00:00:00 2001 From: Vincent BRIDIER Date: Fri, 30 Dec 2022 16:44:51 +0100 Subject: [PATCH] fix sync --- ComApp/src/App.js | 9 ++-- ComApp/src/App/Controllers/SyncController.js | 43 ++++++++++++++++++++ ComApp/src/App/Store/Reducers/AppReducer.js | 15 +++---- ComApp/src/App/Store/Reducers/directories.js | 1 - ComApp/src/App/Views/HomeScreen.js | 38 ++++++++++++++--- ComApp/src/App/Views/LoginScreen.js | 28 ++++++------- ComApp/src/App/Views/SyncScreen.js | 17 ++++++-- 7 files changed, 114 insertions(+), 37 deletions(-) diff --git a/ComApp/src/App.js b/ComApp/src/App.js index 225cd9e..e63f2b0 100644 --- a/ComApp/src/App.js +++ b/ComApp/src/App.js @@ -54,13 +54,10 @@ class App extends React.Component { componentDidMount() { const unsubscribe = store.subscribe(this.handleChange.bind(this)); - if (SyncController.isLogged()) { - store.dispatch({ type: 'SET_CURRENT_USER' }); - store.dispatch({ type: 'SET_LOGGED', data: true }); - } this.setState({ isSetup: store.getState().app.isSetup, isLogged: store.getState().app.logged, + mainColor: store.getState().app.mainColor }); } @@ -77,7 +74,7 @@ class App extends React.Component { return ( - + {this.state.isSetup === false && { - store.dispatch({ type: 'SET_LOGGED', data: false }); + store.dispatch({ type: 'SET_CURRENT_USER', data: false }); }} style={{ marginRight: 25 }}> diff --git a/ComApp/src/App/Controllers/SyncController.js b/ComApp/src/App/Controllers/SyncController.js index 259566f..a8232bf 100644 --- a/ComApp/src/App/Controllers/SyncController.js +++ b/ComApp/src/App/Controllers/SyncController.js @@ -154,6 +154,49 @@ class SyncController { } return false; } + + needSync(callback) { + NetInfo.fetch().then(state => { + if (state.isConnected) { + axios({ + method: 'get', + url: endpoint + '/version', + responseType: 'json', + params: { + token: api_token, + }, + }) + .then(response => { + const localVersion = Setting.get('version'); + if ( + localVersion === undefined || + localVersion === false || + localVersion.value !== response.data.version + ) { + return callback(); + } + return false; + }) + .catch(function (error) { + console.log(error); + }); + } + return false; + }); + return false; + } + + setInstalled() { + Setting.add({ key: 'installed', value: "true" }); + } + + isInstalled() { + const test = Setting.get('installed'); + if (test === false || test === undefined) { + return false; + } + return true; + } } export default new SyncController(); \ No newline at end of file diff --git a/ComApp/src/App/Store/Reducers/AppReducer.js b/ComApp/src/App/Store/Reducers/AppReducer.js index 53115e2..531d5f8 100644 --- a/ComApp/src/App/Store/Reducers/AppReducer.js +++ b/ComApp/src/App/Store/Reducers/AppReducer.js @@ -43,18 +43,19 @@ const reducer = (state = initialState, action) => { isSetup: saved === undefined ? false : saved.value === "true" ? true : false }; case 'SET_CURRENT_USER': - let user = Setting.get('isLogged').value - return { - ...state, - currentUser: JSON.parse(user), - }; - case 'SET_LOGGED': + let user = false; + let isLogged = false; if (action.data === false) { Setting.delete('isLogged'); + } else { + userObj = Setting.get('isLogged').value + user = JSON.parse(userObj) + isLogged = true } return { ...state, - logged: action.data, + currentUser: user !== false ? user : initialState.currentUser, + logged: isLogged }; // case 'UPDATE_LOCALE': // let nxt; diff --git a/ComApp/src/App/Store/Reducers/directories.js b/ComApp/src/App/Store/Reducers/directories.js index 35f40e4..a2b7c31 100644 --- a/ComApp/src/App/Store/Reducers/directories.js +++ b/ComApp/src/App/Store/Reducers/directories.js @@ -8,7 +8,6 @@ const reducer = (state = initialState, action) => { switch (action.type) { case INIT_DIRECTORIES: { return { - ...state, global: Directory.getAll( action.user.role, action.user.authorizedFolders, diff --git a/ComApp/src/App/Views/HomeScreen.js b/ComApp/src/App/Views/HomeScreen.js index eee21cf..6e395ed 100644 --- a/ComApp/src/App/Views/HomeScreen.js +++ b/ComApp/src/App/Views/HomeScreen.js @@ -4,15 +4,19 @@ import { View, ImageBackground, TouchableOpacity, Text, Image } from 'react-nati import commonStyles from '../../Resources/CommonStyles'; // Redux import { connect } from 'react-redux'; -import { initDirectories } from '../Store/Actions/directories'; import { initDocuments } from '../Store/Actions/documents'; import { initContact } from '../Store/Actions/contacts'; +import { initDirectories } from '../Store/Actions/directories'; // Style import styles from '../../Resources/Styles/HomeStyle'; // Translations import i18n from "../../I18n"; // FileSytem import * as FileSystem from 'expo-file-system'; +// NetInfo +import NetInfo from '@react-native-community/netinfo'; +// Controller +import SyncController from '../Controllers/SyncController'; function mapStateToProps(state) { return { @@ -25,21 +29,45 @@ function mapStateToProps(state) { const mapDispatchToProps = dispatch => { return { - init: () => dispatch({ type: 'INIT' }), initBtns: () => dispatch({ type: 'INIT_HOME_BTNS' }), - initDirectories: (lang, user) => dispatch(initDirectories(lang, user)), initDocuments: (lang, directories) => dispatch(initDocuments(lang, directories)), initContact: currentUser => dispatch(initContact(currentUser)), + initDirectories: (lang, user) => dispatch(initDirectories(lang, user)), + }; }; class HomeScreen extends React.Component { + state = { + lastSyncCall: '1970-01-01', + }; + componentDidMount() { - this.props.init(); + // Si on est sur une installation + if (!SyncController.isInstalled()) { + return this.openSync(); + } this.props.initBtns(); - this.props.initDirectories(this.props.locale.value, this.props.currentUser); this.props.initContact(this.props.currentUser); + this.props.initDirectories(this.props.locale.value, this.props.currentUser); + } + + unsubscribe() { + NetInfo.addEventListener(state => { + if (state.isConnected === true) { + let seconds = + Math.abs(new Date(this.state.lastSyncCall) - Date.now()) / 1000; + if (seconds > 30) { + this.setState({ lastSyncCall: Date.now() }); + SyncController.needSync(this.openSync.bind(this)); + } + } + }); + } + + openSync() { + this.props.navigation.navigate('SyncScreen', { forceSync: true }); } render() { diff --git a/ComApp/src/App/Views/LoginScreen.js b/ComApp/src/App/Views/LoginScreen.js index f4760d1..ff87b07 100644 --- a/ComApp/src/App/Views/LoginScreen.js +++ b/ComApp/src/App/Views/LoginScreen.js @@ -2,7 +2,6 @@ import React from 'react'; import { View, ImageBackground, TextInput, Button, Image, Alert } from 'react-native'; // Redux import { connect } from 'react-redux'; -import { initContact } from '../Store/Actions/contacts'; // Common Styles import commonStyles from '../../Resources/CommonStyles'; // Style @@ -28,12 +27,7 @@ function mapStateToProps(state) { const mapDispatchToProps = dispatch => { return { - initContact: currentUser => dispatch(initContact(currentUser)), - setCurrentUser: user => dispatch({ - type: 'SET_CURRENT_USER', - data: JSON.stringify(user), - }), - setIsLogged: () => dispatch({ type: 'SET_LOGGED', data: true }) + setCurrentUser: () => dispatch({ type: 'SET_CURRENT_USER' }), }; }; @@ -43,6 +37,12 @@ class LoginScreen extends React.Component { password: 'test', }; + componentDidMount() { + if (SyncController.isLogged()) { + this.props.setCurrentUser(); + } + } + render() { return ( @@ -101,12 +101,12 @@ class LoginScreen extends React.Component { } const lastUser = Setting.get('lastUser'); // Si on est sur une installation - if (lastUser === false || lastUser === undefined) { - this.loginAction(user, true); - return; + if (lastUser === false || lastUser == undefined) { + return this.loginAction(user); } + // TODO : a deplacer dans home screen // Si on a deja une install avec une précédente connexion - if (lastUser.value === user.id.toString()) { + if (lastUser !== false && lastUser !== undefined && lastUser.value === user.id.toString()) { this.loginAction(user); } else { // Si user !== last user && last user not synced @@ -129,9 +129,9 @@ class LoginScreen extends React.Component { loginAction(user, forceSync = false) { this.setState({ login: '', password: '' }); LoginController.login(user); - this.props.setCurrentUser(user); - this.props.setIsLogged(); - if (forceSync === true) { + this.props.setCurrentUser(); + + if (forceSync === true) { this.props.navigation.navigate('SyncScreen', { forceSync: true }); } } diff --git a/ComApp/src/App/Views/SyncScreen.js b/ComApp/src/App/Views/SyncScreen.js index 0effa4d..ad05390 100644 --- a/ComApp/src/App/Views/SyncScreen.js +++ b/ComApp/src/App/Views/SyncScreen.js @@ -22,14 +22,17 @@ function mapStateToProps(state) { syncVersion: state.app.syncVersion, currentUser: state.app.currentUser, locale: state.locale.locale, + mainColor: state.app.mainColor }; } const mapDispatchToProps = dispatch => { return { init: () => dispatch({ type: 'INIT' }), + initUsers: () => dispatch({ type: 'INIT_USERS' }), initDirectories: (lang, user) => dispatch(initDirectories(lang, user)), initContact: currentUser => dispatch(initContact(currentUser)), + initBtns: () => dispatch({ type: 'INIT_HOME_BTNS' }), updateVersion: version => dispatch({ type: 'UPDATE_VERSION', data: version, @@ -48,12 +51,14 @@ class SyncScreen extends React.Component { downloadProgress: 0, downloadingFile: false, processing: false, - newApp: false + newApp: false, + forced: false }; componentDidMount() { const { forceSync } = this.props.route.params; if (forceSync === true) { + this.setState({ forced: true }); this.sync(); } } @@ -291,11 +296,15 @@ class SyncScreen extends React.Component { } } - finishSync(version) { + finishSync() { this.props.init(); - this.props.initDirectories(this.props.locale.value, this.props.currentUser); + this.props.initUsers(); this.props.initContact(this.props.currentUser); - + this.props.initDirectories(this.props.locale.value, this.props.currentUser); + this.props.initBtns(); + if (this.state.forced) { + SyncController.setInstalled(); + } SyncController.updateVersion(version); this.setState({ txtStep: i18n.t('sync_s.update_completed') + '.', processing: false }); if (this.state.newApp === true) {