@shopify/app-bridge-host
Version:
App Bridge Host contains components and middleware to be consumed by the app's host, as well as the host itself. The middleware and `Frame` component are responsible for facilitating communication between the client and host, and used to act on actions se
131 lines (128 loc) • 5.3 kB
JavaScript
import { __assign, __rest } from 'tslib';
import { retain, release } from '@remote-ui/core';
import { validateAction } from '@shopify/app-bridge-core/validate/actions/contextualSaveBar';
import * as ContextualSaveBar from '@shopify/app-bridge-core/actions/ContextualSaveBar';
import generateUuid from '@shopify/app-bridge-core/actions/uuid';
import { getMergedProps } from '@shopify/app-bridge-core/actions/helper';
import { resetStateReducer } from '../utilities.js';
var contextualSaveBarActionCreatorsMap = {
discard: ContextualSaveBar.discard,
hide: ContextualSaveBar.hide,
save: ContextualSaveBar.save,
show: ContextualSaveBar.show,
update: ContextualSaveBar.update,
};
var defaultContextualSaveBarStore = null;
function contextualSaveBarReducer(state, action) {
if (state === void 0) { state = null; }
var castedAction = action;
if (validateAction(castedAction)) {
return state;
}
switch (action.type) {
case ContextualSaveBar.Action.SHOW:
case ContextualSaveBar.Action.UPDATE: {
var _a = action.payload, id = _a.id, _b = _a.fullWidth, fullWidth = _b === void 0 ? false : _b, _c = _a.saveAction, saveAction = _c === void 0 ? {
disabled: false,
loading: false,
} : _c, _d = _a.discardAction, discardAction = _d === void 0 ? {
disabled: false,
loading: false,
discardConfirmationModal: false,
} : _d, _e = _a.leaveConfirmationDisable, leaveConfirmationDisable = _e === void 0 ? false : _e;
return {
id: id,
fullWidth: fullWidth,
saveAction: {
disabled: saveAction.disabled,
loading: saveAction.loading,
},
discardAction: {
disabled: discardAction.disabled,
loading: discardAction.loading,
discardConfirmationModal: discardAction.discardConfirmationModal,
},
leaveConfirmationDisable: leaveConfirmationDisable,
};
}
case ContextualSaveBar.Action.HIDE:
return null;
default:
return state;
}
}
var getApi = function (_a) {
var actions = _a.actions, subscribe = _a.subscribe;
var id = generateUuid();
var showOptions = {};
var visible = false;
function hide() {
actions.hide({ id: id });
visible = false;
}
var currentDiscardAction = {
action: ContextualSaveBar.Action.DISCARD,
};
var currentSaveAction = {
action: ContextualSaveBar.Action.SAVE,
};
function updateOnAction(currentSettings, onAction) {
var _a;
(_a = currentSettings.unsubscribe) === null || _a === void 0 ? void 0 : _a.call(currentSettings);
retain(onAction);
currentSettings.onAction = onAction;
var unsubscribe = subscribe(currentSettings.action, function () {
onAction === null || onAction === void 0 ? void 0 : onAction();
}, id);
currentSettings.unsubscribe = function () {
unsubscribe();
release(onAction);
};
}
function updateAction(currentSettings, nextOptions) {
var onAction = nextOptions.onAction, options = __rest(nextOptions, ["onAction"]);
var shouldUpdate = JSON.stringify(currentSettings.options) !== JSON.stringify(options);
currentSettings.options = getMergedProps(currentSettings.options || {}, options);
if (shouldUpdate && visible) {
var updatedOptions = __assign(__assign({}, showOptions), { saveAction: currentSaveAction.options, discardAction: currentDiscardAction.options });
actions.update(__assign(__assign({}, updatedOptions), { id: id }));
}
if (onAction) {
updateOnAction(currentSettings, onAction);
}
}
return {
show: function (options) {
if (options) {
showOptions = getMergedProps(showOptions, options);
}
actions.show(__assign(__assign({}, showOptions), { saveAction: currentSaveAction.options, discardAction: currentDiscardAction.options, id: id }));
visible = true;
},
hide: hide,
saveAction: {
setOptions: function (saveActionOptions) {
return updateAction(currentSaveAction, saveActionOptions);
},
},
discardAction: {
setOptions: function (discardActionOptions) {
return updateAction(currentDiscardAction, discardActionOptions);
},
},
};
};
/**
* An object containing the key, actions, initial state and reducer of the Loading feature
* Can be used with the `withFeature` decorator to add the reducer
* and then make its actions and store available to the wrapped component
* @public
* */
var feature = {
actions: contextualSaveBarActionCreatorsMap,
key: 'contextualSaveBar',
initialState: defaultContextualSaveBarStore,
reducer: resetStateReducer(contextualSaveBarReducer),
getApi: getApi,
};
export { contextualSaveBarActionCreatorsMap, contextualSaveBarReducer as default, defaultContextualSaveBarStore, feature };