'use strict'; import classNames from 'classnames'; import { List as ImmutableList } from 'immutable'; import PropTypes from 'prop-types'; import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import { connect } from 'react-redux'; import { initAccountNoteModal } from 'soapbox/actions/account_notes'; import Badge from 'soapbox/components/badge'; import Icon from 'soapbox/components/icon'; import VerificationBadge from 'soapbox/components/verification_badge'; import BundleContainer from 'soapbox/features/ui/containers/bundle_container'; import { CryptoAddress } from 'soapbox/features/ui/util/async-components'; import { getAcct, isAdmin, isModerator, isLocal } from 'soapbox/utils/accounts'; import { displayFqn } from 'soapbox/utils/state'; import ProfileStats from './profile_stats'; const TICKER_REGEX = /\$([a-zA-Z]*)/i; const getTicker = value => (value.match(TICKER_REGEX) || [])[1]; const isTicker = value => Boolean(getTicker(value)); const messages = defineMessages({ linkVerifiedOn: { id: 'account.link_verified_on', defaultMessage: 'Ownership of this link was checked on {date}' }, account_locked: { id: 'account.locked_info', defaultMessage: 'This account privacy status is set to locked. The owner manually reviews who can follow them.' }, deactivated: { id: 'account.deactivated', defaultMessage: 'Deactivated' }, bot: { id: 'account.badges.bot', defaultMessage: 'Bot' }, }); const dateFormatOptions = { month: 'short', day: 'numeric', year: 'numeric', hour12: false, hour: '2-digit', minute: '2-digit', }; class ProfileInfoPanel extends ImmutablePureComponent { static propTypes = { account: ImmutablePropTypes.map, identity_proofs: ImmutablePropTypes.list, intl: PropTypes.object.isRequired, username: PropTypes.string, displayFqn: PropTypes.bool, onShowNote: PropTypes.func, }; getStaffBadge = () => { const { account } = this.props; if (isAdmin(account)) { return ; } else if (isModerator(account)) { return ; } else { return null; } } getBadges = () => { const { account } = this.props; const staffBadge = this.getStaffBadge(); const isPatron = account.getIn(['patron', 'is_patron']); const badges = []; if (staffBadge) { badges.push(staffBadge); } if (isPatron) { badges.push(); } return badges; } getBirthday = () => { const { account, intl } = this.props; const birthday = account.get('birthday'); if (!birthday) return null; const formattedBirthday = intl.formatDate(birthday, { timeZone: 'UTC', day: 'numeric', month: 'long', year: 'numeric' }); const date = new Date(birthday); const today = new Date(); const hasBirthday = date.getDate() === today.getDate() && date.getMonth() === today.getMonth(); if (hasBirthday) { return (
); } return (
); } handleShowNote = e => { const { account, onShowNote } = this.props; e.preventDefault(); onShowNote(account); } render() { const { account, displayFqn, intl, identity_proofs, username } = this.props; if (!account) { return (

@{username}

); } const content = { __html: account.get('note_emojified') }; const fields = account.get('fields'); const deactivated = !account.getIn(['pleroma', 'is_active'], true); const displayNameHtml = deactivated ? { __html: intl.formatMessage(messages.deactivated) } : { __html: account.get('display_name_html') }; const memberSinceDate = intl.formatDate(account.get('created_at'), { month: 'long', year: 'numeric' }); const verified = account.get('verified'); const badges = this.getBadges(); return (

{verified && } {account.get('bot') && } @{getAcct(account, displayFqn)} {account.get('locked') && ( )}

{badges.length > 0 && (
{badges}
)}
{ (account.get('note').length > 0 && account.get('note') !== '

') &&
} {isLocal(account) &&
} {this.getBirthday()} {account.get('location') && (
{account.get('location')}
)} {!!account.getIn(['relationship', 'note']) && ( )} {(fields.size > 0 || identity_proofs.size > 0) && (
{identity_proofs.map((proof, i) => (
))} {fields.map((pair, i) => isTicker(pair.get('name', '')) ? ( {Component => ( )} ) : (
{pair.get('verified_at') && }
), )}
)}
); } } const mapStateToProps = (state, { account }) => { const identity_proofs = account ? state.getIn(['identity_proofs', account.get('id')], ImmutableList()) : ImmutableList(); return { identity_proofs, domain: state.getIn(['meta', 'domain']), displayFqn: displayFqn(state), }; }; const mapDispatchToProps = (dispatch) => ({ onShowNote(account) { dispatch(initAccountNoteModal(account)); }, }); export default injectIntl( connect(mapStateToProps, mapDispatchToProps, null, { forwardRef: true, }, )(ProfileInfoPanel));