diff --git a/app/javascript/mastodon/actions/columns.js b/app/javascript/mastodon/actions/columns.js
index f550e6c48d..9b87415fb8 100644
--- a/app/javascript/mastodon/actions/columns.js
+++ b/app/javascript/mastodon/actions/columns.js
@@ -40,12 +40,13 @@ export function moveColumn(uuid, direction) {
};
};
-export function changeColumnParams(uuid, params) {
+export function changeColumnParams(uuid, path, value) {
return dispatch => {
dispatch({
type: COLUMN_PARAMS_CHANGE,
uuid,
- params,
+ path,
+ value,
});
dispatch(saveSettings());
diff --git a/app/javascript/mastodon/features/community_timeline/components/column_settings.js b/app/javascript/mastodon/features/community_timeline/components/column_settings.js
index a992b27bbd..3a1d19aa81 100644
--- a/app/javascript/mastodon/features/community_timeline/components/column_settings.js
+++ b/app/javascript/mastodon/features/community_timeline/components/column_settings.js
@@ -3,6 +3,7 @@ import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import SettingText from '../../../components/setting_text';
+import SettingToggle from '../../notifications/components/setting_toggle';
const messages = defineMessages({
filter_regex: { id: 'home.column_settings.filter_regex', defaultMessage: 'Filter out by regular expressions' },
@@ -16,6 +17,7 @@ export default class ColumnSettings extends React.PureComponent {
settings: ImmutablePropTypes.map.isRequired,
onChange: PropTypes.func.isRequired,
intl: PropTypes.object.isRequired,
+ columnId: PropTypes.string,
};
render () {
@@ -23,6 +25,10 @@ export default class ColumnSettings extends React.PureComponent {
return (
+
+ } />
+
+
diff --git a/app/javascript/mastodon/features/community_timeline/components/section_headline.js b/app/javascript/mastodon/features/community_timeline/components/section_headline.js
deleted file mode 100644
index c7176d04b8..0000000000
--- a/app/javascript/mastodon/features/community_timeline/components/section_headline.js
+++ /dev/null
@@ -1,59 +0,0 @@
-import PropTypes from 'prop-types';
-import React, { Component, Fragment } from 'react';
-import { FormattedMessage } from 'react-intl';
-import { NavLink } from 'react-router-dom';
-
-export default class SectionHeadline extends Component {
-
- static propTypes = {
- timelineId: PropTypes.string.isRequired,
- to: PropTypes.string.isRequired,
- pinned: PropTypes.bool.isRequired,
- onlyMedia: PropTypes.bool.isRequired,
- onClick: PropTypes.func,
- };
-
- shouldComponentUpdate (nextProps) {
- return (
- this.props.onlyMedia !== nextProps.onlyMedia ||
- this.props.pinned !== nextProps.pinned ||
- this.props.to !== nextProps.to ||
- this.props.timelineId !== nextProps.timelineId
- );
- }
-
- handleClick = e => {
- const { onClick } = this.props;
-
- if (typeof onClick === 'function') {
- e.preventDefault();
-
- onClick.call(this, e);
- }
- }
-
- render () {
- const { timelineId, to, pinned, onlyMedia } = this.props;
-
- return (
-
- {pinned ? (
-
-
-
-
-
-
-
-
- ) : (
-
-
-
-
- )}
-
- );
- }
-
-}
diff --git a/app/javascript/mastodon/features/community_timeline/containers/column_settings_container.js b/app/javascript/mastodon/features/community_timeline/containers/column_settings_container.js
index f3489b4095..405064c3fc 100644
--- a/app/javascript/mastodon/features/community_timeline/containers/column_settings_container.js
+++ b/app/javascript/mastodon/features/community_timeline/containers/column_settings_container.js
@@ -1,17 +1,28 @@
import { connect } from 'react-redux';
import ColumnSettings from '../components/column_settings';
import { changeSetting } from '../../../actions/settings';
+import { changeColumnParams } from '../../../actions/columns';
-const mapStateToProps = state => ({
- settings: state.getIn(['settings', 'community']),
-});
+const mapStateToProps = (state, { columnId }) => {
+ const uuid = columnId;
+ const columns = state.getIn(['settings', 'columns']);
+ const index = columns.findIndex(c => c.get('uuid') === uuid);
-const mapDispatchToProps = dispatch => ({
+ return {
+ settings: (uuid && index >= 0) ? columns.get(index).get('params') : state.getIn(['settings', 'community']),
+ };
+};
- onChange (key, checked) {
- dispatch(changeSetting(['community', ...key], checked));
- },
-
-});
+const mapDispatchToProps = (dispatch, { columnId }) => {
+ return {
+ onChange (key, checked) {
+ if (columnId) {
+ dispatch(changeColumnParams(columnId, key, checked));
+ } else {
+ dispatch(changeSetting(['community', ...key], checked));
+ }
+ },
+ };
+};
export default connect(mapStateToProps, mapDispatchToProps)(ColumnSettings);
diff --git a/app/javascript/mastodon/features/community_timeline/index.js b/app/javascript/mastodon/features/community_timeline/index.js
index d375edbd51..eb9ad97a2b 100644
--- a/app/javascript/mastodon/features/community_timeline/index.js
+++ b/app/javascript/mastodon/features/community_timeline/index.js
@@ -6,23 +6,33 @@ import StatusListContainer from '../ui/containers/status_list_container';
import Column from '../../components/column';
import ColumnHeader from '../../components/column_header';
import { expandCommunityTimeline } from '../../actions/timelines';
-import { addColumn, removeColumn, moveColumn, changeColumnParams } from '../../actions/columns';
+import { addColumn, removeColumn, moveColumn } from '../../actions/columns';
import ColumnSettingsContainer from './containers/column_settings_container';
-import SectionHeadline from './components/section_headline';
import { connectCommunityStream } from '../../actions/streaming';
const messages = defineMessages({
title: { id: 'column.community', defaultMessage: 'Local timeline' },
});
-const mapStateToProps = (state, { onlyMedia }) => ({
- hasUnread: state.getIn(['timelines', `community${onlyMedia ? ':media' : ''}`, 'unread']) > 0,
-});
+const mapStateToProps = (state, { onlyMedia, columnId }) => {
+ const uuid = columnId;
+ const columns = state.getIn(['settings', 'columns']);
+ const index = columns.findIndex(c => c.get('uuid') === uuid);
+
+ return {
+ hasUnread: state.getIn(['timelines', `community${onlyMedia ? ':media' : ''}`, 'unread']) > 0,
+ onlyMedia: (columnId && index >= 0) ? columns.get(index).getIn(['params', 'other', 'onlyMedia']) : state.getIn(['settings', 'community', 'other', 'onlyMedia']),
+ };
+};
@connect(mapStateToProps)
@injectIntl
export default class CommunityTimeline extends React.PureComponent {
+ static contextTypes = {
+ router: PropTypes.object,
+ };
+
static defaultProps = {
onlyMedia: false,
};
@@ -89,27 +99,10 @@ export default class CommunityTimeline extends React.PureComponent {
dispatch(expandCommunityTimeline({ maxId, onlyMedia }));
}
- handleHeadlineLinkClick = e => {
- const { columnId, dispatch } = this.props;
- const onlyMedia = /\/media$/.test(e.currentTarget.href);
-
- dispatch(changeColumnParams(columnId, { other: { onlyMedia } }));
- }
-
render () {
const { intl, hasUnread, columnId, multiColumn, onlyMedia } = this.props;
const pinned = !!columnId;
- const headline = (
-
- );
-
return (
-
+
+
+
+
+
+
+
+ );
+ }
+
+}
diff --git a/app/javascript/mastodon/features/direct_timeline/containers/column_settings_container.js b/app/javascript/mastodon/features/direct_timeline/containers/column_settings_container.js
index 1833f69e5c..38054ce9eb 100644
--- a/app/javascript/mastodon/features/direct_timeline/containers/column_settings_container.js
+++ b/app/javascript/mastodon/features/direct_timeline/containers/column_settings_container.js
@@ -1,5 +1,5 @@
import { connect } from 'react-redux';
-import ColumnSettings from '../../community_timeline/components/column_settings';
+import ColumnSettings from '../components/column_settings';
import { changeSetting } from '../../../actions/settings';
const mapStateToProps = state => ({
diff --git a/app/javascript/mastodon/features/public_timeline/containers/column_settings_container.js b/app/javascript/mastodon/features/public_timeline/containers/column_settings_container.js
index 203e1da926..c56caa59e7 100644
--- a/app/javascript/mastodon/features/public_timeline/containers/column_settings_container.js
+++ b/app/javascript/mastodon/features/public_timeline/containers/column_settings_container.js
@@ -1,17 +1,28 @@
import { connect } from 'react-redux';
import ColumnSettings from '../../community_timeline/components/column_settings';
import { changeSetting } from '../../../actions/settings';
+import { changeColumnParams } from '../../../actions/columns';
-const mapStateToProps = state => ({
- settings: state.getIn(['settings', 'public']),
-});
+const mapStateToProps = (state, { columnId }) => {
+ const uuid = columnId;
+ const columns = state.getIn(['settings', 'columns']);
+ const index = columns.findIndex(c => c.get('uuid') === uuid);
-const mapDispatchToProps = dispatch => ({
+ return {
+ settings: (uuid && index >= 0) ? columns.get(index).get('params') : state.getIn(['settings', 'public']),
+ };
+};
- onChange (key, checked) {
- dispatch(changeSetting(['public', ...key], checked));
- },
-
-});
+const mapDispatchToProps = (dispatch, { columnId }) => {
+ return {
+ onChange (key, checked) {
+ if (columnId) {
+ dispatch(changeColumnParams(columnId, key, checked));
+ } else {
+ dispatch(changeSetting(['public', ...key], checked));
+ }
+ },
+ };
+};
export default connect(mapStateToProps, mapDispatchToProps)(ColumnSettings);
diff --git a/app/javascript/mastodon/features/public_timeline/index.js b/app/javascript/mastodon/features/public_timeline/index.js
index 341af582ae..2d5bb3baf7 100644
--- a/app/javascript/mastodon/features/public_timeline/index.js
+++ b/app/javascript/mastodon/features/public_timeline/index.js
@@ -6,23 +6,33 @@ import StatusListContainer from '../ui/containers/status_list_container';
import Column from '../../components/column';
import ColumnHeader from '../../components/column_header';
import { expandPublicTimeline } from '../../actions/timelines';
-import { addColumn, removeColumn, moveColumn, changeColumnParams } from '../../actions/columns';
+import { addColumn, removeColumn, moveColumn } from '../../actions/columns';
import ColumnSettingsContainer from './containers/column_settings_container';
-import SectionHeadline from '../community_timeline/components/section_headline';
import { connectPublicStream } from '../../actions/streaming';
const messages = defineMessages({
title: { id: 'column.public', defaultMessage: 'Federated timeline' },
});
-const mapStateToProps = (state, { onlyMedia }) => ({
- hasUnread: state.getIn(['timelines', `public${onlyMedia ? ':media' : ''}`, 'unread']) > 0,
-});
+const mapStateToProps = (state, { onlyMedia, columnId }) => {
+ const uuid = columnId;
+ const columns = state.getIn(['settings', 'columns']);
+ const index = columns.findIndex(c => c.get('uuid') === uuid);
+
+ return {
+ hasUnread: state.getIn(['timelines', `public${onlyMedia ? ':media' : ''}`, 'unread']) > 0,
+ onlyMedia: (columnId && index >= 0) ? columns.get(index).getIn(['params', 'other', 'onlyMedia']) : state.getIn(['settings', 'public', 'other', 'onlyMedia']),
+ };
+};
@connect(mapStateToProps)
@injectIntl
export default class PublicTimeline extends React.PureComponent {
+ static contextTypes = {
+ router: PropTypes.object,
+ };
+
static defaultProps = {
onlyMedia: false,
};
@@ -89,27 +99,17 @@ export default class PublicTimeline extends React.PureComponent {
dispatch(expandPublicTimeline({ maxId, onlyMedia }));
}
- handleHeadlineLinkClick = e => {
- const { columnId, dispatch } = this.props;
- const onlyMedia = /\/media$/.test(e.currentTarget.href);
-
- dispatch(changeColumnParams(columnId, { other: { onlyMedia } }));
+ handleSettingChanged = (key, checked) => {
+ const { columnId } = this.props;
+ if (!columnId && key[0] === 'other' && key[1] === 'onlyMedia') {
+ this.context.router.history.replace(`/timelines/public${checked ? '/media' : ''}`);
+ }
}
render () {
const { intl, columnId, hasUnread, multiColumn, onlyMedia } = this.props;
const pinned = !!columnId;
- const headline = (
-
- );
-
return (
-
+
{
.set('saved', false);
};
-const changeColumnParams = (state, uuid, params) => {
+const changeColumnParams = (state, uuid, path, value) => {
const columns = state.get('columns');
const index = columns.findIndex(item => item.get('uuid') === uuid);
- const newColumns = columns.update(index, column => column.update('params', () => fromJS(params)));
+ const newColumns = columns.update(index, column => column.updateIn(['params', ...path], () => value));
return state
.set('columns', newColumns)
@@ -127,7 +127,7 @@ export default function settings(state = initialState, action) {
case COLUMN_MOVE:
return moveColumn(state, action.uuid, action.direction);
case COLUMN_PARAMS_CHANGE:
- return changeColumnParams(state, action.uuid, action.params);
+ return changeColumnParams(state, action.uuid, action.path, action.value);
case EMOJI_USE:
return updateFrequentEmojis(state, action.emoji);
case SETTING_SAVE:
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 42eebb05c3..0a75a64dd1 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -4806,8 +4806,6 @@ a.status-card {
}
}
-.community-timeline__section-headline,
-.public-timeline__section-headline,
.account__section-headline {
background: darken($ui-base-color, 4%);
border-bottom: 1px solid lighten($ui-base-color, 8%);