Refactor code of plugin sharing

This commit is contained in:
Samy Pesse
2016-10-13 13:23:19 +02:00
parent 3aea3e5d88
commit c42c5897fe
8 changed files with 172 additions and 137 deletions
+1 -1
View File
@@ -74,4 +74,4 @@
"url": "https://github.com/GitbookIO/gitbook/issues"
},
"license": "Apache-2.0"
}
}
@@ -0,0 +1,44 @@
const GitBook = require('gitbook-core');
const { React, Dropdown } = GitBook;
const SITES = require('../SITES');
// Share button with dropdown list of sites
const ShareButton = React.createClass({
propTypes: {
siteIds: React.PropTypes.arrayOf(React.PropTypes.string).isRequired,
onShare: React.PropTypes.func.isRequired
},
getInitialState() {
return { open: false };
},
onToggle() {
this.setState({ open: !this.state.open });
},
render() {
const { siteIds, onShare } = this.props;
const items = siteIds.map((id) => (
<Dropdown.Item onClick={() => onShare(SITES[id])} key={id}>
{SITES[id].label}
</Dropdown.Item>
));
return (
<Dropdown.Container>
<GitBook.Button onClick={this.onToggle}>
<GitBook.Icon id="share-alt" />
</GitBook.Button>
<Dropdown.Menu open={this.state.open}>
{items}
</Dropdown.Menu>
</Dropdown.Container>
);
}
});
module.exports = ShareButton;
@@ -0,0 +1,63 @@
const GitBook = require('gitbook-core');
const { React } = GitBook;
const SITES = require('../SITES');
const optionsShape = require('../shapes/options');
const SiteButton = require('./SiteButton');
const ShareButton = require('./ShareButton');
/**
* Displays the group of sharing buttons
*/
const SharingButtons = 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 => <SiteButton key={id} onShare={this.onShare} site={SITES[id]} />);
// Other sites
let shareButton = undefined;
if (options.all.length > 0) {
shareButton = (
<ShareButton siteIds={options.all}
onShare={this.onShare} />
);
}
return (
<GitBook.ButtonGroup>
{ mainButtons }
{ shareButton }
</GitBook.ButtonGroup>
);
}
});
function mapStateToProps(state) {
let options = state.config.getIn(['pluginsConfig', 'sharing']);
if (options) {
options = options.toJS();
} else {
options = { all: [] };
}
return {
page: state.page,
options
};
}
module.exports = GitBook.connect(SharingButtons, mapStateToProps);
@@ -0,0 +1,29 @@
const GitBook = require('gitbook-core');
const { React } = GitBook;
const siteShape = require('../shapes/site');
// An individual site sharing button
const SiteButton = React.createClass({
propTypes: {
site: siteShape.isRequired,
onShare: React.PropTypes.func.isRequired
},
onClick(e) {
e.preventDefault();
this.props.onShare(this.props.site);
},
render() {
const { site } = this.props;
return (
<GitBook.Button onClick={this.onClick}>
<GitBook.Icon id={site.icon}/>
</GitBook.Button>
);
}
});
module.exports = SiteButton;
+2 -135
View File
@@ -1,142 +1,9 @@
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
});
const SharingButtons = require('./components/SharingButtons');
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 => <SiteButton key={id} onShare={this.onShare} site={SITES[id]} />);
// Other sites
let shareButton = undefined;
if (options.all.length > 0) {
shareButton = (
<ShareButton siteIds={options.all}
onShare={this.onShare} />
);
}
return (
<GitBook.ButtonGroup>
{ mainButtons }
{ shareButton }
</GitBook.ButtonGroup>
);
}
});
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 (
<GitBook.Button onClick={this.onClick}>
<GitBook.Icon id={site.icon}/>
</GitBook.Button>
);
}
});
// 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) => (
<Dropdown.Item onClick={() => onShare(SITES[id])} key={id}>
{SITES[id].label}
</Dropdown.Item>
));
return (
<Dropdown.Container>
<GitBook.Button onClick={this.onToggle}>
<GitBook.Icon id="share-alt" />
</GitBook.Button>
<Dropdown.Menu open={this.state.open}>
{items}
</Dropdown.Menu>
</Dropdown.Container>
);
dispatch(Components.registerComponent(SharingButtons, { role: 'toolbar:buttons:right' }));
}
});
@@ -0,0 +1,19 @@
const {
bool,
arrayOf,
oneOf,
shape
} = require('gitbook-core').React.PropTypes;
const { ALL } = require('../SITES');
const optionsShape = shape({
facebook: bool,
twitter: bool,
google: bool,
weibo: bool,
instapaper: bool,
vk: bool,
all: arrayOf(oneOf(ALL)).isRequired
});
module.exports = optionsShape;
@@ -0,0 +1,13 @@
const {
string,
func,
shape
} = require('gitbook-core').React.PropTypes;
const siteShape = shape({
label: string.isRequired,
icon: string.isRequired,
onShare: func.isRequired
});
module.exports = siteShape;
+1 -1
View File
@@ -107,4 +107,4 @@
"babel-register": "^6.14.0",
"mocha": "^3.0.2"
}
}
}