sforkowany z mirror/soapbox
Bookmark posts
rodzic
444e3641ee
commit
ee97e94779
|
@ -0,0 +1,90 @@
|
||||||
|
import api, { getLinks } from '../api';
|
||||||
|
import { importFetchedStatuses } from './importer';
|
||||||
|
|
||||||
|
export const BOOKMARKED_STATUSES_FETCH_REQUEST = 'BOOKMARKED_STATUSES_FETCH_REQUEST';
|
||||||
|
export const BOOKMARKED_STATUSES_FETCH_SUCCESS = 'BOOKMARKED_STATUSES_FETCH_SUCCESS';
|
||||||
|
export const BOOKMARKED_STATUSES_FETCH_FAIL = 'BOOKMARKED_STATUSES_FETCH_FAIL';
|
||||||
|
|
||||||
|
export const BOOKMARKED_STATUSES_EXPAND_REQUEST = 'BOOKMARKED_STATUSES_EXPAND_REQUEST';
|
||||||
|
export const BOOKMARKED_STATUSES_EXPAND_SUCCESS = 'BOOKMARKED_STATUSES_EXPAND_SUCCESS';
|
||||||
|
export const BOOKMARKED_STATUSES_EXPAND_FAIL = 'BOOKMARKED_STATUSES_EXPAND_FAIL';
|
||||||
|
|
||||||
|
export function fetchBookmarkedStatuses() {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
if (getState().getIn(['status_lists', 'bookmarks', 'isLoading'])) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatch(fetchBookmarkedStatusesRequest());
|
||||||
|
|
||||||
|
api(getState).get('/api/v1/bookmarks').then(response => {
|
||||||
|
const next = getLinks(response).refs.find(link => link.rel === 'next');
|
||||||
|
dispatch(importFetchedStatuses(response.data));
|
||||||
|
dispatch(fetchBookmarkedStatusesSuccess(response.data, next ? next.uri : null));
|
||||||
|
}).catch(error => {
|
||||||
|
dispatch(fetchBookmarkedStatusesFail(error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchBookmarkedStatusesRequest() {
|
||||||
|
return {
|
||||||
|
type: BOOKMARKED_STATUSES_FETCH_REQUEST,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchBookmarkedStatusesSuccess(statuses, next) {
|
||||||
|
return {
|
||||||
|
type: BOOKMARKED_STATUSES_FETCH_SUCCESS,
|
||||||
|
statuses,
|
||||||
|
next,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchBookmarkedStatusesFail(error) {
|
||||||
|
return {
|
||||||
|
type: BOOKMARKED_STATUSES_FETCH_FAIL,
|
||||||
|
error,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function expandBookmarkedStatuses() {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
const url = getState().getIn(['status_lists', 'bookmarks', 'next'], null);
|
||||||
|
|
||||||
|
if (url === null || getState().getIn(['status_lists', 'bookmarks', 'isLoading'])) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatch(expandBookmarkedStatusesRequest());
|
||||||
|
|
||||||
|
api(getState).get(url).then(response => {
|
||||||
|
const next = getLinks(response).refs.find(link => link.rel === 'next');
|
||||||
|
dispatch(importFetchedStatuses(response.data));
|
||||||
|
dispatch(expandBookmarkedStatusesSuccess(response.data, next ? next.uri : null));
|
||||||
|
}).catch(error => {
|
||||||
|
dispatch(expandBookmarkedStatusesFail(error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function expandBookmarkedStatusesRequest() {
|
||||||
|
return {
|
||||||
|
type: BOOKMARKED_STATUSES_EXPAND_REQUEST,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function expandBookmarkedStatusesSuccess(statuses, next) {
|
||||||
|
return {
|
||||||
|
type: BOOKMARKED_STATUSES_EXPAND_SUCCESS,
|
||||||
|
statuses,
|
||||||
|
next,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function expandBookmarkedStatusesFail(error) {
|
||||||
|
return {
|
||||||
|
type: BOOKMARKED_STATUSES_EXPAND_FAIL,
|
||||||
|
error,
|
||||||
|
};
|
||||||
|
};
|
|
@ -1,5 +1,6 @@
|
||||||
import api from '../api';
|
import api from '../api';
|
||||||
import { importFetchedAccounts, importFetchedStatus } from './importer';
|
import { importFetchedAccounts, importFetchedStatus } from './importer';
|
||||||
|
import { showAlert } from 'soapbox/actions/alerts';
|
||||||
|
|
||||||
export const REBLOG_REQUEST = 'REBLOG_REQUEST';
|
export const REBLOG_REQUEST = 'REBLOG_REQUEST';
|
||||||
export const REBLOG_SUCCESS = 'REBLOG_SUCCESS';
|
export const REBLOG_SUCCESS = 'REBLOG_SUCCESS';
|
||||||
|
@ -33,6 +34,14 @@ export const UNPIN_REQUEST = 'UNPIN_REQUEST';
|
||||||
export const UNPIN_SUCCESS = 'UNPIN_SUCCESS';
|
export const UNPIN_SUCCESS = 'UNPIN_SUCCESS';
|
||||||
export const UNPIN_FAIL = 'UNPIN_FAIL';
|
export const UNPIN_FAIL = 'UNPIN_FAIL';
|
||||||
|
|
||||||
|
export const BOOKMARK_REQUEST = 'BOOKMARK_REQUEST';
|
||||||
|
export const BOOKMARK_SUCCESS = 'BOOKMARKED_SUCCESS';
|
||||||
|
export const BOOKMARK_FAIL = 'BOOKMARKED_FAIL';
|
||||||
|
|
||||||
|
export const UNBOOKMARK_REQUEST = 'UNBOOKMARKED_REQUEST';
|
||||||
|
export const UNBOOKMARK_SUCCESS = 'UNBOOKMARKED_SUCCESS';
|
||||||
|
export const UNBOOKMARK_FAIL = 'UNBOOKMARKED_FAIL';
|
||||||
|
|
||||||
export function reblog(status) {
|
export function reblog(status) {
|
||||||
return function(dispatch, getState) {
|
return function(dispatch, getState) {
|
||||||
if (!getState().get('me')) return;
|
if (!getState().get('me')) return;
|
||||||
|
@ -195,6 +204,80 @@ export function unfavouriteFail(status, error) {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export function bookmark(status) {
|
||||||
|
return function(dispatch, getState) {
|
||||||
|
dispatch(bookmarkRequest(status));
|
||||||
|
|
||||||
|
api(getState).post(`/api/v1/statuses/${status.get('id')}/bookmark`).then(function(response) {
|
||||||
|
dispatch(importFetchedStatus(response.data));
|
||||||
|
dispatch(bookmarkSuccess(status, response.data));
|
||||||
|
dispatch(showAlert('', 'Bookmark added'));
|
||||||
|
}).catch(function(error) {
|
||||||
|
dispatch(bookmarkFail(status, error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function unbookmark(status) {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
dispatch(unbookmarkRequest(status));
|
||||||
|
|
||||||
|
api(getState).post(`/api/v1/statuses/${status.get('id')}/unbookmark`).then(response => {
|
||||||
|
dispatch(importFetchedStatus(response.data));
|
||||||
|
dispatch(unbookmarkSuccess(status, response.data));
|
||||||
|
dispatch(showAlert('', 'Bookmark removed'));
|
||||||
|
}).catch(error => {
|
||||||
|
dispatch(unbookmarkFail(status, error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function bookmarkRequest(status) {
|
||||||
|
return {
|
||||||
|
type: BOOKMARK_REQUEST,
|
||||||
|
status: status,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function bookmarkSuccess(status, response) {
|
||||||
|
return {
|
||||||
|
type: BOOKMARK_SUCCESS,
|
||||||
|
status: status,
|
||||||
|
response: response,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function bookmarkFail(status, error) {
|
||||||
|
return {
|
||||||
|
type: BOOKMARK_FAIL,
|
||||||
|
status: status,
|
||||||
|
error: error,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function unbookmarkRequest(status) {
|
||||||
|
return {
|
||||||
|
type: UNBOOKMARK_REQUEST,
|
||||||
|
status: status,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function unbookmarkSuccess(status, response) {
|
||||||
|
return {
|
||||||
|
type: UNBOOKMARK_SUCCESS,
|
||||||
|
status: status,
|
||||||
|
response: response,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function unbookmarkFail(status, error) {
|
||||||
|
return {
|
||||||
|
type: UNBOOKMARK_FAIL,
|
||||||
|
status: status,
|
||||||
|
error: error,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
export function fetchReblogs(id) {
|
export function fetchReblogs(id) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
if (!getState().get('me')) return;
|
if (!getState().get('me')) return;
|
||||||
|
|
|
@ -32,6 +32,7 @@ const messages = defineMessages({
|
||||||
security: { id: 'navigation_bar.security', defaultMessage: 'Security' },
|
security: { id: 'navigation_bar.security', defaultMessage: 'Security' },
|
||||||
logout: { id: 'navigation_bar.logout', defaultMessage: 'Logout' },
|
logout: { id: 'navigation_bar.logout', defaultMessage: 'Logout' },
|
||||||
lists: { id: 'column.lists', defaultMessage: 'Lists' },
|
lists: { id: 'column.lists', defaultMessage: 'Lists' },
|
||||||
|
bookmarks: { id: 'column.bookmarks', defaultMessage: 'Bookmarks' },
|
||||||
apps: { id: 'tabs_bar.apps', defaultMessage: 'Apps' },
|
apps: { id: 'tabs_bar.apps', defaultMessage: 'Apps' },
|
||||||
news: { id: 'tabs_bar.news', defaultMessage: 'News' },
|
news: { id: 'tabs_bar.news', defaultMessage: 'News' },
|
||||||
donate: { id: 'donate', defaultMessage: 'Donate' },
|
donate: { id: 'donate', defaultMessage: 'Donate' },
|
||||||
|
@ -144,6 +145,10 @@ class SidebarMenu extends ImmutablePureComponent {
|
||||||
<Icon id='list' />
|
<Icon id='list' />
|
||||||
<span className='sidebar-menu-item__title'>{intl.formatMessage(messages.lists)}</span>
|
<span className='sidebar-menu-item__title'>{intl.formatMessage(messages.lists)}</span>
|
||||||
</NavLink>
|
</NavLink>
|
||||||
|
<NavLink className='sidebar-menu-item' to='/bookmarks' onClick={onClose}>
|
||||||
|
<Icon id='bookmark' />
|
||||||
|
<span className='sidebar-menu-item__title'>{intl.formatMessage(messages.bookmarks)}</span>
|
||||||
|
</NavLink>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='sidebar-menu__section'>
|
<div className='sidebar-menu__section'>
|
||||||
|
|
|
@ -31,6 +31,8 @@ const messages = defineMessages({
|
||||||
cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be reposted' },
|
cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be reposted' },
|
||||||
favourite: { id: 'status.favourite', defaultMessage: 'Favorite' },
|
favourite: { id: 'status.favourite', defaultMessage: 'Favorite' },
|
||||||
open: { id: 'status.open', defaultMessage: 'Expand this post' },
|
open: { id: 'status.open', defaultMessage: 'Expand this post' },
|
||||||
|
bookmark: { id: 'status.bookmark', defaultMessage: 'Bookmark' },
|
||||||
|
unbookmark: { id: 'status.unbookmark', defaultMessage: 'Remove bookmark' },
|
||||||
report: { id: 'status.report', defaultMessage: 'Report @{name}' },
|
report: { id: 'status.report', defaultMessage: 'Report @{name}' },
|
||||||
muteConversation: { id: 'status.mute_conversation', defaultMessage: 'Mute conversation' },
|
muteConversation: { id: 'status.mute_conversation', defaultMessage: 'Mute conversation' },
|
||||||
unmuteConversation: { id: 'status.unmute_conversation', defaultMessage: 'Unmute conversation' },
|
unmuteConversation: { id: 'status.unmute_conversation', defaultMessage: 'Unmute conversation' },
|
||||||
|
@ -55,6 +57,7 @@ class StatusActionBar extends ImmutablePureComponent {
|
||||||
onOpenUnauthorizedModal: PropTypes.func.isRequired,
|
onOpenUnauthorizedModal: PropTypes.func.isRequired,
|
||||||
onReply: PropTypes.func,
|
onReply: PropTypes.func,
|
||||||
onFavourite: PropTypes.func,
|
onFavourite: PropTypes.func,
|
||||||
|
onBookmark: PropTypes.func,
|
||||||
onReblog: PropTypes.func,
|
onReblog: PropTypes.func,
|
||||||
onDelete: PropTypes.func,
|
onDelete: PropTypes.func,
|
||||||
onDirect: PropTypes.func,
|
onDirect: PropTypes.func,
|
||||||
|
@ -149,6 +152,10 @@ class StatusActionBar extends ImmutablePureComponent {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handleBookmarkClick = () => {
|
||||||
|
this.props.onBookmark(this.props.status);
|
||||||
|
}
|
||||||
|
|
||||||
handleReblogClick = e => {
|
handleReblogClick = e => {
|
||||||
const { me } = this.props;
|
const { me } = this.props;
|
||||||
if (me) {
|
if (me) {
|
||||||
|
@ -246,6 +253,8 @@ class StatusActionBar extends ImmutablePureComponent {
|
||||||
// menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed });
|
// menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
menu.push({ text: intl.formatMessage(status.get('bookmarked') ? messages.unbookmark : messages.bookmark), action: this.handleBookmarkClick });
|
||||||
|
|
||||||
if (!me) {
|
if (!me) {
|
||||||
return menu;
|
return menu;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,8 @@ import {
|
||||||
favourite,
|
favourite,
|
||||||
unreblog,
|
unreblog,
|
||||||
unfavourite,
|
unfavourite,
|
||||||
|
bookmark,
|
||||||
|
unbookmark,
|
||||||
pin,
|
pin,
|
||||||
unpin,
|
unpin,
|
||||||
} from '../actions/interactions';
|
} from '../actions/interactions';
|
||||||
|
@ -100,6 +102,14 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
onBookmark(status) {
|
||||||
|
if (status.get('bookmarked')) {
|
||||||
|
dispatch(unbookmark(status));
|
||||||
|
} else {
|
||||||
|
dispatch(bookmark(status));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
onPin(status) {
|
onPin(status) {
|
||||||
if (status.get('pinned')) {
|
if (status.get('pinned')) {
|
||||||
dispatch(unpin(status));
|
dispatch(unpin(status));
|
||||||
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
import React from 'react';
|
||||||
|
import { connect } from 'react-redux';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||||
|
import Column from '../ui/components/column';
|
||||||
|
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
|
||||||
|
import ImmutablePureComponent from 'react-immutable-pure-component';
|
||||||
|
import StatusList from '../../components/status_list';
|
||||||
|
import { fetchBookmarkedStatuses } from '../../actions/bookmarks';
|
||||||
|
|
||||||
|
const messages = defineMessages({
|
||||||
|
heading: { id: 'column.bookmarks', defaultMessage: 'Bookmarks' },
|
||||||
|
});
|
||||||
|
|
||||||
|
const mapStateToProps = state => ({
|
||||||
|
statusIds: state.getIn(['status_lists', 'bookmarks', 'items']),
|
||||||
|
isLoading: state.getIn(['status_lists', 'bookmarks', 'isLoading'], true),
|
||||||
|
hasMore: !!state.getIn(['status_lists', 'bookmarks', 'next']),
|
||||||
|
});
|
||||||
|
|
||||||
|
export default @connect(mapStateToProps)
|
||||||
|
@injectIntl
|
||||||
|
class Bookmarks extends ImmutablePureComponent {
|
||||||
|
|
||||||
|
static contextTypes = {
|
||||||
|
router: PropTypes.object,
|
||||||
|
};
|
||||||
|
|
||||||
|
static propTypes = {
|
||||||
|
dispatch: PropTypes.func.isRequired,
|
||||||
|
shouldUpdateScroll: PropTypes.func,
|
||||||
|
statusIds: ImmutablePropTypes.list.isRequired,
|
||||||
|
intl: PropTypes.object.isRequired,
|
||||||
|
columnId: PropTypes.string,
|
||||||
|
multiColumn: PropTypes.bool,
|
||||||
|
hasMore: PropTypes.bool,
|
||||||
|
isLoading: PropTypes.bool,
|
||||||
|
};
|
||||||
|
|
||||||
|
componentDidMount() {
|
||||||
|
const { dispatch } = this.props;
|
||||||
|
dispatch(fetchBookmarkedStatuses());
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidUpdate(prevProps) {
|
||||||
|
const { dispatch } = this.props;
|
||||||
|
dispatch(fetchBookmarkedStatuses());
|
||||||
|
}
|
||||||
|
|
||||||
|
handleLoadMore = maxId => {
|
||||||
|
const { dispatch } = this.props;
|
||||||
|
dispatch(fetchBookmarkedStatuses({ maxId }));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const { intl, shouldUpdateScroll, statusIds, columnId, multiColumn, hasMore, isLoading } = this.props;
|
||||||
|
const pinned = !!columnId;
|
||||||
|
|
||||||
|
const emptyMessage = <FormattedMessage id='empty_column.bookmarks' defaultMessage="You don't have any bookmarks yet. When you add one, it will show up here." />;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Column icon='bookmark' heading={intl.formatMessage(messages.heading)} backBtnSlim>
|
||||||
|
<StatusList
|
||||||
|
trackScroll={!pinned}
|
||||||
|
statusIds={statusIds}
|
||||||
|
scrollKey={`bookmarked_statuses-${columnId}`}
|
||||||
|
hasMore={hasMore}
|
||||||
|
isLoading={isLoading}
|
||||||
|
onLoadMore={this.handleLoadMore}
|
||||||
|
shouldUpdateScroll={shouldUpdateScroll}
|
||||||
|
emptyMessage={emptyMessage}
|
||||||
|
bindToDocument={!multiColumn}
|
||||||
|
/>
|
||||||
|
</Column>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -11,6 +11,7 @@ const messages = defineMessages({
|
||||||
profile: { id: 'account.profile', defaultMessage: 'Profile' },
|
profile: { id: 'account.profile', defaultMessage: 'Profile' },
|
||||||
messages: { id: 'navigation_bar.messages', defaultMessage: 'Messages' },
|
messages: { id: 'navigation_bar.messages', defaultMessage: 'Messages' },
|
||||||
lists: { id: 'navigation_bar.lists', defaultMessage: 'Lists' },
|
lists: { id: 'navigation_bar.lists', defaultMessage: 'Lists' },
|
||||||
|
bookmarks: { id: 'navigation_bar.bookmarks', defaultMessage: 'Bookmarks' },
|
||||||
preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' },
|
preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' },
|
||||||
follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' },
|
follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' },
|
||||||
blocks: { id: 'navigation_bar.blocks', defaultMessage: 'Blocked users' },
|
blocks: { id: 'navigation_bar.blocks', defaultMessage: 'Blocked users' },
|
||||||
|
@ -69,6 +70,7 @@ class ActionBar extends React.PureComponent {
|
||||||
menu.push({ text: intl.formatMessage(messages.profile), to: `/@${meUsername}` });
|
menu.push({ text: intl.formatMessage(messages.profile), to: `/@${meUsername}` });
|
||||||
menu.push({ text: intl.formatMessage(messages.messages), to: '/messages' });
|
menu.push({ text: intl.formatMessage(messages.messages), to: '/messages' });
|
||||||
menu.push({ text: intl.formatMessage(messages.lists), to: '/lists' });
|
menu.push({ text: intl.formatMessage(messages.lists), to: '/lists' });
|
||||||
|
menu.push({ text: intl.formatMessage(messages.bookmarks), to: '/bookmarks' });
|
||||||
menu.push(null);
|
menu.push(null);
|
||||||
menu.push({ text: intl.formatMessage(messages.follow_requests), to: '/follow_requests' });
|
menu.push({ text: intl.formatMessage(messages.follow_requests), to: '/follow_requests' });
|
||||||
menu.push({ text: intl.formatMessage(messages.mutes), to: '/mutes' });
|
menu.push({ text: intl.formatMessage(messages.mutes), to: '/mutes' });
|
||||||
|
|
|
@ -64,6 +64,7 @@ import {
|
||||||
// GroupTimeline,
|
// GroupTimeline,
|
||||||
ListTimeline,
|
ListTimeline,
|
||||||
Lists,
|
Lists,
|
||||||
|
Bookmarks,
|
||||||
// GroupMembers,
|
// GroupMembers,
|
||||||
// GroupRemovedAccounts,
|
// GroupRemovedAccounts,
|
||||||
// GroupCreate,
|
// GroupCreate,
|
||||||
|
@ -227,6 +228,7 @@ class SwitchingColumnsArea extends React.PureComponent {
|
||||||
|
|
||||||
<WrappedRoute path='/lists' layout={LAYOUT.DEFAULT} component={Lists} content={children} />
|
<WrappedRoute path='/lists' layout={LAYOUT.DEFAULT} component={Lists} content={children} />
|
||||||
<WrappedRoute path='/list/:id' page={HomePage} component={ListTimeline} content={children} />
|
<WrappedRoute path='/list/:id' page={HomePage} component={ListTimeline} content={children} />
|
||||||
|
<WrappedRoute path='/bookmarks' layout={LAYOUT.DEFAULT} component={Bookmarks} content={children} />
|
||||||
|
|
||||||
<WrappedRoute path='/notifications' layout={LAYOUT.DEFAULT} component={Notifications} content={children} />
|
<WrappedRoute path='/notifications' layout={LAYOUT.DEFAULT} component={Notifications} content={children} />
|
||||||
|
|
||||||
|
|
|
@ -62,6 +62,10 @@ export function Lists() {
|
||||||
return import(/* webpackChunkName: "features/lists" */'../../lists');
|
return import(/* webpackChunkName: "features/lists" */'../../lists');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function Bookmarks() {
|
||||||
|
return import(/* webpackChunkName: "features/bookmarks" */'../../bookmarks');
|
||||||
|
}
|
||||||
|
|
||||||
export function Status() {
|
export function Status() {
|
||||||
return import(/* webpackChunkName: "features/status" */'../../status');
|
return import(/* webpackChunkName: "features/status" */'../../status');
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,11 @@ describe('status_lists reducer', () => {
|
||||||
loaded: false,
|
loaded: false,
|
||||||
items: ImmutableList(),
|
items: ImmutableList(),
|
||||||
}),
|
}),
|
||||||
|
bookmarks: ImmutableMap({
|
||||||
|
next: null,
|
||||||
|
loaded: false,
|
||||||
|
items: ImmutableList(),
|
||||||
|
}),
|
||||||
pins: ImmutableMap({
|
pins: ImmutableMap({
|
||||||
next: null,
|
next: null,
|
||||||
loaded: false,
|
loaded: false,
|
||||||
|
|
|
@ -6,6 +6,14 @@ import {
|
||||||
FAVOURITED_STATUSES_EXPAND_SUCCESS,
|
FAVOURITED_STATUSES_EXPAND_SUCCESS,
|
||||||
FAVOURITED_STATUSES_EXPAND_FAIL,
|
FAVOURITED_STATUSES_EXPAND_FAIL,
|
||||||
} from '../actions/favourites';
|
} from '../actions/favourites';
|
||||||
|
import {
|
||||||
|
BOOKMARKED_STATUSES_FETCH_REQUEST,
|
||||||
|
BOOKMARKED_STATUSES_FETCH_SUCCESS,
|
||||||
|
BOOKMARKED_STATUSES_FETCH_FAIL,
|
||||||
|
BOOKMARKED_STATUSES_EXPAND_REQUEST,
|
||||||
|
BOOKMARKED_STATUSES_EXPAND_SUCCESS,
|
||||||
|
BOOKMARKED_STATUSES_EXPAND_FAIL,
|
||||||
|
} from '../actions/bookmarks';
|
||||||
import {
|
import {
|
||||||
PINNED_STATUSES_FETCH_SUCCESS,
|
PINNED_STATUSES_FETCH_SUCCESS,
|
||||||
} from '../actions/pin_statuses';
|
} from '../actions/pin_statuses';
|
||||||
|
@ -13,6 +21,8 @@ import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
|
||||||
import {
|
import {
|
||||||
FAVOURITE_SUCCESS,
|
FAVOURITE_SUCCESS,
|
||||||
UNFAVOURITE_SUCCESS,
|
UNFAVOURITE_SUCCESS,
|
||||||
|
BOOKMARK_SUCCESS,
|
||||||
|
UNBOOKMARK_SUCCESS,
|
||||||
PIN_SUCCESS,
|
PIN_SUCCESS,
|
||||||
UNPIN_SUCCESS,
|
UNPIN_SUCCESS,
|
||||||
} from '../actions/interactions';
|
} from '../actions/interactions';
|
||||||
|
@ -23,6 +33,11 @@ const initialState = ImmutableMap({
|
||||||
loaded: false,
|
loaded: false,
|
||||||
items: ImmutableList(),
|
items: ImmutableList(),
|
||||||
}),
|
}),
|
||||||
|
bookmarks: ImmutableMap({
|
||||||
|
next: null,
|
||||||
|
loaded: false,
|
||||||
|
items: ImmutableList(),
|
||||||
|
}),
|
||||||
pins: ImmutableMap({
|
pins: ImmutableMap({
|
||||||
next: null,
|
next: null,
|
||||||
loaded: false,
|
loaded: false,
|
||||||
|
@ -71,10 +86,24 @@ export default function statusLists(state = initialState, action) {
|
||||||
return normalizeList(state, 'favourites', action.statuses, action.next);
|
return normalizeList(state, 'favourites', action.statuses, action.next);
|
||||||
case FAVOURITED_STATUSES_EXPAND_SUCCESS:
|
case FAVOURITED_STATUSES_EXPAND_SUCCESS:
|
||||||
return appendToList(state, 'favourites', action.statuses, action.next);
|
return appendToList(state, 'favourites', action.statuses, action.next);
|
||||||
|
case BOOKMARKED_STATUSES_FETCH_REQUEST:
|
||||||
|
case BOOKMARKED_STATUSES_EXPAND_REQUEST:
|
||||||
|
return state.setIn(['bookmarks', 'isLoading'], true);
|
||||||
|
case BOOKMARKED_STATUSES_FETCH_FAIL:
|
||||||
|
case BOOKMARKED_STATUSES_EXPAND_FAIL:
|
||||||
|
return state.setIn(['bookmarks', 'isLoading'], false);
|
||||||
|
case BOOKMARKED_STATUSES_FETCH_SUCCESS:
|
||||||
|
return normalizeList(state, 'bookmarks', action.statuses, action.next);
|
||||||
|
case BOOKMARKED_STATUSES_EXPAND_SUCCESS:
|
||||||
|
return appendToList(state, 'bookmarks', action.statuses, action.next);
|
||||||
case FAVOURITE_SUCCESS:
|
case FAVOURITE_SUCCESS:
|
||||||
return prependOneToList(state, 'favourites', action.status);
|
return prependOneToList(state, 'favourites', action.status);
|
||||||
case UNFAVOURITE_SUCCESS:
|
case UNFAVOURITE_SUCCESS:
|
||||||
return removeOneFromList(state, 'favourites', action.status);
|
return removeOneFromList(state, 'favourites', action.status);
|
||||||
|
case BOOKMARK_SUCCESS:
|
||||||
|
return prependOneToList(state, 'bookmarks', action.status);
|
||||||
|
case UNBOOKMARK_SUCCESS:
|
||||||
|
return removeOneFromList(state, 'bookmarks', action.status);
|
||||||
case PINNED_STATUSES_FETCH_SUCCESS:
|
case PINNED_STATUSES_FETCH_SUCCESS:
|
||||||
return normalizeList(state, 'pins', action.statuses, action.next);
|
return normalizeList(state, 'pins', action.statuses, action.next);
|
||||||
case PIN_SUCCESS:
|
case PIN_SUCCESS:
|
||||||
|
|
Ładowanie…
Reference in New Issue