@snipsonian/observable-state
Version:
Observable-state snippets (redux-like)
85 lines (84 loc) • 3.64 kB
JavaScript
;
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();
}
}