import PropTypes from "prop-types";
import { defineMessages, injectIntl, FormattedMessage } from "react-intl";
import classNames from "classnames";
import { Helmet } from "react-helmet";
import ImmutablePropTypes from "react-immutable-proptypes";
import ImmutablePureComponent from "react-immutable-pure-component";
import { Avatar } from "flavours/glitch/components/avatar";
import Button from "flavours/glitch/components/button";
import { Icon } from "flavours/glitch/components/icon";
import { IconButton } from "flavours/glitch/components/icon_button";
import DropdownMenuContainer from "flavours/glitch/containers/dropdown_menu_container";
import { autoPlayGif, me, domain } from "flavours/glitch/initial_state";
import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from "flavours/glitch/permissions";
import { preferencesLink, profileLink, accountAdminLink } from "flavours/glitch/utils/backend_links";
import AccountNoteContainer from "../containers/account_note_container";
import FollowRequestNoteContainer from "../containers/follow_request_note_container";
const messages = defineMessages({
unfollow: { id: "account.unfollow", defaultMessage: "Unfollow" },
follow: { id: "account.follow", defaultMessage: "Follow" },
cancel_follow_request: { id: "account.cancel_follow_request", defaultMessage: "Withdraw follow request" },
requested: { id: "account.requested", defaultMessage: "Awaiting approval. Click to cancel follow request" },
unblock: { id: "account.unblock", defaultMessage: "Unblock @{name}" },
edit_profile: { id: "account.edit_profile", defaultMessage: "Edit profile" },
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." },
mention: { id: "account.mention", defaultMessage: "Mention @{name}" },
direct: { id: "account.direct", defaultMessage: "Privately mention @{name}" },
unmute: { id: "account.unmute", defaultMessage: "Unmute @{name}" },
block: { id: "account.block", defaultMessage: "Block @{name}" },
mute: { id: "account.mute", defaultMessage: "Mute @{name}" },
report: { id: "account.report", defaultMessage: "Report @{name}" },
share: { id: "account.share", defaultMessage: "Share @{name}'s profile" },
media: { id: "account.media", defaultMessage: "Media" },
blockDomain: { id: "account.block_domain", defaultMessage: "Block domain {domain}" },
unblockDomain: { id: "account.unblock_domain", defaultMessage: "Unblock domain {domain}" },
hideReblogs: { id: "account.hide_reblogs", defaultMessage: "Hide boosts from @{name}" },
showReblogs: { id: "account.show_reblogs", defaultMessage: "Show boosts from @{name}" },
enableNotifications: { id: "account.enable_notifications", defaultMessage: "Notify me when @{name} posts" },
disableNotifications: { id: "account.disable_notifications", defaultMessage: "Stop notifying me when @{name} posts" },
pins: { id: "navigation_bar.pins", defaultMessage: "Pinned posts" },
preferences: { id: "navigation_bar.preferences", defaultMessage: "Preferences" },
follow_requests: { id: "navigation_bar.follow_requests", defaultMessage: "Follow requests" },
favourites: { id: "navigation_bar.favourites", defaultMessage: "Favorites" },
lists: { id: "navigation_bar.lists", defaultMessage: "Lists" },
followed_tags: { id: "navigation_bar.followed_tags", defaultMessage: "Followed hashtags" },
blocks: { id: "navigation_bar.blocks", defaultMessage: "Blocked users" },
domain_blocks: { id: "navigation_bar.domain_blocks", defaultMessage: "Blocked domains" },
mutes: { id: "navigation_bar.mutes", defaultMessage: "Muted users" },
endorse: { id: "account.endorse", defaultMessage: "Feature on profile" },
unendorse: { id: "account.unendorse", defaultMessage: "Don't feature on profile" },
add_or_remove_from_list: { id: "account.add_or_remove_from_list", defaultMessage: "Add or Remove from lists" },
admin_account: { id: "status.admin_account", defaultMessage: "Open moderation interface for @{name}" },
admin_domain: { id: "status.admin_domain", defaultMessage: "Open moderation interface for {domain}" },
add_account_note: { id: "account.add_account_note", defaultMessage: "Add note for @{name}" },
languages: { id: "account.languages", defaultMessage: "Change subscribed languages" },
openOriginalPage: { id: "account.open_original_page", defaultMessage: "Open original page" },
});
const titleFromAccount = account => {
const displayName = account.get("display_name");
const acct = account.get("acct") === account.get("username") ? `${account.get("username")}@${domain}` : account.get("acct");
const prefix = displayName.trim().length === 0 ? account.get("username") : displayName;
return `${prefix} (@${acct})`;
};
const dateFormatOptions = {
month: "short",
day: "numeric",
year: "numeric",
hour12: false,
hour: "2-digit",
minute: "2-digit",
};
class Header extends ImmutablePureComponent {
static contextTypes = {
identity: PropTypes.object,
};
static propTypes = {
account: ImmutablePropTypes.map,
identity_props: ImmutablePropTypes.list,
onFollow: PropTypes.func.isRequired,
onBlock: PropTypes.func.isRequired,
onMention: PropTypes.func.isRequired,
onDirect: PropTypes.func.isRequired,
onReblogToggle: PropTypes.func.isRequired,
onNotifyToggle: PropTypes.func.isRequired,
onReport: PropTypes.func.isRequired,
onMute: PropTypes.func.isRequired,
onBlockDomain: PropTypes.func.isRequired,
onUnblockDomain: PropTypes.func.isRequired,
onEndorseToggle: PropTypes.func.isRequired,
onAddToList: PropTypes.func.isRequired,
onEditAccountNote: PropTypes.func.isRequired,
onChangeLanguages: PropTypes.func.isRequired,
onInteractionModal: PropTypes.func.isRequired,
onOpenAvatar: PropTypes.func.isRequired,
intl: PropTypes.object.isRequired,
domain: PropTypes.string.isRequired,
hidden: PropTypes.bool,
};
openEditProfile = () => {
window.open(profileLink, "_blank");
};
handleMouseEnter = ({ currentTarget }) => {
if (autoPlayGif) {
return;
}
const emojis = currentTarget.querySelectorAll(".custom-emoji");
for (var i = 0; i < emojis.length; i++) {
let emoji = emojis[i];
emoji.src = emoji.getAttribute("data-original");
}
};
handleMouseLeave = ({ currentTarget }) => {
if (autoPlayGif) {
return;
}
const emojis = currentTarget.querySelectorAll(".custom-emoji");
for (var i = 0; i < emojis.length; i++) {
let emoji = emojis[i];
emoji.src = emoji.getAttribute("data-static");
}
};
handleAvatarClick = e => {
if (e.button === 0 && !(e.ctrlKey || e.metaKey)) {
e.preventDefault();
this.props.onOpenAvatar();
}
};
handleShare = () => {
const { account } = this.props;
navigator.share({
url: account.get("url"),
}).catch((e) => {
if (e.name !== "AbortError") {
console.error(e);
}
});
};
render () {
const { account, hidden, intl, domain } = this.props;
const { signedIn, permissions } = this.context.identity;
if (!account) {
return null;
}
const accountNote = account.getIn(["relationship", "note"]);
const suspended = account.get("suspended");
const isRemote = account.get("acct") !== account.get("username");
const remoteDomain = isRemote ? account.get("acct").split("@")[1] : null;
let info = [];
let actionBtn = "";
let bellBtn = "";
let lockedIcon = "";
let menu = [];
if (me !== account.get("id") && account.getIn(["relationship", "followed_by"])) {
info.push(