static propTypes = {
children: PropTypes.node,
label: PropTypes.string,
+ bindToDocument: PropTypes.bool,
};
scrollTop () {
- const scrollable = this.node.querySelector('.scrollable');
+ const scrollable = this.props.bindToDocument ? document.scrollingElement : this.node.querySelector('.scrollable');
if (!scrollable) {
return;
}
componentDidMount () {
- this.node.addEventListener('wheel', this.handleWheel, detectPassiveEvents.hasSupport ? { passive: true } : false);
+ if (this.props.bindToDocument) {
+ document.addEventListener('wheel', this.handleWheel, detectPassiveEvents.hasSupport ? { passive: true } : false);
+ } else {
+ this.node.addEventListener('wheel', this.handleWheel, detectPassiveEvents.hasSupport ? { passive: true } : false);
+ }
}
componentWillUnmount () {
- this.node.removeEventListener('wheel', this.handleWheel);
+ if (this.props.bindToDocument) {
+ document.removeEventListener('wheel', this.handleWheel);
+ } else {
+ this.node.removeEventListener('wheel', this.handleWheel);
+ }
}
render () {
import { FormattedMessage } from 'react-intl';
import PropTypes from 'prop-types';
import Icon from 'mastodon/components/icon';
+import { createPortal } from 'react-dom';
export default class ColumnBackButton extends React.PureComponent {
router: PropTypes.object,
};
+ static propTypes = {
+ multiColumn: PropTypes.bool,
+ };
+
handleClick = () => {
if (window.history && window.history.length === 1) {
this.context.router.history.push('/');
}
render () {
- return (
+ const { multiColumn } = this.props;
+
+ const component = (
<button onClick={this.handleClick} className='column-back-button'>
<Icon id='chevron-left' className='column-back-button__icon' fixedWidth />
<FormattedMessage id='column_back_button.label' defaultMessage='Back' />
</button>
);
+
+ if (multiColumn) {
+ return component;
+ } else {
+ return createPortal(component, document.getElementById('tabs-bar__portal'));
+ }
}
}
isLoading: PropTypes.bool,
hasMore: PropTypes.bool,
isAccount: PropTypes.bool,
+ multiColumn: PropTypes.bool,
};
state = {
}
render () {
- const { attachments, shouldUpdateScroll, isLoading, hasMore, isAccount } = this.props;
+ const { attachments, shouldUpdateScroll, isLoading, hasMore, isAccount, multiColumn } = this.props;
const { width } = this.state;
if (!isAccount) {
return (
<Column>
- <ColumnBackButton />
+ <ColumnBackButton multiColumn={multiColumn} />
<ScrollContainer scrollKey='account_gallery' shouldUpdateScroll={shouldUpdateScroll}>
<div className='scrollable scrollable--flex' onScroll={this.handleScroll}>
return (
<Column>
- <ColumnBackButton />
+ <ColumnBackButton multiColumn={multiColumn} />
<StatusList
prepend={<HeaderContainer accountId={this.props.params.accountId} />}
const emptyMessage = <FormattedMessage id='empty_column.blocks' defaultMessage="You haven't blocked any users yet." />;
return (
- <Column icon='ban' heading={intl.formatMessage(messages.heading)}>
+ <Column bindToDocument={!multiColumn} icon='ban' heading={intl.formatMessage(messages.heading)}>
<ColumnBackButtonSlim />
<ScrollableList
scrollKey='blocks'
const pinned = !!columnId;
return (
- <Column ref={this.setRef} label={intl.formatMessage(messages.title)}>
+ <Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.title)}>
<ColumnHeader
icon='users'
active={hasUnread}
const pinned = !!columnId;
return (
- <Column ref={this.setRef} label={intl.formatMessage(messages.title)}>
+ <Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.title)}>
<ColumnHeader
icon='envelope'
active={hasUnread}
const emptyMessage = <FormattedMessage id='empty_column.domain_blocks' defaultMessage='There are no hidden domains yet.' />;
return (
- <Column icon='minus-circle' heading={intl.formatMessage(messages.heading)}>
+ <Column bindToDocument={!multiColumn} icon='minus-circle' heading={intl.formatMessage(messages.heading)}>
<ColumnBackButtonSlim />
<ScrollableList
scrollKey='domain_blocks'
const emptyMessage = <FormattedMessage id='empty_column.favourited_statuses' defaultMessage="You don't have any favourite toots yet. When you favourite one, it will show up here." />;
return (
- <Column ref={this.setRef} label={intl.formatMessage(messages.heading)}>
+ <Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.heading)}>
<ColumnHeader
icon='star'
title={intl.formatMessage(messages.heading)}
return (
<Column>
- <ColumnBackButton />
+ <ColumnBackButton multiColumn={multiColumn} />
<ScrollableList
scrollKey='favourites'
const emptyMessage = <FormattedMessage id='empty_column.follow_requests' defaultMessage="You don't have any follow requests yet. When you receive one, it will show up here." />;
return (
- <Column icon='user-plus' heading={intl.formatMessage(messages.heading)}>
+ <Column bindToDocument={!multiColumn} icon='user-plus' heading={intl.formatMessage(messages.heading)}>
<ColumnBackButtonSlim />
<ScrollableList
scrollKey='follow_requests'
return (
<Column>
- <ColumnBackButton />
+ <ColumnBackButton multiColumn={multiColumn} />
<ScrollableList
scrollKey='followers'
return (
<Column>
- <ColumnBackButton />
+ <ColumnBackButton multiColumn={multiColumn} />
<ScrollableList
scrollKey='following'
}
return (
- <Column label={intl.formatMessage(messages.menu)}>
+ <Column bindToDocument={!multiColumn} label={intl.formatMessage(messages.menu)}>
{multiColumn && <div className='column-header__wrapper'>
<h1 className='column-header'>
<button>
const pinned = !!columnId;
return (
- <Column ref={this.setRef} label={`#${id}`}>
+ <Column bindToDocument={!multiColumn} ref={this.setRef} label={`#${id}`}>
<ColumnHeader
icon='hashtag'
active={hasUnread}
const pinned = !!columnId;
return (
- <Column ref={this.setRef} label={intl.formatMessage(messages.title)}>
+ <Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.title)}>
<ColumnHeader
icon='home'
active={hasUnread}
};
render () {
- const { intl } = this.props;
+ const { intl, multiColumn } = this.props;
return (
- <Column icon='question' heading={intl.formatMessage(messages.heading)}>
+ <Column bindToDocument={!multiColumn} icon='question' heading={intl.formatMessage(messages.heading)}>
<ColumnBackButtonSlim />
<div className='keyboard-shortcuts scrollable optionally-scrollable'>
<table>
} else if (list === false) {
return (
<Column>
- <ColumnBackButton />
+ <ColumnBackButton multiColumn={multiColumn} />
<MissingIndicator />
</Column>
);
}
return (
- <Column ref={this.setRef} label={title}>
+ <Column bindToDocument={!multiColumn} ref={this.setRef} label={title}>
<ColumnHeader
icon='list-ul'
active={hasUnread}
const emptyMessage = <FormattedMessage id='empty_column.lists' defaultMessage="You don't have any lists yet. When you create one, it will show up here." />;
return (
- <Column icon='list-ul' heading={intl.formatMessage(messages.heading)}>
+ <Column bindToDocument={!multiColumn} icon='list-ul' heading={intl.formatMessage(messages.heading)}>
<ColumnBackButtonSlim />
<NewListForm />
const emptyMessage = <FormattedMessage id='empty_column.mutes' defaultMessage="You haven't muted any users yet." />;
return (
- <Column icon='volume-off' heading={intl.formatMessage(messages.heading)}>
+ <Column bindToDocument={!multiColumn} icon='volume-off' heading={intl.formatMessage(messages.heading)}>
<ColumnBackButtonSlim />
<ScrollableList
scrollKey='mutes'
);
return (
- <Column ref={this.setColumnRef} label={intl.formatMessage(messages.title)}>
+ <Column bindToDocument={!multiColumn} ref={this.setColumnRef} label={intl.formatMessage(messages.title)}>
<ColumnHeader
icon='bell'
active={isUnread}
const { intl, shouldUpdateScroll, statusIds, hasMore, multiColumn } = this.props;
return (
- <Column icon='thumb-tack' heading={intl.formatMessage(messages.heading)} ref={this.setRef}>
+ <Column bindToDocument={!multiColumn} icon='thumb-tack' heading={intl.formatMessage(messages.heading)} ref={this.setRef}>
<ColumnBackButtonSlim />
<StatusList
statusIds={statusIds}
const pinned = !!columnId;
return (
- <Column ref={this.setRef} label={intl.formatMessage(messages.title)}>
+ <Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.title)}>
<ColumnHeader
icon='globe'
active={hasUnread}
return (
<Column>
- <ColumnBackButton />
+ <ColumnBackButton multiColumn={multiColumn} />
<ScrollableList
scrollKey='reblogs'
};
return (
- <Column label={intl.formatMessage(messages.detailedStatus)}>
+ <Column bindToDocument={!multiColumn} label={intl.formatMessage(messages.detailedStatus)}>
<ColumnHeader
showBackButton
multiColumn={multiColumn}
}
.column-back-button {
+ box-sizing: border-box;
+ width: 100%;
background: lighten($ui-base-color, 4%);
color: $highlight-text-color;
cursor: pointer;