import ImmutablePropTypes from 'react-immutable-proptypes' import ImmutablePureComponent from 'react-immutable-pure-component' import { defineMessages, injectIntl } from 'react-intl' import Sticky from 'react-stickynode' import { CX, POPOVER_PROFILE_OPTIONS, PLACEHOLDER_MISSING_HEADER_SRC, MODAL_EDIT_PROFILE, BREAKPOINT_EXTRA_SMALL, } from '../constants' import { openModal } from '../actions/modal' import { openPopover } from '../actions/popover' import { me } from '../initial_state' import AccountActionButton from './account_action_button' import Avatar from './avatar' import Button from './button' import DisplayName from './display_name' import Image from './image' import MovedNote from './moved_note' import TabBar from './tab_bar' import Text from './text' import Responsive from '../features/ui/util/responsive_component'; const messages = defineMessages({ followers: { id: 'account.followers', defaultMessage: 'Followers' }, follows: { id: 'account.follows', defaultMessage: 'Follows' }, profile: { id: 'account.profile', defaultMessage: 'Profile' }, headerPhoto: { id: 'header_photo', defaultMessage: 'Header photo' }, timeline: { id: 'timeline', defaultMessage: 'Timeline' }, comments: { id: 'comments', defaultMessage: 'Comments' }, media: { id: 'media', defaultMessage: 'Media' }, accountFollowsYou: { id: 'account.follows_you', defaultMessage: 'Follows you' }, editProfile: { id: "account.edit_profile", defaultMessage: "Edit profile" }, }) const mapDispatchToProps = (dispatch) => ({ openProfileOptionsPopover(props) { dispatch(openPopover(POPOVER_PROFILE_OPTIONS, props)) }, onEditProfile() { dispatch(openModal(MODAL_EDIT_PROFILE)) }, }); export default @connect(null, mapDispatchToProps) @injectIntl class ProfileHeader extends ImmutablePureComponent { static propTypes = { account: ImmutablePropTypes.map, children: PropTypes.any, intl: PropTypes.object.isRequired, onEditProfile: PropTypes.func.isRequired, openProfileOptionsPopover: PropTypes.func.isRequired, } state = { stickied: false, } handleOnEditProfile = () => { this.props.onEditProfile() } handleOpenMore = () => { const { openProfileOptionsPopover, account } = this.props openProfileOptionsPopover({ account, targetRef: this.openMoreNode, position: 'top', }) } onStickyStateChange = (status) => { if (status.status === Sticky.STATUS_FIXED) { this.setState({ stickied: true }) } else { this.setState({ stickied: false }) } } setOpenMoreNodeRef = (n) => { this.openMoreNode = n } render() { const { account, children, intl, } = this.props const { stickied } = this.state const tabs = !account ? null : [ { to: `/${account.get('acct')}`, title: intl.formatMessage(messages.timeline), }, { to: `/${account.get('acct')}/comments`, title: intl.formatMessage(messages.comments), }, { to: `/${account.get('acct')}/media`, title: intl.formatMessage(messages.media), }, ] const headerSrc = !!account ? account.get('header') : '' const headerMissing = headerSrc.indexOf(PLACEHOLDER_MISSING_HEADER_SRC) > -1 || !headerSrc const avatarSize = headerMissing ? 75 : 150 const top = headerMissing ? -46 : -380 const avatarContainerClasses = CX({ default: 1, circle: 1, mtNeg75PX: !headerMissing, boxShadowProfileAvatar: !headerMissing, }) const stickyBarContainerClasses = CX({ default: 1, flexRow: 1, px15: 1, alignItemsCenter: 1, displayNone: !stickied, }) const tabBarContainerClasses = CX({ default: 1, displayNone: stickied, }) const mobileAvatarContainerClasses = CX({ default: 1, circle: 1, boxShadowProfileAvatar: 1, mtNeg50PX: !headerMissing, }) const mobileDescriptionContainerClasses = CX({ default: 1, width100PC: 1, px15: 1, mt5: !!me, mb10: 1, pt15: !!me, pb10: 1, }) return (