UNPKG

@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
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 };