UNPKG

@snipsonian/observable-state

Version:

Observable-state snippets (redux-like)

85 lines (84 loc) 3.64 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const isFunction_1 = require("@snipsonian/core/cjs/is/isFunction"); const createStateObserverManager_1 = require("../observer/createStateObserverManager"); const extendNotificationsToTrigger_1 = require("../observer/extendNotificationsToTrigger"); const stateStorage_1 = require("./stateStorage"); const storeManager_1 = require("./storeManager"); const LOG_GROUP_LABEL_PREFIX = 'state-change'; const IS_LOG_GROUPING_SUPPORTED = console.group; function createObservableStateStore(config) { let state = (0, stateStorage_1.determineInitialState)({ initialState: config.initialState, stateStorageConfig: config.storage, }); const observerManager = (0, createStateObserverManager_1.default)(); const { nrOfLevels: defaultNrOfParentNotificationLevelsToTrigger = extendNotificationsToTrigger_1.DEFAULT_NR_OF_PARENT_NOTIFICATION_LEVELS_TO_TRIGGER, notificationDelimiter: defaultParentNotificationsDelimiter = extendNotificationsToTrigger_1.DEFAULT_PARENT_NOTIFICATIONS_DELIMITER, } = config.triggerParentNotifications || {}; const store = { getState: () => state, setState: ({ newState, notificationsToTrigger, context, nrOfParentNotificationLevelsToTrigger = defaultNrOfParentNotificationLevelsToTrigger, }) => { const prevState = state; let stateToSet = isToNewState(newState) ? newState(prevState) : newState; if (config.onBeforeStateUpdate) { stateToSet = config.onBeforeStateUpdate({ prevState, newState: stateToSet }); } state = stateToSet; if (config.logStateUpdates || config.logNotifiedObserverNames) { logGroupStart(determineLogGroupLabel(context)); if (context && context.info) { console.log('context', context.info); } if (config.logStateUpdates) { console.log('next state', state); } if (config.logNotifiedObserverNames) { console.log('notifications', notificationsToTrigger); } logGroupEnd(); } (0, stateStorage_1.saveStateToStorage)({ state, stateStorageConfig: config.storage, }); if (config.onAfterStateUpdate) { config.onAfterStateUpdate({ prevState, newState: stateToSet }); } observerManager.notifyObserversOfStateChanges({ notificationsToTrigger, triggerParentNotifications: { nrOfLevels: nrOfParentNotificationLevelsToTrigger, notificationDelimiter: defaultParentNotificationsDelimiter, }, }); }, registerObserver: observerManager.registerObserver, unRegisterObserver: observerManager.unRegisterObserver, }; (0, storeManager_1.registerStore)(store); return store; } exports.default = createObservableStateStore; function isToNewState(newState) { return (0, isFunction_1.default)(newState); } function determineLogGroupLabel(context) { if (context) { return `${LOG_GROUP_LABEL_PREFIX}: ${context.title}`; } return LOG_GROUP_LABEL_PREFIX; } function logGroupStart(title) { if (IS_LOG_GROUPING_SUPPORTED) { console.groupCollapsed(title); } else { console.log(`[${title}]`); } } function logGroupEnd() { if (IS_LOG_GROUPING_SUPPORTED) { console.groupEnd(); } }