import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import Column from 'mastodon/components/column'; import LinkFooter from 'mastodon/features/ui/components/link_footer'; import { Helmet } from 'react-helmet'; import { fetchServer, fetchExtendedDescription, fetchDomainBlocks } from 'mastodon/actions/server'; import Account from 'mastodon/containers/account_container'; import Skeleton from 'mastodon/components/skeleton'; import Icon from 'mastodon/components/icon'; import classNames from 'classnames'; import Image from 'mastodon/components/image'; const messages = defineMessages({ title: { id: 'column.about', defaultMessage: 'About' }, rules: { id: 'about.rules', defaultMessage: 'Server rules' }, blocks: { id: 'about.blocks', defaultMessage: 'Moderated servers' }, silenced: { id: 'about.domain_blocks.silenced.title', defaultMessage: 'Limited' }, silencedExplanation: { id: 'about.domain_blocks.silenced.explanation', defaultMessage: 'You will generally not see profiles and content from this server, unless you explicitly look it up or opt into it by following.' }, suspended: { id: 'about.domain_blocks.suspended.title', defaultMessage: 'Suspended' }, suspendedExplanation: { id: 'about.domain_blocks.suspended.explanation', defaultMessage: 'No data from this server will be processed, stored or exchanged, making any interaction or communication with users from this server impossible.' }, }); const severityMessages = { silence: { title: messages.silenced, explanation: messages.silencedExplanation, }, suspend: { title: messages.suspended, explanation: messages.suspendedExplanation, }, }; const mapStateToProps = state => ({ server: state.getIn(['server', 'server']), extendedDescription: state.getIn(['server', 'extendedDescription']), domainBlocks: state.getIn(['server', 'domainBlocks']), }); class Section extends React.PureComponent { static propTypes = { title: PropTypes.string, children: PropTypes.node, open: PropTypes.bool, onOpen: PropTypes.func, }; state = { collapsed: !this.props.open, }; handleClick = () => { const { onOpen } = this.props; const { collapsed } = this.state; this.setState({ collapsed: !collapsed }, () => onOpen && onOpen()); } render () { const { title, children } = this.props; const { collapsed } = this.state; return (
{title}
{!collapsed && (
{children}
)}
); } } export default @connect(mapStateToProps) @injectIntl class About extends React.PureComponent { static propTypes = { server: ImmutablePropTypes.map, extendedDescription: ImmutablePropTypes.map, domainBlocks: ImmutablePropTypes.contains({ isLoading: PropTypes.bool, isAvailable: PropTypes.bool, items: ImmutablePropTypes.list, }), dispatch: PropTypes.func.isRequired, intl: PropTypes.object.isRequired, multiColumn: PropTypes.bool, }; componentDidMount () { const { dispatch } = this.props; dispatch(fetchServer()); dispatch(fetchExtendedDescription()); } handleDomainBlocksOpen = () => { const { dispatch } = this.props; dispatch(fetchDomainBlocks()); } render () { const { multiColumn, intl, server, extendedDescription, domainBlocks } = this.props; const isLoading = server.get('isLoading'); return (
`${value} ${key.replace('@', '')}`).join(', ')} className='about__header__hero' />

{isLoading ? : server.get('domain')}

Mastodon }} />


{isLoading ? : {server.getIn(['contact', 'email'])}}
{extendedDescription.get('isLoading') ? ( <>


) : (extendedDescription.get('content')?.length > 0 ? (
) : (

))}
{!isLoading && (server.get('rules').isEmpty() ? (

) : (
    {server.get('rules').map(rule => (
  1. {rule.get('text')}
  2. ))}
))}
{domainBlocks.get('isLoading') ? ( <>
) : (domainBlocks.get('isAvailable') ? ( <>

{domainBlocks.get('items').map(block => (
{block.get('domain')}
{intl.formatMessage(severityMessages[block.get('severity')].title)}

{block.get('comment').length > 0 ? block.get('comment') : }

))}
) : (

))}

{intl.formatMessage(messages.title)}
); } }