UNPKG

@ecomplus/passport-client

Version:

Handle customer authentication with E-Com Plus Passport

192 lines (152 loc) 6.27 kB
import { $ecomConfig } from '@ecomplus/utils' import * as EventEmitter from 'eventemitter3' import loadStoredSession from './methods/load-stored-session' import setSession from './methods/set-session' import setCustomer from './methods/set-customer' import getCustomerName from './methods/get-customer-name' import getCustomer from './methods/get-customer' import fetchOauthProfile from './methods/fetch-oauth-profile' import fetchOauthProviders from './methods/fetch-oauth-providers' import fetchLogin from './methods/fetch-login' import fetchOrdersList from './methods/fetch-orders-list' import fetchOrder from './methods/fetch-order' import checkLogin from './methods/check-login' import checkAuthorization from './methods/check-authorization' import checkVerification from './methods/check-verification' import logout from './methods/logout' import popupOauthLink from './methods/popup-oauth-link' import popupLogin from './methods/popup-login' import sendEmailCode from './methods/send-email-code' import requestApi from './methods/request-api' /** * Construct a new customer account instance object. * @constructor * @param {number} [storeId=$ecomConfig.get('store_id')] - Preset Store ID number * @param {string} [lang=$ecomConfig.get('lang')] - Snake case language code * @param {string|null} [storageKey] - Item key to persist account data * @param {object} [localStorage=window.localStorage] - * [Local Storage interface]{@link https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage} * @param {object} [document=window.document] - Object reference to * [document]{@link https://developer.mozilla.org/en-US/docs/Web/API/Window/document} * * @example // Default instance const ecomPassport = new EcomPassport() * @example // Optionally defining Store ID, lang and custom storage key const storeId = 2000 const lang = 'en_us' const storageKey = 'myPassportKey' const customEcomPassport = new EcomPassport(storeId, lang, storageKey) */ const EcomPassport = function ( storeId, lang, storageKey = 'ecomPassportClient', localStorage = typeof window === 'object' && window.localStorage, document = typeof window === 'object' && window.document ) { const ecomPassport = this /** * Construct a new account instance object. * @memberof EcomPassport * @type {function} * @see EcomPassport */ ecomPassport.Constructor = EcomPassport /** * Respective Store ID number. * @memberof EcomPassport * @type {number} */ ecomPassport.storeId = storeId || $ecomConfig.get('store_id') /** * Instance language code. * @memberof EcomPassport * @type {string} */ ecomPassport.lang = lang || $ecomConfig.get('lang') /** * Item key to persist JSON {@link EcomPassport#customer} * with [localStorage]{@link EcomPassport#localStorage} * and cookie name to persist {@link EcomPassport#session}. * @memberof EcomPassport * @type {string|null} */ ecomPassport.storageKey = storageKey /** * [Storage interface]{@link https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage}. * @memberof EcomPassport * @type {object} */ ecomPassport.localStorage = localStorage /** * [Window document]{@link https://developer.mozilla.org/en-US/docs/Web/API/Window/document}. * @memberof EcomPassport * @type {object} */ ecomPassport.document = document /** * Customer account data following * {@link https://developers.e-com.plus/docs/api/#/store/customers E-Com Plus customer object model}. * @memberof EcomPassport * @type {object} */ ecomPassport.customer = {} /** * Passport authentication session object. * @memberof EcomPassport * @type {object} */ ecomPassport.session = {} /** * Passport random 32 chars session ID. * @memberof EcomPassport * @type {object} */ ecomPassport.sessionId = '' const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' for (let i = 0; i < 32; i++) { ecomPassport.sessionId += possible.charAt(Math.floor(Math.random() * possible.length)) } const emitter = new EventEmitter() ;['on', 'off', 'once'].forEach(method => { ecomPassport[method] = (ev, fn) => { emitter[method](ev, fn) } }) const methodsMiddleware = (method, args = [], emitChange) => { const result = method(ecomPassport, emitter, args) if (result && emitChange) { const { customer } = ecomPassport /** * @event EcomPassport#change * @type {object} * @property {object} customer - Customer account data * @example ecomCart.on('change', ({ customer }) => { console.log(customer._id) }) */ emitter.emit('change', { customer }) } return result } this.loadStoredSession = () => methodsMiddleware(loadStoredSession, [], true) this.logout = canSave => methodsMiddleware(logout, [canSave], true) this.setSession = (session, canSave) => methodsMiddleware(setSession, [session, canSave], true) this.setCustomer = (customer, canSave) => methodsMiddleware(setCustomer, [customer, canSave], true) this.getCustomerName = () => methodsMiddleware(getCustomerName) this.getCustomer = () => methodsMiddleware(getCustomer) this.checkLogin = () => methodsMiddleware(checkLogin) this.checkAuthorization = () => methodsMiddleware(checkAuthorization) this.checkVerification = () => methodsMiddleware(checkVerification) this.fetchLogin = (email, docNumber, emailCode) => methodsMiddleware(fetchLogin, [email, docNumber, emailCode]) this.fetchOauthProfile = () => methodsMiddleware(fetchOauthProfile) this.fetchOauthProviders = () => methodsMiddleware(fetchOauthProviders) this.fetchOrdersList = (from, size) => methodsMiddleware(fetchOrdersList, [from, size]) this.fetchOrder = orderId => methodsMiddleware(fetchOrder, [orderId]) this.requestApi = (url, method, data) => methodsMiddleware(requestApi, [url, method, data]) this.popupOauthLink = url => methodsMiddleware(popupOauthLink, [url]) this.popupLogin = (enableSkip, baseUri) => methodsMiddleware(popupLogin, [enableSkip, baseUri]) this.sendEmailCode = email => methodsMiddleware(sendEmailCode, [email]) loadStoredSession(ecomPassport) } export default EcomPassport