Source: app-wrapper/js/helper/system/userDataHelper.js
/**
* @fileOverview UserDataHelper class file
* @author Dino Ivankov <dinoivankov@gmail.com>
* @version 1.3.1
*/
const _ = require('lodash');
const AppBaseClass = require('../../lib/appBase').AppBaseClass;
var _appWrapper;
var appState;
/**
* UserDataHelper class - handles and manages user data operations
*
* @class
* @extends {appWrapper.AppBaseClass}
* @memberof appWrapper.helpers.systemHelpers
* @property {Object} previousUserData Object storing previous user data
*/
class UserDataHelper extends AppBaseClass {
/**
* Creates UserDataHelper instance
*
* @constructor
* @return {UserDataHelper} Instance of UserDataHelper class
*/
constructor() {
super();
if (window && window.getAppWrapper && _.isFunction(window.getAppWrapper)){
_appWrapper = window.getAppWrapper();
appState = _appWrapper.getAppState();
}
this.boundMethods = {
clearUserData: null
};
this.previousUserData = {};
return this;
}
/**
* Returns user data var name for storage
*
* @return {string} User data var name for storage
*/
getUserDataStorageName(){
let mindOsUsers = this.getConfig('mindOsUsers');
let userDataName = this.getConfig('appInfo.name') + '_userData';
let username = '';
if (mindOsUsers){
username = _appWrapper.getPlatformData().platform.userInfo.username;
}
if (username){
userDataName += '_' + username;
}
userDataName = userDataName.replace(/[^A-Za-z0-9]+/g, '_');
return userDataName;
}
/**
* Saves user data to storage (if data was changed)
*
* @async
* @param {Object} userData User data object
* @return {Boolean} Saving result
*/
async saveUserData (userData) {
let saved = false;
if (this.userDataChanged(userData)){
this.previousUserData = _.cloneDeep(appState.userData);
appState.userData = userData;
this.log('Saving user data', 'info', []);
let userDataName = this.getUserDataStorageName();
saved = await this.getHelper('storage').set(userDataName, userData);
if (!saved){
this.addUserMessage('Could not save user data!', 'error', [], false, false);
} else {
this.previousUserData = _.cloneDeep(appState.userData);
this.addUserMessage('Saved {1} user data variables.', 'info', [_.keys(userData).length], false, false);
}
} else {
this.log('Not saving user data - data unchanged', 'info', []);
}
return saved;
}
/**
* Loads user data from storage
*
* @async
* @param {Boolean} omitSettingAppState Flag to prevent setting userData in appState
* @return {(Object|boolean)} Object containing userData or false on failure
*/
async loadUserData (omitSettingAppState) {
this.log('Loading user data', 'group', []);
let userDataName = this.getUserDataStorageName();
let userData = await this.getHelper('storage').get(userDataName);
if (userData){
this.log('Loaded {1} user data variables.', 'info', [_.keys(userData).length]);
this.log('User data variables: "{1}".', 'debug', [_.keys(userData).join('", "')]);
} else {
if (userData !== null && !_.isUndefined(userData)) {
this.log('Could not load user data.', 'warning', []);
} else {
this.log('No user data found.', 'info', []);
}
userData = {};
}
if (!omitSettingAppState){
appState.userData = _.cloneDeep(userData);
}
this.log('Loading user data', 'groupend', []);
this.previousUserData = _.cloneDeep(userData);
return userData;
}
/**
* Clears user data in storage
*
* @async
* @return {Boolean} Operation result
*/
async clearUserData () {
this.log('Clearing user data', 'info', []);
let userDataName = this.getUserDataStorageName();
let deleted = await this.getHelper('storage').delete(userDataName);
if (!deleted){
this.addUserMessage('Could not delete user data!', 'error', [], false, false);
} else {
this.addUserMessage('Deleted user data.', 'info', [], false, false);
this.previousUserData = {};
appState.userData = {};
}
return deleted;
}
/**
* Checks whether user data has been changed compared to this.previousUserData
*
* @param {Object} userData Object containing userData
* @return {Number} Number of changed variables
*/
userDataChanged (userData) {
if (!userData){
userData = appState.userData;
}
let utilHelper = _appWrapper.getHelper('util');
let userDataMap = utilHelper.propertyValuesMap(userData);
let previousDataMap = utilHelper.propertyValuesMap(this.previousUserData);
let valuesDiff = utilHelper.difference(userDataMap, previousDataMap);
let userMap = utilHelper.propertyMap(userData);
let previousMap = utilHelper.propertyMap(this.previousUserData);
let propsDiff = _.difference(userMap, previousMap);
return Object.keys(valuesDiff).length > 0 || propsDiff.length > 0;
}
}
exports.UserDataHelper = UserDataHelper;