import React from 'react'; import { defineMessages, useIntl, FormattedMessage, FormattedNumber } from 'react-intl'; import { Link } from 'react-router-dom'; import { getSubscribersCsv, getUnsubscribersCsv, getCombinedCsv } from 'soapbox/actions/email_list'; import { Text } from 'soapbox/components/ui'; import { useAppSelector, useAppDispatch, useOwnAccount, useFeatures } from 'soapbox/hooks'; import sourceCode from 'soapbox/utils/code'; import { parseVersion } from 'soapbox/utils/features'; import { isNumber } from 'soapbox/utils/numbers'; import Column from '../ui/components/column'; import RegistrationModePicker from './components/registration_mode_picker'; import type { AxiosResponse } from 'axios'; /** Download the file from the response instead of opening it in a tab. */ // https://stackoverflow.com/a/53230807 const download = (response: AxiosResponse, filename: string) => { 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 Dashboard: React.FC = () => { const intl = useIntl(); const dispatch = useAppDispatch(); const instance = useAppSelector(state => state.instance); const features = useFeatures(); const account = useOwnAccount(); const handleSubscribersClick: React.MouseEventHandler = e => { dispatch(getSubscribersCsv()).then((response) => { download(response, 'subscribers.csv'); }).catch(() => {}); e.preventDefault(); }; const handleUnsubscribersClick: React.MouseEventHandler = e => { dispatch(getUnsubscribersCsv()).then((response) => { download(response, 'unsubscribers.csv'); }).catch(() => {}); e.preventDefault(); }; const handleCombinedClick: React.MouseEventHandler = e => { dispatch(getCombinedCsv()).then((response) => { download(response, 'combined.csv'); }).catch(() => {}); e.preventDefault(); }; const v = parseVersion(instance.version); const userCount = instance.stats.get('user_count'); const statusCount = instance.stats.get('status_count'); const domainCount = instance.stats.get('domain_count'); const mau = instance.pleroma.getIn(['stats', 'mau']) as number | undefined; const retention = (userCount && mau) ? Math.round(mau / userCount * 100) : null; if (!account) return null; return (
{isNumber(mau) && (
)} {isNumber(userCount) && ( )} {isNumber(retention) && (
{retention}%
)} {isNumber(statusCount) && ( )} {isNumber(domainCount) && (
)}
{account.admin && }

  • {sourceCode.displayName} {sourceCode.version}
  • {v.software} {v.version}
{features.emailList && account.admin &&

}
); }; export default Dashboard;