define([
'angular', 'lodash'
], function (angular, _) {
'use strict'; var module = angular.module('kibana.factories'); module.factory('storeFactory', function() { return function storeFactory($scope, name, defaults) { if (!_.isFunction($scope.$watch)) { throw new TypeError('Invalid scope.'); } if (!_.isString(name)) { throw new TypeError('Invalid name, expected a string that the is unique to this store.'); } if (defaults && !_.isPlainObject(defaults)) { throw new TypeError('Invalid defaults, expected a simple object or nothing'); } defaults = defaults || {}; // get the current value, parse if it exists var current = localStorage.getItem(name); if (current != null) { try { current = JSON.parse(current); } catch (e) { current = null; } } if (current == null) { current = _.clone(defaults); } else if (_.isPlainObject(current)) { _.defaults(current, defaults); } else { throw new TypeError('Invalid store value' + current); } $scope[name] = current; // listen for changes and store them in localStorage. // delete the value to reset to the defaults, ie. `delete $scope[name]` -> digest cycle -> `$scope[name] == defaults` $scope.$watch(name, function (val) { if (val === void 0) { localStorage.removeItem(name); $scope[name] = _.clone(defaults); } else { localStorage.setItem(name, JSON.stringify(val)); } }, true); return current; }; });
});