@hackplan/polaris
Version:
Shopify’s product component library
85 lines (84 loc) • 3.36 kB
JavaScript
import React from 'react';
import isEqual from 'lodash/isEqual';
import { ResourcePicker as AppBridgeResourcePicker } from '@shopify/app-bridge/actions';
import { withAppProvider } from '../AppProvider';
/** @deprecated Use `ResourcePicker` from `@shopify/app-bridge-react` instead. */
export class ResourcePicker extends React.PureComponent {
constructor() {
super(...arguments);
this.focusReturnPoint = null;
}
componentDidMount() {
// eslint-disable-next-line no-console
console.warn("Deprecation: `ResourcePicker` is deprecated and will be removed in v5.0. Use `ResourcePicker` from `@shopify/app-bridge-react` instead. For example, `import {ResourcePicker} from '@shopify/app-bridge-react';`");
if (this.props.polaris.appBridge == null) {
return;
}
const { open, resourceType, initialQuery, showHidden = true, allowMultiple = true, showVariants = true, onSelection, onCancel, } = this.props;
const { appBridge } = this.props.polaris;
this.appBridgeResourcePicker = AppBridgeResourcePicker.create(appBridge, {
resourceType: AppBridgeResourcePicker.ResourceType[resourceType],
options: {
initialQuery,
showHidden,
selectMultiple: allowMultiple,
showVariants,
},
});
if (onSelection != null) {
this.appBridgeResourcePicker.subscribe(AppBridgeResourcePicker.Action.SELECT, ({ selection }) => {
onSelection({ selection });
});
}
if (onCancel != null) {
this.appBridgeResourcePicker.subscribe(AppBridgeResourcePicker.Action.CANCEL, onCancel);
}
if (open) {
this.focusReturnPoint = document.activeElement;
this.appBridgeResourcePicker.dispatch(AppBridgeResourcePicker.Action.OPEN);
}
}
componentDidUpdate(prevProps) {
if (this.appBridgeResourcePicker == null) {
return;
}
const { open, initialQuery, showHidden = false, allowMultiple = true, showVariants = true, } = this.props;
const wasOpen = prevProps.open;
if (!isEqual(prevProps, this.props)) {
this.appBridgeResourcePicker.set({
initialQuery,
showHidden,
selectMultiple: allowMultiple,
showVariants,
});
}
if (wasOpen !== open) {
if (open) {
this.appBridgeResourcePicker.dispatch(AppBridgeResourcePicker.Action.OPEN);
}
else {
this.appBridgeResourcePicker.dispatch(AppBridgeResourcePicker.Action.CLOSE);
}
}
if (!wasOpen && open) {
this.focusReturnPoint = document.activeElement;
}
else if (wasOpen &&
!open &&
this.focusReturnPoint != null &&
document.contains(this.focusReturnPoint)) {
this.focusReturnPoint.focus();
this.focusReturnPoint = null;
}
}
componentWillUnmount() {
if (this.appBridgeResourcePicker == null) {
return;
}
this.appBridgeResourcePicker.unsubscribe();
}
render() {
return null;
}
}
export default withAppProvider()(ResourcePicker);