Home Manual ReferenceGraphs Source Repository

typhonjs-core-backbone-localstorage/src/localSync.js

'use strict';

import Utils from 'typhonjs-core-utils';

/**
 * Delegates to the model or collection `localStorage` property which should be an instance of `LocalStorage`.
 *
 * @param {string}   method - Sync method name.
 * @param {object}   model - Model to sync.
 * @param {object}   options - Optional parameters.
 * @returns {Promise}
 */
export default function localSync(method, model, options)
{
   const store = Utils.invokeOrValue(model, 'localStorage') || Utils.invokeOrValue(model.collection, 'localStorage');

   let errorMessage, promise, resp;

   try
   {
      switch (method)
      {
         case 'read':
            resp = model.id !== null && typeof model.id !== 'undefined' ? store.find(model) : store.findAll();
            break;
         case 'create':
            resp = store.create(model);
            break;
         case 'update':
            resp = store.update(model);
            break;
         case 'delete':
            resp = store.destroy(model);
            break;
      }
   }
   catch (err)
   {
      errorMessage = store && err.code === 22 && store._storageSize() === 0 ? 'Private browsing is unsupported' :
       err.message;
   }

   if (resp)
   {
      if (options && options.success) { options.success(resp); }

      promise = Promise.resolve(resp);
   }
   else
   {
      errorMessage = errorMessage ? errorMessage : 'Record Not Found';

      if (options && options.error) { options.error(errorMessage); }

      promise = Promise.reject(errorMessage);
   }

   // Add compatibility with $.ajax always execute callback for success and error.
   if (options && options.complete) { options.complete(resp); }

   return promise;
}