strapi-plugin-ctrip-apollo
Version:
This is the plugin using for ctrip apollo to manager strapi application configuration.
246 lines (217 loc) • 6.47 kB
JavaScript
/*
*
* HomePage
*
*/
import React from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { injectIntl } from 'react-intl';
import { bindActionCreators, compose } from 'redux';
import { isEmpty } from 'lodash';
import { Header } from '@buffetjs/custom';
import { Button } from '@buffetjs/core';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import {
redo,
} from '@fortawesome/free-solid-svg-icons';
import {
getQueryParameters,
ContainerFluid,
InputSearch,
PageFooter,
GlobalContext,
} from 'strapi-helper-plugin';
import pluginId from '../../pluginId';
import { HomePageContextProvider } from '../../contexts/HomePage';
// Plugin's component
import EntriesNumber from '../../components/EntriesNumber';
import List from '../../components/List';
import { EntriesWrapper, Wrapper } from './components';
/* eslint-disable */
import {
changeParams,
deleteData,
getData,
onDrop,
onSearch,
setParams,
} from './actions';
import selectHomePage from './selectors';
import reducer from './reducer';
import saga from './saga';
export class HomePage extends React.Component {
static contextType = GlobalContext;
UNSAFE_componentWillMount() {
if (!isEmpty(this.props.location.search)) {
const _page = parseInt(this.getURLParams('_page'), 10);
const _limit = parseInt(this.getURLParams('_limit'), 10);
const _sort = this.getURLParams('_sort');
this.props.setParams({ _limit, _page, _sort });
}
}
componentDidMount() {
this.props.getData();
}
UNSAFE_componentWillReceiveProps(nextProps) {
if (nextProps.deleteSuccess !== this.props.deleteSuccess) {
this.props.getData();
}
if (nextProps.location.search !== this.props.location.search) {
this.props.getData();
}
}
getURLParams = type => getQueryParameters(this.props.location.search, type);
changeSort = name => {
const {
params: { _limit, _page },
} = this.props;
const target = {
name: 'params._sort',
value: name,
};
const search = `_page=${_page}&_limit=${_limit}&_sort=${name}`;
this.props.changeParams({ target });
this.props.history.push({
pathname: this.props.history.pathname,
search,
});
};
handleChangeParams = e => {
const { history, params } = this.props;
const search =
e.target.name === 'params._limit'
? `_page=${params._page}&_limit=${e.target.value}&_sort=${params._sort}`
: `_page=${e.target.value}&_limit=${params._limit}&_sort=${params._sort}`;
this.props.history.push({
pathname: history.pathname,
search,
});
this.props.changeParams(e);
};
renderInputSearch = () => (
<InputSearch
autoFocus
name="search"
onChange={this.props.onSearch}
placeholder="ctrip-apollo.HomePage.InputSearch.placeholder"
style={{ marginTop: '-11px' }}
value={this.props.search}
/>
);
pluginHeaderActions = [
{
Component: this.renderInputSearch,
key: 'input-search',
},
];
onReload = () => {
}
redirectConfig = () => {
this.props.history.push(`/plugins/${pluginId}/configurations/development`)
}
render() {
const { formatMessage } = this.context;
return (
<HomePageContextProvider deleteData={this.props.deleteData}>
<ContainerFluid className="container-fluid">
<Wrapper>
<Header
actions={this.pluginHeaderActions}
title={{
label: formatMessage({
id: 'ctrip-apollo.HomePage.title',
}),
}}
content={formatMessage({
id: 'ctrip-apollo.HomePage.description',
})}
/>
</Wrapper>
wait for config managent develop
<EntriesWrapper>
<EntriesNumber number={this.props.entriesNumber} />
<div style={{ color: '#787E8F', fontSize: '13px' }}>
{/* <Button
color='delete'
style={{ marginRight: '11px' }}
onClick = { this.onReload }
icon = { <FontAwesomeIcon icon={redo} /> }
label = { this.context.formatMessage({ id: 'ctrip-apollo.HomePage.Button.reload' }) }
/> */}
<Button
color='success'
onClick = { this.redirectConfig }
icon = { <FontAwesomeIcon icon={redo} /> }
label = { this.context.formatMessage({ id: 'ctrip-apollo.HomePage.Button.config' }) }
/>
</div>
</EntriesWrapper>
<List
data={this.props.uploadedFiles}
changeSort={this.changeSort}
sort={this.props.params._sort}
/>
<div className="col-md-12">
<PageFooter
count={this.props.entriesNumber}
context={{ emitEvent: () => {} }}
onChangeParams={this.handleChangeParams}
params={this.props.params}
/>
</div>
</ContainerFluid>
</HomePageContextProvider>
);
}
}
HomePage.defaultProps = {
params: {
_limit: 10,
_page: 1,
_sort: 'updatedAt',
},
uploadedFiles: [],
};
HomePage.propTypes = {
changeParams: PropTypes.func.isRequired,
deleteData: PropTypes.func.isRequired,
deleteSuccess: PropTypes.bool.isRequired,
entriesNumber: PropTypes.number.isRequired,
getData: PropTypes.func.isRequired,
history: PropTypes.object.isRequired,
location: PropTypes.object.isRequired,
onDrop: PropTypes.func.isRequired,
onSearch: PropTypes.func.isRequired,
params: PropTypes.object,
search: PropTypes.string.isRequired,
setParams: PropTypes.func.isRequired,
uploadedFiles: PropTypes.arrayOf(PropTypes.object),
uploadFilesLoading: PropTypes.bool.isRequired,
};
function mapDispatchToProps(dispatch) {
return bindActionCreators(
{
changeParams,
deleteData,
getData,
onDrop,
onSearch,
setParams,
},
dispatch
);
}
const mapStateToProps = selectHomePage();
const withConnect = connect(mapStateToProps, mapDispatchToProps);
const withReducer = strapi.injectReducer({
key: 'homePage',
reducer,
pluginId,
});
const withSaga = strapi.injectSaga({ key: 'homePage', saga, pluginId });
export default compose(
withReducer,
withSaga,
withConnect
)(injectIntl(HomePage));