import React from 'react';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';
import { createPortal } from 'react-dom';
import classNames from 'classnames';
import { FormattedMessage, injectIntl, defineMessages } from 'react-intl';
import Icon from 'mastodon/components/icon';
import { enableEmptyColumn, defaultColumnWidth } from 'mastodon/initial_state';
const messages = defineMessages({
show: { id: 'column_header.show_settings', defaultMessage: 'Show settings' },
hide: { id: 'column_header.hide_settings', defaultMessage: 'Hide settings' },
moveLeft: { id: 'column_header.moveLeft_settings', defaultMessage: 'Move column to the left' },
moveRight: { id: 'column_header.moveRight_settings', defaultMessage: 'Move column to the right' },
});
const column_width_message = [
{ id: 'x080', defaultMessage: },
{ id: 'x100', defaultMessage: },
{ id: 'x125', defaultMessage: },
{ id: 'x150', defaultMessage: },
{ id: 'free', defaultMessage: },
];
const mapStateToProps = (state, { columnWidth }) => ({
columnWidth: columnWidth ?? defaultColumnWidth,
});
export default @connect(mapStateToProps)
@injectIntl
class ColumnHeader extends React.PureComponent {
static contextTypes = {
router: PropTypes.object,
};
static propTypes = {
intl: PropTypes.object.isRequired,
title: PropTypes.node,
icon: PropTypes.string,
active: PropTypes.bool,
multiColumn: PropTypes.bool,
extraButton: PropTypes.node,
showBackButton: PropTypes.bool,
children: PropTypes.node,
pinned: PropTypes.bool,
placeholder: PropTypes.bool,
onPin: PropTypes.func,
onMove: PropTypes.func,
onClick: PropTypes.func,
appendContent: PropTypes.node,
collapseIssues: PropTypes.bool,
columnWidth: PropTypes.string,
onWidthChange: PropTypes.func,
};
state = {
collapsed: true,
animating: false,
};
historyBack = () => {
if (window.history && window.history.length === 1) {
this.context.router.history.push('/');
} else {
this.context.router.history.goBack();
}
}
handleToggleClick = (e) => {
e.stopPropagation();
this.setState({ collapsed: !this.state.collapsed, animating: true });
}
handleTitleClick = () => {
this.props.onClick();
}
handleMoveLeft = () => {
this.props.onMove(-1);
}
handleMoveRight = () => {
this.props.onMove(1);
}
handleBackClick = () => {
this.historyBack();
}
handleCloseClick = () => {
this.context.router.history.push('/empty');
}
handleTransitionEnd = () => {
this.setState({ animating: false });
}
handlePin = () => {
if (!this.props.pinned) {
this.context.router.history.replace('/');
}
this.props.onPin();
}
handleChangeWidth = e => {
e.stopPropagation();
if (this.props.onWidthChange) {
this.props.onWidthChange(e.target.value);
}
}
render () {
const { title, icon, active, children, pinned, multiColumn, extraButton, showBackButton, intl: { formatMessage }, placeholder, appendContent, collapseIssues, columnWidth } = this.props;
const { collapsed, animating } = this.state;
const wrapperClassName = classNames('column-header__wrapper', {
'active': active,
});
const buttonClassName = classNames('column-header', {
'active': active,
});
const collapsibleClassName = classNames('column-header__collapsible', {
'collapsed': collapsed,
'animating': animating,
});
const collapsibleButtonClassName = classNames('column-header__button', {
'active': !collapsed,
});
let extraContent, pinButton, moveButtons, backButton, collapseButton;
if (children) {
extraContent = (
{children}
);
}
if (multiColumn && pinned) {
pinButton = ;
moveButtons = (
);
} else if (multiColumn && this.props.onPin) {
pinButton = ;
}
if (!pinned && (multiColumn || showBackButton)) {
backButton = multiColumn && enableEmptyColumn ? (
) : (
);
}
const widthButton = (
);
const collapsedContent = [
extraContent,
];
if (multiColumn) {
collapsedContent.unshift(widthButton);
collapsedContent.push(moveButtons);
collapsedContent.push(pinButton);
}
if (children || (multiColumn && this.props.onPin)) {
collapseButton = (
{collapseIssues && }
);
}
const hasTitle = icon && title;
const component = (
{hasTitle && (
{title}
)}
{!hasTitle && backButton}
{hasTitle && backButton}
{extraButton}
{collapseButton}
{(!collapsed || animating) && collapsedContent}
{appendContent}
);
if (multiColumn || placeholder) {
return component;
} else {
// The portal container and the component may be rendered to the DOM in
// the same React render pass, so the container might not be available at
// the time `render()` is called.
const container = document.getElementById('tabs-bar__portal');
if (container === null) {
// The container wasn't available, force a re-render so that the
// component can eventually be inserted in the container and not scroll
// with the rest of the area.
this.forceUpdate();
return component;
} else {
return createPortal(component, container);
}
}
}
}