import bindAll from 'lodash.bindall'; import PropTypes from 'prop-types'; import React from 'react'; import VM from 'scratch-vm'; import extensionLibraryContent from '../lib/libraries/extensions/index'; import analytics from '../lib/analytics'; import LibraryComponent from '../components/library/library.jsx'; import extensionIcon from '../components/sprite-selector/icon--sprite.svg'; class ExtensionLibrary extends React.PureComponent { constructor (props) { super(props); bindAll(this, [ 'handleItemSelect' ]); } handleItemSelect (item) { let url = item.extensionURL; if (!item.disabled && !item.extensionURL) { // eslint-disable-next-line no-alert url = prompt('Enter the URL of the extension'); } if (url && !item.disabled) { if (this.props.vm.extensionManager.isExtensionLoaded(url)) { this.props.onCategorySelected(item.name); } else { this.props.vm.extensionManager.loadExtensionURL(url).then(() => { this.props.onCategorySelected(item.name); }); } } analytics.event({ category: 'library', action: 'Select Extension', label: item.name }); } render () { const extensionLibraryThumbnailData = extensionLibraryContent.map(extension => ({ rawURL: extension.iconURL || extensionIcon, ...extension })); return ( <LibraryComponent data={extensionLibraryThumbnailData} title="Extension Library" visible={this.props.visible} onItemSelected={this.handleItemSelect} onRequestClose={this.props.onRequestClose} /> ); } } ExtensionLibrary.propTypes = { onCategorySelected: PropTypes.func, onRequestClose: PropTypes.func, visible: PropTypes.bool, vm: PropTypes.instanceOf(VM).isRequired // eslint-disable-line react/no-unused-prop-types }; export default ExtensionLibrary;