diff --git a/app/javascript/mastodon/features/bookmark_categories/index.jsx b/app/javascript/mastodon/features/bookmark_categories/index.jsx
index c3f53b8a73..b70b843061 100644
--- a/app/javascript/mastodon/features/bookmark_categories/index.jsx
+++ b/app/javascript/mastodon/features/bookmark_categories/index.jsx
@@ -30,7 +30,7 @@ const getOrderedCategories = createSelector([state => state.get('bookmark_catego
return categories;
}
- return categories.toList().filter(item => !!item).sort((a, b) => a.get('title').localeCompare(b.get('title')));
+ return categories.toList().filter(item => !!item && typeof item.get('title') !== 'undefined' && item.get('title') !== null).sort((a, b) => a.get('title').localeCompare(b.get('title')));
});
const mapStateToProps = state => ({
diff --git a/app/javascript/mastodon/features/bookmark_category_statuses/index.jsx b/app/javascript/mastodon/features/bookmark_category_statuses/index.jsx
index 0b431b334d..a322263596 100644
--- a/app/javascript/mastodon/features/bookmark_category_statuses/index.jsx
+++ b/app/javascript/mastodon/features/bookmark_category_statuses/index.jsx
@@ -68,7 +68,8 @@ class BookmarkCategoryStatuses extends ImmutablePureComponent {
if (columnId) {
dispatch(removeColumn(columnId));
} else {
- dispatch(addColumn('BOOKMARKS_EX', {}));
+ dispatch(addColumn('BOOKMARKS_EX', { id: this.props.params.id }));
+ this.context.router.history.push('/');
}
};
diff --git a/app/javascript/mastodon/features/compose/components/action_bar.jsx b/app/javascript/mastodon/features/compose/components/action_bar.jsx
index 3255cbaf45..4c9622fb94 100644
--- a/app/javascript/mastodon/features/compose/components/action_bar.jsx
+++ b/app/javascript/mastodon/features/compose/components/action_bar.jsx
@@ -49,7 +49,7 @@ class ActionBar extends PureComponent {
menu.push({ text: intl.formatMessage(messages.pins), to: '/pinned' });
menu.push(null);
menu.push({ text: intl.formatMessage(messages.follow_requests), to: '/follow_requests' });
- menu.push({ text: intl.formatMessage(messages.bookmarks), to: '/bookmarks' });
+ menu.push({ text: intl.formatMessage(messages.bookmarks), to: '/bookmark_categories' });
menu.push({ text: intl.formatMessage(messages.favourites), to: '/favourites' });
menu.push({ text: intl.formatMessage(messages.emoji_reactions), to: '/emoji_reactions' });
menu.push({ text: intl.formatMessage(messages.lists), to: '/lists' });
diff --git a/app/javascript/mastodon/features/getting_started/index.jsx b/app/javascript/mastodon/features/getting_started/index.jsx
index f0cd70d7a1..9410938fe5 100644
--- a/app/javascript/mastodon/features/getting_started/index.jsx
+++ b/app/javascript/mastodon/features/getting_started/index.jsx
@@ -38,6 +38,8 @@ const messages = defineMessages({
mutes: { id: 'navigation_bar.mutes', defaultMessage: 'Muted users' },
pins: { id: 'navigation_bar.pins', defaultMessage: 'Pinned posts' },
lists: { id: 'navigation_bar.lists', defaultMessage: 'Lists' },
+ antennas: { id: 'navigation_bar.antennas', defaultMessage: 'Antennas' },
+ circles: { id: 'navigation_bar.circles', defaultMessage: 'Circles' },
discover: { id: 'navigation_bar.discover', defaultMessage: 'Discover' },
personal: { id: 'navigation_bar.personal', defaultMessage: 'Personal' },
security: { id: 'navigation_bar.security', defaultMessage: 'Security' },
@@ -116,9 +118,11 @@ class GettingStarted extends ImmutablePureComponent {
,
,
,
- ,
+ ,
,
,
+ ,
+ ,
);
if (myAccount.get('locked') || unreadFollowRequests > 0) {
diff --git a/app/javascript/mastodon/features/ui/components/columns_area.jsx b/app/javascript/mastodon/features/ui/components/columns_area.jsx
index 47eae61fbe..af549d21ed 100644
--- a/app/javascript/mastodon/features/ui/components/columns_area.jsx
+++ b/app/javascript/mastodon/features/ui/components/columns_area.jsx
@@ -21,6 +21,9 @@ import {
BookmarkedStatuses,
ListTimeline,
Directory,
+ BookmarkCategoryStatuses,
+ AntennaSetting,
+ AntennaTimeline,
} from '../util/async-components';
import BundleColumnError from './bundle_column_error';
@@ -41,6 +44,9 @@ const componentMap = {
'FAVOURITES': FavouritedStatuses,
'EMOJI_REACTIONS': EmojiReactedStatuses,
'BOOKMARKS': BookmarkedStatuses,
+ 'BOOKMARKS_EX': BookmarkCategoryStatuses,
+ 'ANTENNA': AntennaSetting,
+ 'ANTENNA_TIMELINE': AntennaTimeline,
'LIST': ListTimeline,
'DIRECTORY': Directory,
};
diff --git a/app/javascript/mastodon/reducers/settings.js b/app/javascript/mastodon/reducers/settings.js
index 23e1195e9b..98e2bb843f 100644
--- a/app/javascript/mastodon/reducers/settings.js
+++ b/app/javascript/mastodon/reducers/settings.js
@@ -1,6 +1,7 @@
import { Map as ImmutableMap, fromJS } from 'immutable';
import { ANTENNA_DELETE_SUCCESS, ANTENNA_FETCH_FAIL } from 'mastodon/actions/antennas';
+import { BOOKMARK_CATEGORY_DELETE_SUCCESS, BOOKMARK_CATEGORY_FETCH_FAIL } from 'mastodon/actions/bookmark_categories';
import { CIRCLE_DELETE_SUCCESS, CIRCLE_FETCH_FAIL } from 'mastodon/actions/circles';
import { COLUMN_ADD, COLUMN_REMOVE, COLUMN_MOVE, COLUMN_PARAMS_CHANGE } from '../actions/columns';
@@ -145,7 +146,9 @@ const updateFrequentLanguages = (state, language) => state.update('frequentlyUse
const filterDeadListColumns = (state, listId) => state.update('columns', columns => columns.filterNot(column => column.get('id') === 'LIST' && column.get('params').get('id') === listId));
-const filterDeadAntennaColumns = (state, antennaId) => state.update('columns', columns => columns.filterNot(column => column.get('id') === 'ANTENNA' && column.get('params').get('id') === antennaId));
+const filterDeadBookmarkCategoryColumns = (state, bookmarkCategoryId) => state.update('columns', columns => columns.filterNot(column => column.get('id') === 'BOOKMARKS_EX' && column.get('params').get('id') === bookmarkCategoryId));
+
+const filterDeadAntennaColumns = (state, antennaId) => state.update('columns', columns => columns.filterNot(column => (column.get('id') === 'ANTENNA' || column.get('id') === 'ANTENNA_TIMELINE') && column.get('params').get('id') === antennaId));
const filterDeadCircleColumns = (state, circleId) => state.update('columns', columns => columns.filterNot(column => column.get('id') === 'CIRCLE' && column.get('params').get('id') === circleId));
@@ -180,6 +183,10 @@ export default function settings(state = initialState, action) {
return action.error.response.status === 404 ? filterDeadListColumns(state, action.id) : state;
case LIST_DELETE_SUCCESS:
return filterDeadListColumns(state, action.id);
+ case BOOKMARK_CATEGORY_FETCH_FAIL:
+ return action.error.response.status === 404 ? filterDeadBookmarkCategoryColumns(state, action.id) : state;
+ case BOOKMARK_CATEGORY_DELETE_SUCCESS:
+ return filterDeadBookmarkCategoryColumns(state, action.id);
case ANTENNA_FETCH_FAIL:
return action.error.response.status === 404 ? filterDeadAntennaColumns(state, action.id) : state;
case ANTENNA_DELETE_SUCCESS: