StructureJS
0.15.2A class based utility library for building modular and scalable web platform applications. Features opt-in classes and utilities which provide a solid foundation and toolset to build your next project.
- import LocalStorageEvent from '../event/LocalStorageEvent';
- import EventDispatcher from '../event/EventDispatcher';
- import BaseModel from '../model/BaseModel';
- class LocalStorageFallback {
- private _data:any = {};
- constructor() {
- console.warn(`window.localStorage is not working. StructureJS LocalStorageService will use an in memory version.`);
- }
- public setItem(key:string, value:string):any {
- return this._data[key] = String(value);
- }
- public getItem(key:string):any {
- return (this._data.hasOwnProperty(key) === true) ? this._data[key] : null;
- }
- public removeItem(key:string):any {
- return delete this._data[key];
- }
- public clear():any {
- return this._data = {};
- }
- public key(index:number):any {
- return Object.keys(this._data)[index];
- }
- public get length() {
- return Object.keys(this._data).length;
- }
- }
- /**
- * The LocalStorageService...
- *
- * @class LocalStorageService
- * @extends EventDispatcher
- * @module StructureJS
- * @submodule controller
- * @requires Extend
- * @requires EventDispatcher
- * @requires LocalStorageEvent
- * @requires BaseModel
- * @constructor
- * @author Robert S. (www.codeBelt.com)
- * @example
- * this._localStorageController = new LocalStorageService();
- * this._localStorageController.set('someName', { value: 'something'});
- */
- class LocalStorageService extends EventDispatcher
- {
- /**
- * Current user namespace. The namespace is optional.
- *
- * @property _namespace
- * @type {string}
- * @default defaultNamespace
- * @optional
- * @protected
- */
- protected _namespace:string = '';
- /**
- * A reference to window.localStorage for faster access.
- *
- * @property _localStorage
- * @type {Storage}
- * @protected
- */
- protected _localStorage:Storage = null;
- constructor(namespace:string = '')
- {
- super();
- this._namespace = namespace;
- try {
- this._localStorage = window.localStorage;
- } catch (error) {
- window['StructureJS_localStorageServiceFallback'] = window['StructureJS_localStorageServiceFallback'] || new LocalStorageFallback();
- this._localStorage = window['StructureJS_localStorageServiceFallback'];
- }
- window.addEventListener('storage', this._onLocalStorageEvent.bind(this));
- }
- /**
- * Set storage namespace
- *
- * @method setNamespace
- * @param namespace
- * @returns {string}
- * @example
- * this._localStorageController.setNamespace('myNamespace~');
- */
- public setNamespace(namespace:string):void
- {
- this._namespace = namespace;
- }
- /**
- * Get storage namespace
- *
- * @method getNamespace
- * @returns {string}
- * @example
- * const currentSetNamespace = this._localStorageController.getNamespace();
- */
- public getNamespace():string
- {
- return this._namespace;
- }
- /**
- * Add a key/value pair to localStorage.
- *
- * @method set
- * @param key {string}
- * @param data {Object}
- * @param [useNamespace=false] {boolean}
- * @return {boolean}
- * @example
- * this._localStorageController.set('someName', { value: 'something'});
- *
- * // If you set a namespace you would pass 'true' into the third parameter.
- * this._localStorageController.set('someName', { value: 'something'}, true);
- */
- public set(key:string, data:any, useNamespace:boolean = false):boolean
- {
- if (useNamespace)
- {
- key = this.getNamespace() + key;
- }
- if (data instanceof BaseModel)
- {
- data = <BaseModel>data.toJSON();
- }
- data = JSON.stringify(data);
- try
- {
- this._localStorage.setItem(key, data);
- return true;
- }
- catch (error)
- {
- return false;
- }
- }
- /**
- * Retrieves the current value associated with the Local Storage key.
- *
- * @method get
- * @param key {string}
- * @param [useNamespace=false] {string}
- * @returns {any}
- * @example
- * this._localStorageController.setNamespace('myNamespace~');
- */
- public get(key:string, useNamespace:boolean = false):any
- {
- if (useNamespace)
- {
- key = this.getNamespace() + key;
- }
- let value = this._localStorage.getItem(key);
- if (value)
- {
- try
- {
- value = JSON.parse(value);
- }
- catch (error)
- {
- // We are assuming the error is because value being parsed is a plain string with spaces.
- value = value;
- }
- }
- return value;
- }
- /**
- * Returns all items in local storage as an Object with key and value properties or
- * returns all items with a certain namespace.
- *
- * @method getAll
- * @param [namespace=null] {string} The namespace that is used to items.
- * @return {Array}
- * @example
- * this._localStorageController.getAll();
- * this._localStorageController.getAll('myNamespace~');
- */
- public getAll(namespace:string = null):Array<any>
- {
- let list:Array<{ key:string, value:any }> = [];
- const length:number = this.getLength();
- for (let i:number = 0; i < length; i++)
- {
- let key:string = this._localStorage.key(i);
- let value:any = this.get(key);
- list.push({
- key: key,
- value: value
- });
- }
- if (namespace != null) {
- list = list.filter(obj => obj.key.indexOf(namespace) >= 0);
- }
- return list;
- }
- /**
- * Deletes a key/value pair from the Local Storage collection.
- *
- * @method remove
- * @param key {string}
- * @param [useNamespace=false] {string}
- * @return {boolean}
- * @example
- * this._localStorageController.remove('someName');
- *
- * // If you set a namespace you would pass 'true' into the second parameter.
- * this._localStorageController.remove('someName', true);
- */
- public remove(key:string, useNamespace:boolean = false):boolean
- {
- if (useNamespace)
- {
- key = this.getNamespace() + key;
- }
- try
- {
- this._localStorage.removeItem(key);
- return true;
- }
- catch (error)
- {
- return false;
- }
- }
- /**
- * Returns the number of items storage in local storage.
- *
- * @method getLength
- * @returns {number}
- * @example
- * const numberOfItemsInLocalStorage = this._localStorageController.getLength();
- */
- public getLength():number
- {
- return this._localStorage.length;
- }
- /**
- * Returns the size of the Local Storage.
- *
- * @method getSize
- * @returns {number}
- * @example
- * const sizeOfLocalStorage = this._localStorageController.getSize();
- */
- public getSize():number
- {
- return encodeURIComponent(JSON.stringify(this._localStorage)).length;
- }
- /**
- * Removes all key/value pairs from the Local Storage area.
- *
- * @method removeAll
- * @param [namespace=null] {string}
- * @example
- * this._localStorageController.removeAll();
- * this._localStorageController.removeAll('myNamespace~');
- */
- public removeAll(namespace:string = null):void
- {
- if (namespace == null) {
- this._localStorage.clear();
- } else {
- this._removeItemsWithNamespace(namespace);
- }
- }
- /**
- * @method _onLocalStorageEvent
- * @param event {StorageEvent} The native browser event for Web Storage.
- * @protected
- */
- protected _onLocalStorageEvent(event:StorageEvent)
- {
- this.dispatchEvent(new LocalStorageEvent(LocalStorageEvent.STORAGE, false, false, event));
- }
- /**
- * Deletes all key/value pairs with a certain namespace.
- *
- * @method removeItemsWithNamespace
- * @param namespace {string}
- * @protected
- */
- protected _removeItemsWithNamespace(namespace:string = this._namespace):void
- {
- const items = this.getAll(namespace);
- items.forEach(data => {
- const { key } = data;
- this.remove(key, false); // False because key already has the namespace in it.
- });
- }
- }
- export default LocalStorageService;