'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, isVerified } 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.getIn(['pleroma', '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 (
);
}
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 = isVerified(account);
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.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));