import PropTypes from "prop-types"; import { PureComponent } from "react"; import { defineMessages, injectIntl, FormattedMessage } from "react-intl"; import classNames from "classnames"; import { Helmet } from "react-helmet"; import { List as ImmutableList } from "immutable"; import ImmutablePropTypes from "react-immutable-proptypes"; import { connect } from "react-redux"; import { fetchServer, fetchDomainBlocks } from "flavours/glitch/actions/server"; import Column from "flavours/glitch/components/column"; import { Icon } from "flavours/glitch/components/icon"; import { ServerHeroImage } from "flavours/glitch/components/server_hero_image"; import { Skeleton } from "flavours/glitch/components/skeleton"; import Account from "flavours/glitch/containers/account_container"; import LinkFooter from "flavours/glitch/features/ui/components/link_footer"; 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"]), domainBlocks: state.getIn(["server", "domainBlocks"]), }); class Section extends 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}
)}
); } } class About extends PureComponent { static propTypes = { server: 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()); } handleDomainBlocksOpen = () => { const { dispatch } = this.props; dispatch(fetchDomainBlocks()); }; render () { const { multiColumn, intl, server, domainBlocks } = this.props; const isLoading = server.get("isLoading"); return (
`${value} ${key.replace("@", "")}`).join(", ")} className='about__header__hero' />

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

torment }} />


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


) : (server.get("description")?.length > 0 ? (
) : (

))}
{!isLoading && (server.get("rules", ImmutableList()).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)}
); } } export default connect(mapStateToProps)(injectIntl(About));