commit: 3fbf1bf35acf89d1e397fa2e632529bf5105fe02
parent: cd9b2ab2f70b6c1da5d0abeaa88eecdfc1b41f78
Author: Eugen Rochko <eugen@zeonfederated.com>
Date: Sat, 15 Jul 2017 00:49:34 +0200
Fix #3773 - Pin favourites column (#4201)
Diffstat:
2 files changed, 48 insertions(+), 19 deletions(-)
diff --git a/app/javascript/mastodon/features/favourited_statuses/index.js b/app/javascript/mastodon/features/favourited_statuses/index.js
@@ -2,11 +2,11 @@ import React from 'react';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
-import LoadingIndicator from '../../components/loading_indicator';
import { fetchFavouritedStatuses, expandFavouritedStatuses } from '../../actions/favourites';
import Column from '../ui/components/column';
+import ColumnHeader from '../../components/column_header';
+import { addColumn, removeColumn, moveColumn } from '../../actions/columns';
import StatusList from '../../components/status_list';
-import ColumnBackButtonSlim from '../../components/column_back_button_slim';
import { defineMessages, injectIntl } from 'react-intl';
import ImmutablePureComponent from 'react-immutable-pure-component';
@@ -16,8 +16,6 @@ const messages = defineMessages({
const mapStateToProps = state => ({
statusIds: state.getIn(['status_lists', 'favourites', 'items']),
- loaded: state.getIn(['status_lists', 'favourites', 'loaded']),
- me: state.getIn(['meta', 'me']),
});
@connect(mapStateToProps)
@@ -27,34 +25,64 @@ export default class Favourites extends ImmutablePureComponent {
static propTypes = {
dispatch: PropTypes.func.isRequired,
statusIds: ImmutablePropTypes.list.isRequired,
- loaded: PropTypes.bool,
intl: PropTypes.object.isRequired,
- me: PropTypes.number.isRequired,
+ columnId: PropTypes.string,
+ multiColumn: PropTypes.bool,
};
componentWillMount () {
this.props.dispatch(fetchFavouritedStatuses());
}
+ handlePin = () => {
+ const { columnId, dispatch } = this.props;
+
+ if (columnId) {
+ dispatch(removeColumn(columnId));
+ } else {
+ dispatch(addColumn('FAVOURITES', {}));
+ }
+ }
+
+ handleMove = (dir) => {
+ const { columnId, dispatch } = this.props;
+ dispatch(moveColumn(columnId, dir));
+ }
+
+ handleHeaderClick = () => {
+ this.column.scrollTop();
+ }
+
+ setRef = c => {
+ this.column = c;
+ }
+
handleScrollToBottom = () => {
this.props.dispatch(expandFavouritedStatuses());
}
render () {
- const { loaded, intl } = this.props;
-
- if (!loaded) {
- return (
- <Column>
- <LoadingIndicator />
- </Column>
- );
- }
+ const { intl, statusIds, columnId, multiColumn } = this.props;
+ const pinned = !!columnId;
return (
- <Column icon='star' heading={intl.formatMessage(messages.heading)}>
- <ColumnBackButtonSlim />
- <StatusList {...this.props} scrollKey='favourited_statuses' onScrollToBottom={this.handleScrollToBottom} />
+ <Column ref={this.setRef}>
+ <ColumnHeader
+ icon='star'
+ title={intl.formatMessage(messages.heading)}
+ onPin={this.handlePin}
+ onMove={this.handleMove}
+ onClick={this.handleHeaderClick}
+ pinned={pinned}
+ multiColumn={multiColumn}
+ />
+
+ <StatusList
+ trackScroll={!pinned}
+ statusIds={statusIds}
+ scrollKey={`favourited_statuses-${columnId}`}
+ onScrollToBottom={this.handleScrollToBottom}
+ />
</Column>
);
}
diff --git a/app/javascript/mastodon/features/ui/components/columns_area.js b/app/javascript/mastodon/features/ui/components/columns_area.js
@@ -9,7 +9,7 @@ import { links, getIndex, getLink } from './tabs_bar';
import BundleContainer from '../containers/bundle_container';
import ColumnLoading from './column_loading';
import BundleColumnError from './bundle_column_error';
-import { Compose, Notifications, HomeTimeline, CommunityTimeline, PublicTimeline, HashtagTimeline } from '../../ui/util/async-components';
+import { Compose, Notifications, HomeTimeline, CommunityTimeline, PublicTimeline, HashtagTimeline, FavouritedStatuses } from '../../ui/util/async-components';
const componentMap = {
'COMPOSE': Compose,
@@ -18,6 +18,7 @@ const componentMap = {
'PUBLIC': PublicTimeline,
'COMMUNITY': CommunityTimeline,
'HASHTAG': HashtagTimeline,
+ 'FAVOURITES': FavouritedStatuses,
};
export default class ColumnsArea extends ImmutablePureComponent {