import React from 'react'; import { defineMessages, injectIntl, FormattedMessage, FormattedNumber } from 'react-intl'; import { Link } from 'react-router-dom'; import { connect } from 'react-redux'; import ImmutablePureComponent from 'react-immutable-pure-component'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import Column from '../ui/components/column'; import RegistrationModePicker from './components/registration_mode_picker'; import { parseVersion } from 'soapbox/utils/features'; import sourceCode from 'soapbox/utils/code'; import { getSubscribersCsv, getUnsubscribersCsv, getCombinedCsv } from 'soapbox/actions/email_list'; import { getFeatures } from 'soapbox/utils/features'; import { isAdmin } from 'soapbox/utils/accounts'; // https://stackoverflow.com/a/53230807 const download = (response, filename) => { const url = URL.createObjectURL(new Blob([response.data])); const link = document.createElement('a'); link.href = url; link.setAttribute('download', filename); document.body.appendChild(link); link.click(); link.remove(); }; const messages = defineMessages({ heading: { id: 'column.admin.dashboard', defaultMessage: 'Dashboard' }, }); const mapStateToProps = (state, props) => { const me = state.get('me'); return { instance: state.get('instance'), supportsEmailList: getFeatures(state.get('instance')).emailList, account: state.getIn(['accounts', me]), }; }; export default @connect(mapStateToProps) @injectIntl class Dashboard extends ImmutablePureComponent { static propTypes = { intl: PropTypes.object.isRequired, instance: ImmutablePropTypes.map.isRequired, supportsEmailList: PropTypes.bool, account: ImmutablePropTypes.map, }; handleSubscribersClick = e => { this.props.dispatch(getSubscribersCsv()).then((response) => { download(response, 'subscribers.csv'); }).catch(() => {}); e.preventDefault(); } handleUnsubscribersClick = e => { this.props.dispatch(getUnsubscribersCsv()).then((response) => { download(response, 'unsubscribers.csv'); }).catch(() => {}); e.preventDefault(); } handleCombinedClick = e => { this.props.dispatch(getCombinedCsv()).then((response) => { download(response, 'combined.csv'); }).catch(() => {}); e.preventDefault(); } render() { const { intl, instance, supportsEmailList, account } = this.props; const v = parseVersion(instance.get('version')); const userCount = instance.getIn(['stats', 'user_count']); const mau = instance.getIn(['pleroma', 'stats', 'mau']); const retention = (userCount && mau) ? Math.round(mau / userCount * 100) : null; if (!account) return null; return (
{mau &&
}
{retention &&
{retention}%
}
{isAdmin(account) && }

  • {sourceCode.displayName} {sourceCode.version}
  • {v.software} {v.version}
{supportsEmailList && isAdmin(account) &&

}
); } }