@hackplan/polaris
Version:
Shopify’s product component library
76 lines (75 loc) • 2.46 kB
JavaScript
import { Redirect, Button, ButtonGroup } from '@shopify/app-bridge/actions';
export function generateRedirect(appBridge, url, target = 'APP', external) {
if (url == null) {
return undefined;
}
const redirect = Redirect.create(appBridge);
const payload = external === true
? {
url,
newContext: true,
}
: url;
return () => {
redirect.dispatch(redirectAction(target, external), payload);
};
}
function redirectAction(target, external) {
if (external === true) {
return Redirect.Action.REMOTE;
}
return Redirect.Action[target];
}
export function transformActions(appBridge, { primaryAction, secondaryActions, actionGroups, }) {
const primary = transformPrimaryAction(appBridge, primaryAction);
const secondary = [
...transformSecondaryActions(appBridge, secondaryActions),
...transformActionGroups(appBridge, actionGroups),
];
return {
primary,
secondary,
};
}
function transformAction(appBridge, action) {
const style = action.destructive === true ? Button.Style.Danger : undefined;
const button = Button.create(appBridge, {
label: action.content || '',
disabled: action.disabled,
style,
});
if (action.onAction) {
button.subscribe(Button.Action.CLICK, action.onAction);
}
const redirect = generateRedirect(appBridge, action.url, action.target, action.external);
if (redirect != null) {
button.subscribe(Button.Action.CLICK, redirect);
}
return button;
}
function transformPrimaryAction(appBridge, primaryAction) {
if (primaryAction == null) {
return undefined;
}
const primary = transformAction(appBridge, primaryAction);
return primary;
}
function transformSecondaryActions(appBridge, secondaryActions = []) {
const secondary = [
...secondaryActions.map((secondaryAction) => {
return transformAction(appBridge, secondaryAction);
}),
];
return secondary;
}
function transformActionGroups(appBridge, actionGroups = []) {
const buttonGroups = [
...actionGroups.map((group) => {
const buttons = group.actions.map((groupAction) => {
return transformAction(appBridge, groupAction);
});
return ButtonGroup.create(appBridge, { label: group.title, buttons });
}),
];
return buttonGroups;
}