@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
70 lines (67 loc) • 3.04 kB
JavaScript
import { __assign, __rest } from 'tslib';
import { Modal } from '@shopify/app-bridge-core/actions';
import { validateAction } from '@shopify/app-bridge-core/validate/actions/modal';
import { matchesObject, makeOptional, matchesEnum, validate } from '@shopify/app-bridge-core/validate/type-validate';
import { LEGACY_MODAL_SET_HEIGHT } from './actions.js';
var defaultModalStore = { open: false };
/**
* The size `Auto` is being deprecated in version 1.12.x
* Until we remove it permanently as a size option we need to allow opening modals with the size set to `Auto`
* @internal
*/
function validateModal(action) {
var sizeSchema = matchesObject({
size: makeOptional(matchesEnum(Modal.Size)),
});
var _a = action.payload; _a.size; var excludeSize = __rest(_a, ["size"]);
return validate(action, sizeSchema) || validateAction(__assign(__assign({}, action), { payload: excludeSize }));
}
function modalReducer(state, action) {
if (state === void 0) { state = defaultModalStore; }
switch (action.type) {
case Modal.Action.UPDATE:
case Modal.Action.OPEN: {
var castAction = action;
if (validateModal(castAction)) {
return state;
}
var payload = castAction.payload;
var id = payload.id, title = payload.title, footer = payload.footer, size = payload.size;
var height = state.height;
var newState = {
id: id,
primaryAction: footer && footer.buttons ? footer.buttons.primary : undefined,
secondaryActions: footer && footer.buttons ? footer.buttons.secondary : undefined,
title: title,
size: size || Modal.Size.Medium,
open: action.type === Modal.Action.OPEN ? true : state.open,
height: height,
};
if (Modal.isIframeModal(payload)) {
var url = payload.url, path = payload.path, loading = payload.loading;
var location_1 = url || path || '';
return __assign(__assign({}, newState), { location: location_1, loading: loading });
}
else if (Modal.isMessageModal(payload)) {
return __assign(__assign({}, newState), { content: payload.message });
}
return state;
}
case Modal.Action.UPDATE_CONTENT: {
var loading = action.payload.loading;
return __assign(__assign({}, state), { loading: loading });
}
case Modal.Action.CLOSE: {
return __assign(__assign({}, state), { open: false, height: undefined });
}
case LEGACY_MODAL_SET_HEIGHT: {
return __assign(__assign({}, state), { height: action.payload });
}
case Modal.Action.UPDATE_SIZE: {
return __assign(__assign({}, state), { height: action.payload.height });
}
default:
return state;
}
}
export { modalReducer as default, defaultModalStore };