import { List as ImmutableList } from 'immutable' import { openModal } from '../actions/modal' import { mentionCompose } from '../actions/compose' import { reblog, favorite, unreblog, unfavorite, } from '../actions/interactions' import { hideStatus, revealStatus, } from '../actions/statuses' import { boostModal } from '../initial_state' import { makeGetNotification } from '../selectors' import Notification from '../components/notification' const getAccountFromState = (state, accountId) => { return state.getIn(['accounts', accountId]) } const makeMapStateToProps = () => { const getNotification = makeGetNotification() const mapStateToProps = (state, props) => { const isFollows = !!props.notification.get('follow') const isLikes = !!props.notification.get('like') const isReposts = !!props.notification.get('repost') const isGrouped = isFollows || isLikes || isReposts if (isFollows) { const list = props.notification.get('follow') let accounts = ImmutableList() list.forEach((item) => { const account = getAccountFromState(state, item.get('account')) accounts = accounts.set(accounts.size, account) }) return { type: 'follow', accounts: accounts, createdAt: undefined, statusId: undefined, } } else if (isLikes || isReposts) { const theType = isLikes ? 'like' : 'repost' const list = props.notification.get(theType) let accounts = ImmutableList() const accountIdArr = list.get('accounts') for (let i = 0; i < accountIdArr.length; i++) { const accountId = accountIdArr[i]; const account = getAccountFromState(state, accountId) accounts = accounts.set(accounts.size, account) } return { type: theType, accounts: accounts, createdAt: undefined, statusId: list.get('status'), } } else if (!isGrouped) { const notification = getNotification(state, props.notification, props.notification.get('account')) const account = notification.get('account') const statusId = notification.get('status') return { accounts: !!account ? ImmutableList([account]) : ImmutableList(), type: notification.get('type'), createdAt: notification.get('created_at'), statusId: statusId || undefined, } } } return mapStateToProps } const mapDispatchToProps = (dispatch) => ({ onMention: (account, router) => { dispatch(mentionCompose(account, router)) }, onModalRepost (status) { dispatch(repost(status)) }, onRepost (status, e) { if (status.get('reblogged')) { dispatch(unrepost(status)) } else { if (e.shiftKey || !boostModal) { this.onModalRepost(status) } else { dispatch(openModal('BOOST', { status, onRepost: this.onModalRepost })) } } }, onFavorite (status) { if (status.get('favourited')) { dispatch(unfavorite(status)) } else { dispatch(favorite(status)) } }, onToggleHidden (status) { if (status.get('hidden')) { dispatch(revealStatus(status.get('id'))) } else { dispatch(hideStatus(status.get('id'))) } }, }) export default connect(makeMapStateToProps, mapDispatchToProps)(Notification)