Refactor simpleEmojiReact, allow inline reactions

stable/1.0.x
Alex Gleason 2020-05-22 21:15:07 -05:00
rodzic 850d9a1007
commit b13e8bdd96
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 7211D1F99744FBB7
5 zmienionych plików z 69 dodań i 33 usunięć

Wyświetl plik

@ -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());

Wyświetl plik

@ -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'));
}, },

Wyświetl plik

@ -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>

Wyświetl plik

@ -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() {

Wyświetl plik

@ -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) => {