kopia lustrzana https://gitlab.com/soapbox-pub/soapbox
Refactor simpleEmojiReact, allow inline reactions
rodzic
850d9a1007
commit
b13e8bdd96
|
@ -1,5 +1,6 @@
|
||||||
import api from '../api';
|
import api from '../api';
|
||||||
import { importFetchedAccounts, importFetchedStatus } from './importer';
|
import { importFetchedAccounts, importFetchedStatus } from './importer';
|
||||||
|
import { favourite, unfavourite } from './interactions';
|
||||||
|
|
||||||
export const EMOJI_REACT_REQUEST = 'EMOJI_REACT_REQUEST';
|
export const EMOJI_REACT_REQUEST = 'EMOJI_REACT_REQUEST';
|
||||||
export const EMOJI_REACT_SUCCESS = 'EMOJI_REACT_SUCCESS';
|
export const EMOJI_REACT_SUCCESS = 'EMOJI_REACT_SUCCESS';
|
||||||
|
@ -15,6 +16,32 @@ export const EMOJI_REACTS_FETCH_FAIL = 'EMOJI_REACTS_FETCH_FAIL';
|
||||||
|
|
||||||
const noOp = () => () => new Promise(f => f());
|
const noOp = () => () => new Promise(f => f());
|
||||||
|
|
||||||
|
export const simpleEmojiReact = (status, emoji) => {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
const emojiReacts = status.getIn(['pleroma', 'emoji_reactions']);
|
||||||
|
|
||||||
|
if (emoji === '👍' && status.get('favourited')) return dispatch(unfavourite(status));
|
||||||
|
|
||||||
|
const undo = emojiReacts.filter(e => e.get('me') === true && e.get('name') === emoji).count() > 0;
|
||||||
|
if (undo) return dispatch(unEmojiReact(status, emoji));
|
||||||
|
|
||||||
|
return Promise.all(
|
||||||
|
emojiReacts
|
||||||
|
.filter(emojiReact => emojiReact.get('me') === true)
|
||||||
|
.map(emojiReact => dispatch(unEmojiReact(status, emojiReact.get('name')))),
|
||||||
|
status.get('favourited') && dispatch(unfavourite(status))
|
||||||
|
).then(() => {
|
||||||
|
if (emoji === '👍') {
|
||||||
|
dispatch(favourite(status));
|
||||||
|
} else {
|
||||||
|
dispatch(emojiReact(status, emoji));
|
||||||
|
}
|
||||||
|
}).catch(err => {
|
||||||
|
console.error(err);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
export function fetchEmojiReacts(id, emoji) {
|
export function fetchEmojiReacts(id, emoji) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
if (!getState().get('me')) return dispatch(noOp());
|
if (!getState().get('me')) return dispatch(noOp());
|
||||||
|
|
|
@ -12,6 +12,8 @@ import { isStaff } from 'gabsocial/utils/accounts';
|
||||||
import { openModal } from '../actions/modal';
|
import { openModal } from '../actions/modal';
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
import EmojiSelector from 'gabsocial/components/emoji_selector';
|
import EmojiSelector from 'gabsocial/components/emoji_selector';
|
||||||
|
import { getReactForStatus, reduceEmoji } from 'gabsocial/utils/emoji_reacts';
|
||||||
|
import { simpleEmojiReact } from 'gabsocial/actions/emoji_reacts';
|
||||||
|
|
||||||
const messages = defineMessages({
|
const messages = defineMessages({
|
||||||
delete: { id: 'status.delete', defaultMessage: 'Delete' },
|
delete: { id: 'status.delete', defaultMessage: 'Delete' },
|
||||||
|
@ -100,6 +102,17 @@ class StatusActionBar extends ImmutablePureComponent {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handleReactClick = emoji => {
|
||||||
|
return e => {
|
||||||
|
const { me, status } = this.props;
|
||||||
|
if (me) {
|
||||||
|
this.props.dispatch(simpleEmojiReact(status, emoji));
|
||||||
|
} else {
|
||||||
|
this.props.onOpenUnauthorizedModal();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
handleFavouriteClick = () => {
|
handleFavouriteClick = () => {
|
||||||
const { me } = this.props;
|
const { me } = this.props;
|
||||||
if (me) {
|
if (me) {
|
||||||
|
@ -255,11 +268,17 @@ class StatusActionBar extends ImmutablePureComponent {
|
||||||
render() {
|
render() {
|
||||||
const { status, intl } = this.props;
|
const { status, intl } = this.props;
|
||||||
|
|
||||||
const publicStatus = ['public', 'unlisted'].includes(status.get('visibility'));
|
const publicStatus = ['public', 'unlisted'].includes(status.get('visibility'));
|
||||||
|
|
||||||
const replyCount = status.get('replies_count');
|
const replyCount = status.get('replies_count');
|
||||||
const reblogCount = status.get('reblogs_count');
|
const reblogCount = status.get('reblogs_count');
|
||||||
const favoriteCount = status.get('favourites_count');
|
const favouriteCount = status.get('favourites_count');
|
||||||
|
const emojiReactCount = reduceEmoji(
|
||||||
|
status.getIn(['pleroma', 'emoji_reactions'], []),
|
||||||
|
favouriteCount,
|
||||||
|
status.get('favourited'),
|
||||||
|
).reduce((acc, cur) => acc + cur.get('count'), 0);
|
||||||
|
const meEmojiReact = getReactForStatus(status);
|
||||||
|
|
||||||
let menu = this._makeMenu(publicStatus);
|
let menu = this._makeMenu(publicStatus);
|
||||||
let reblogIcon = 'retweet';
|
let reblogIcon = 'retweet';
|
||||||
|
@ -296,8 +315,16 @@ class StatusActionBar extends ImmutablePureComponent {
|
||||||
</div>
|
</div>
|
||||||
<div className='status__action-bar__counter status__action-bar__counter--favourite'>
|
<div className='status__action-bar__counter status__action-bar__counter--favourite'>
|
||||||
<EmojiSelector onReact={this.handleReactClick} />
|
<EmojiSelector onReact={this.handleReactClick} />
|
||||||
<IconButton className='status__action-bar-button star-icon' animate active={status.get('favourited')} pressed={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='thumbs-up' onClick={this.handleFavouriteClick} />
|
<IconButton
|
||||||
{favoriteCount !== 0 && <span className='detailed-status__link'>{favoriteCount}</span>}
|
className='status__action-bar-button star-icon'
|
||||||
|
animate
|
||||||
|
active={Boolean(meEmojiReact)}
|
||||||
|
title={intl.formatMessage(messages.favourite)}
|
||||||
|
icon='thumbs-up'
|
||||||
|
emoji={meEmojiReact}
|
||||||
|
onClick={this.handleReactClick(meEmojiReact || '👍')}
|
||||||
|
/>
|
||||||
|
{emojiReactCount !== 0 && <span className='detailed-status__link'>{emojiReactCount}</span>}
|
||||||
</div>
|
</div>
|
||||||
{shareButton}
|
{shareButton}
|
||||||
|
|
||||||
|
@ -319,6 +346,7 @@ const mapStateToProps = state => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const mapDispatchToProps = (dispatch) => ({
|
const mapDispatchToProps = (dispatch) => ({
|
||||||
|
dispatch,
|
||||||
onOpenUnauthorizedModal() {
|
onOpenUnauthorizedModal() {
|
||||||
dispatch(openModal('UNAUTHORIZED'));
|
dispatch(openModal('UNAUTHORIZED'));
|
||||||
},
|
},
|
||||||
|
|
|
@ -270,11 +270,11 @@ class ActionBar extends React.PureComponent {
|
||||||
<IconButton
|
<IconButton
|
||||||
className='star-icon'
|
className='star-icon'
|
||||||
animate
|
animate
|
||||||
active={meEmojiReact}
|
active={Boolean(meEmojiReact)}
|
||||||
title={intl.formatMessage(messages.favourite)}
|
title={intl.formatMessage(messages.favourite)}
|
||||||
icon='thumbs-up'
|
icon='thumbs-up'
|
||||||
emoji={meEmojiReact}
|
emoji={meEmojiReact}
|
||||||
onClick={this.handleReactClick('👍')}
|
onClick={this.handleReactClick(meEmojiReact || '👍')}
|
||||||
text='Like'
|
text='Like'
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -12,10 +12,12 @@ export class StatusInteractionBar extends React.Component {
|
||||||
}
|
}
|
||||||
|
|
||||||
getNormalizedReacts = () => {
|
getNormalizedReacts = () => {
|
||||||
const { status, me } = this.props;
|
const { status } = this.props;
|
||||||
const emojiReacts = status.getIn(['pleroma', 'emoji_reactions']);
|
return reduceEmoji(
|
||||||
const favouritesCount = status.get('favourites_count');
|
status.getIn(['pleroma', 'emoji_reactions']),
|
||||||
return reduceEmoji(emojiReacts, favouritesCount, me).reverse();
|
status.get('favourites_count'),
|
||||||
|
status.get('favourited'),
|
||||||
|
).reverse();
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
|
|
@ -17,7 +17,7 @@ import {
|
||||||
pin,
|
pin,
|
||||||
unpin,
|
unpin,
|
||||||
} from '../../actions/interactions';
|
} from '../../actions/interactions';
|
||||||
import { emojiReact, unEmojiReact } from '../../actions/emoji_reacts';
|
import { simpleEmojiReact } from '../../actions/emoji_reacts';
|
||||||
import {
|
import {
|
||||||
replyCompose,
|
replyCompose,
|
||||||
mentionCompose,
|
mentionCompose,
|
||||||
|
@ -163,28 +163,7 @@ class Status extends ImmutablePureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
handleEmojiReactClick = (status, emoji) => {
|
handleEmojiReactClick = (status, emoji) => {
|
||||||
const { dispatch } = this.props;
|
this.props.dispatch(simpleEmojiReact(status, emoji));
|
||||||
const emojiReacts = status.getIn(['pleroma', 'emoji_reactions']);
|
|
||||||
|
|
||||||
if (emoji === '👍' && status.get('favourited')) return dispatch(unfavourite(status));
|
|
||||||
|
|
||||||
const undo = emojiReacts.filter(e => e.get('me') === true && e.get('name') === emoji).count() > 0;
|
|
||||||
if (undo) return dispatch(unEmojiReact(status, emoji));
|
|
||||||
|
|
||||||
return Promise.all(
|
|
||||||
emojiReacts
|
|
||||||
.filter(emojiReact => emojiReact.get('me') === true)
|
|
||||||
.map(emojiReact => dispatch(unEmojiReact(status, emojiReact.get('name')))),
|
|
||||||
status.get('favourited') && dispatch(unfavourite(status))
|
|
||||||
).then(() => {
|
|
||||||
if (emoji === '👍') {
|
|
||||||
dispatch(favourite(status));
|
|
||||||
} else {
|
|
||||||
dispatch(emojiReact(status, emoji));
|
|
||||||
}
|
|
||||||
}).catch(err => {
|
|
||||||
console.error(err);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
handleFavouriteClick = (status) => {
|
handleFavouriteClick = (status) => {
|
||||||
|
|
Ładowanie…
Reference in New Issue