const GitBook = require('gitbook-core'); const { React, Dropdown } = GitBook; const { string, arrayOf, shape, func } = React.PropTypes; const SITES = require('./SITES'); const optionsShape = require('./optionsShape'); const siteShape = shape({ label: string.isRequired, icon: string.isRequired, onShare: func.isRequired }); module.exports = GitBook.createPlugin({ activate: (dispatch, getState, { Components }) => { // Dispatch initialization actions dispatch(Components.registerComponent(Sharing, { role: 'toolbar:buttons:right' })); }, deactivate: (dispatch, getState) => { // Dispatch cleanup actions }, reduce: (state, action) => state }); /** * Displays the group of sharing buttons */ let Sharing = React.createClass({ propTypes: { options: optionsShape.isRequired, page: GitBook.Shapes.Page.isRequired }, onShare(site) { site.onShare(location.href, this.props.page.title); }, render() { const { options } = this.props; // Highlighted sites const mainButtons = SITES .ALL .filter(id => options[id]) .map(id => ); // Other sites let shareButton = undefined; if (options.all.length > 0) { shareButton = ( ); } return ( { mainButtons } { shareButton } ); } }); function mapStateToProps(state) { let options = state.config.getIn(['pluginsConfig', 'sharing']); if (options) { options = options.toJS(); } else { options = { all: [] }; } return { page: state.page, options }; } Sharing = GitBook.connect(Sharing, mapStateToProps); // An individual site sharing button const SiteButton = React.createClass({ propTypes: { site: siteShape.isRequired, onShare: func.isRequired }, onClick(e) { e.preventDefault(); this.props.onShare(this.props.site); }, render() { const { site } = this.props; return ( ); } }); // Share button with dropdown list of sites const ShareButton = React.createClass({ propTypes: { siteIds: arrayOf(string).isRequired, onShare: func.isRequired }, getInitialState() { return { open: false }; }, onToggle() { this.setState({ open: !this.state.open }); }, render() { const { siteIds, onShare } = this.props; const items = siteIds.map((id) => ( onShare(SITES[id])} key={id}> {SITES[id].label} )); return ( {items} ); } });