import PropTypes from 'prop-types'; import { PureComponent } from 'react'; import { defineMessages, FormattedMessage } from 'react-intl'; import { Helmet } from '@unhead/react/helmet'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; import { domain } from 'mastodon/initial_state'; import { injectIntl } from '@/mastodon/components/intl'; import { fetchServer, fetchExtendedDescription, fetchDomainBlocks } from 'mastodon/actions/server'; import { Account } from 'mastodon/components/account'; import Column from 'mastodon/components/column'; import { NavigationFocusTarget } from 'mastodon/components/navigation_focus_target'; import { ServerHeroImage } from 'mastodon/components/server_hero_image'; import { Skeleton } from 'mastodon/components/skeleton'; import { LinkFooter} from 'mastodon/features/ui/components/link_footer'; import { Section } from './components/section'; import { RulesSection } from './components/rules'; import { getColumnSkipLinkId } from '../ui/components/skip_links'; const messages = defineMessages({ title: { id: 'column.about', defaultMessage: 'About' }, 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.server.server, locale: state.getIn(['meta', 'locale']), extendedDescription: state.server.extendedDescription, domainBlocks: state.server.domainBlocks, }); class About extends PureComponent { static propTypes = { server: ImmutablePropTypes.map, locale: ImmutablePropTypes.string, 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, locale } = this.props; const isLoading = server.isLoading; return (
`${server.item?.thumbnail.versions && server.item.thumbnail.versions[key]} ${key.replace('@', '')}`).join(', ')} className='about__header__hero' /> {isLoading ? : domain}

Mastodon }} />


{isLoading ? : {server.item?.contact?.email}}
{extendedDescription.isLoading ? ( <>


) : (extendedDescription.item?.content?.length > 0 ? (
) : (

))}
{domainBlocks.isLoading ? ( <>
) : (domainBlocks.isAvailable ? ( <>

{domainBlocks.items.length > 0 && (
{domainBlocks.items.map(block => (
{block.domain}
{intl.formatMessage(severityMessages[block.severity].title)}

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

))}
)} ) : (

))}

{intl.formatMessage(messages.title)}
); } } export default connect(mapStateToProps)(injectIntl(About));