add bite user and bite status buttons on status and status detailed components

This commit is contained in:
ihateblueb 2025-03-15 11:06:04 -04:00
commit 80e5529217
8 changed files with 147 additions and 3 deletions

View file

@ -1,6 +1,7 @@
# with harper's tweaks # with harper's tweaks
- added bite notification support - added bite notification support
- add bite user and bite status buttons on status and status detailed components
# Chuckya (standalone frontend) # Chuckya (standalone frontend)

View file

@ -47,6 +47,14 @@ export const UNBOOKMARK_REQUEST = 'UNBOOKMARKED_REQUEST';
export const UNBOOKMARK_SUCCESS = 'UNBOOKMARKED_SUCCESS'; export const UNBOOKMARK_SUCCESS = 'UNBOOKMARKED_SUCCESS';
export const UNBOOKMARK_FAIL = 'UNBOOKMARKED_FAIL'; export const UNBOOKMARK_FAIL = 'UNBOOKMARKED_FAIL';
export const BITE_REQUEST = 'BITE_REQUEST';
export const BITE_REQUEST_SUCCESS = 'BITE_REQUEST_SUCCESS';
export const BITE_REQUEST_FAIL = 'BITE_REQUEST_FAIL';
export const BITE_USER_REQUEST = 'BITE_USER_REQUEST';
export const BITE_USER_REQUEST_SUCCESS = 'BITE_USER_REQUEST_SUCCESS';
export const BITE_USER_REQUEST_FAIL = 'BITE_USER_REQUEST_FAIL';
export const REACTION_UPDATE = 'REACTION_UPDATE'; export const REACTION_UPDATE = 'REACTION_UPDATE';
export const REACTION_ADD_REQUEST = 'REACTION_ADD_REQUEST'; export const REACTION_ADD_REQUEST = 'REACTION_ADD_REQUEST';
@ -505,6 +513,80 @@ export function toggleFavourite(statusId, skipModal = false) {
}; };
} }
export function bite(statusId) {
return (dispatch) => {
dispatch(biteRequest(statusId));
api().post(`/api/v1/statuses/${statusId}/bite`).then(function () {
dispatch(biteRequestSuccess(statusId));
}).catch(function (error) {
dispatch(biteRequestFail(statusId, error));
});
};
}
export function biteRequest(statusId) {
return {
type: BITE_REQUEST,
status: statusId,
skipLoading: true,
};
}
export function biteRequestSuccess(statusId) {
return {
type: BITE_REQUEST_SUCCESS,
status: statusId,
skipLoading: true,
};
}
export function biteRequestFail(statusId, error) {
return {
type: BITE_REQUEST_FAIL,
status: statusId,
error: error,
skipLoading: true,
};
}
export function biteUser(accountId) {
return (dispatch) => {
dispatch(biteUserRequest(accountId));
api().post(`/api/v1/users/${accountId}/bite`).then(function () {
dispatch(biteUserRequestSuccess(accountId));
}).catch(function (error) {
dispatch(biteUserRequestFail(accountId, error));
});
};
}
export function biteUserRequest(accountId) {
return {
type: BITE_USER_REQUEST,
status: accountId,
skipLoading: true,
};
}
export function biteUserRequestSuccess(accountId) {
return {
type: BITE_USER_REQUEST_SUCCESS,
status: accountId,
skipLoading: true,
};
}
export function biteUserRequestFail(accountId, error) {
return {
type: BITE_USER_REQUEST_FAIL,
status: accountId,
error: error,
skipLoading: true,
};
}
export const addReaction = (statusId, name, url) => (dispatch, getState) => { export const addReaction = (statusId, name, url) => (dispatch, getState) => {
const status = getState().get('statuses').get(statusId); const status = getState().get('statuses').get(statusId);
let alreadyAdded = false; let alreadyAdded = false;

View file

@ -93,6 +93,8 @@ class Status extends ImmutablePureComponent {
onBookmark: PropTypes.func, onBookmark: PropTypes.func,
onDelete: PropTypes.func, onDelete: PropTypes.func,
onDirect: PropTypes.func, onDirect: PropTypes.func,
onBite: PropTypes.func,
onBiteUser: PropTypes.func,
onMention: PropTypes.func, onMention: PropTypes.func,
onReactionAdd: PropTypes.func, onReactionAdd: PropTypes.func,
onReactionRemove: PropTypes.func, onReactionRemove: PropTypes.func,

View file

@ -38,6 +38,8 @@ const messages = defineMessages({
delete: { id: 'status.delete', defaultMessage: 'Delete' }, delete: { id: 'status.delete', defaultMessage: 'Delete' },
redraft: { id: 'status.redraft', defaultMessage: 'Delete & re-draft' }, redraft: { id: 'status.redraft', defaultMessage: 'Delete & re-draft' },
edit: { id: 'status.edit', defaultMessage: 'Edit' }, edit: { id: 'status.edit', defaultMessage: 'Edit' },
bite: { id: 'status.bite', defaultMessage: 'Bite post' },
biteUser: { id: 'account.bite', defaultMessage: 'Bite @{name}' },
direct: { id: 'status.direct', defaultMessage: 'Privately mention @{name}' }, direct: { id: 'status.direct', defaultMessage: 'Privately mention @{name}' },
mention: { id: 'status.mention', defaultMessage: 'Mention @{name}' }, mention: { id: 'status.mention', defaultMessage: 'Mention @{name}' },
mute: { id: 'account.mute', defaultMessage: 'Mute @{name}' }, mute: { id: 'account.mute', defaultMessage: 'Mute @{name}' },
@ -80,6 +82,8 @@ class StatusActionBar extends ImmutablePureComponent {
onReblog: PropTypes.func, onReblog: PropTypes.func,
onDelete: PropTypes.func, onDelete: PropTypes.func,
onDirect: PropTypes.func, onDirect: PropTypes.func,
onBite: PropTypes.func,
onBiteUser: PropTypes.func,
onMention: PropTypes.func, onMention: PropTypes.func,
onMute: PropTypes.func, onMute: PropTypes.func,
onBlock: PropTypes.func, onBlock: PropTypes.func,
@ -172,6 +176,14 @@ class StatusActionBar extends ImmutablePureComponent {
this.props.onMention(this.props.status.get('account')); this.props.onMention(this.props.status.get('account'));
}; };
handleBiteClick = () => {
this.props.onBite(this.props.status.get('id'));
};
handleBiteUserClick = () => {
this.props.onBiteUser(this.props.status.getIn(['account', 'id']));
};
handleDirectClick = () => { handleDirectClick = () => {
this.props.onDirect(this.props.status.get('account')); this.props.onDirect(this.props.status.get('account'));
}; };
@ -263,6 +275,10 @@ class StatusActionBar extends ImmutablePureComponent {
menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick, dangerous: true }); menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick, dangerous: true });
menu.push({ text: intl.formatMessage(messages.redraft), action: this.handleRedraftClick, dangerous: true }); menu.push({ text: intl.formatMessage(messages.redraft), action: this.handleRedraftClick, dangerous: true });
} else { } else {
menu.push({ text: intl.formatMessage(messages.bite), action: this.handleBiteClick });
menu.push({ text: intl.formatMessage(messages.biteUser, { name: status.getIn(['account', 'username']) }), action: this.handleBiteUserClick });
menu.push(null);
menu.push({ text: intl.formatMessage(messages.mention, { name: status.getIn(['account', 'username']) }), action: this.handleMentionClick }); menu.push({ text: intl.formatMessage(messages.mention, { name: status.getIn(['account', 'username']) }), action: this.handleMentionClick });
menu.push({ text: intl.formatMessage(messages.direct, { name: status.getIn(['account', 'username']) }), action: this.handleDirectClick }); menu.push({ text: intl.formatMessage(messages.direct, { name: status.getIn(['account', 'username']) }), action: this.handleDirectClick });
menu.push(null); menu.push(null);

View file

@ -17,7 +17,7 @@ import {
pin, pin,
unpin, unpin,
addReaction, addReaction,
removeReaction, removeReaction, bite, biteUser,
} from 'flavours/glitch/actions/interactions'; } from 'flavours/glitch/actions/interactions';
import { openModal } from 'flavours/glitch/actions/modal'; import { openModal } from 'flavours/glitch/actions/modal';
import { initMuteModal } from 'flavours/glitch/actions/mutes'; import { initMuteModal } from 'flavours/glitch/actions/mutes';
@ -159,6 +159,14 @@ const mapDispatchToProps = (dispatch, { contextType }) => ({
dispatch(directCompose(account)); dispatch(directCompose(account));
}, },
onBite (statusId) {
dispatch(bite(statusId));
},
onBiteUser (accountId) {
dispatch(biteUser(accountId));
},
onMention (account) { onMention (account) {
dispatch(mentionCompose(account)); dispatch(mentionCompose(account));
}, },

View file

@ -33,6 +33,8 @@ const messages = defineMessages({
delete: { id: 'status.delete', defaultMessage: 'Delete' }, delete: { id: 'status.delete', defaultMessage: 'Delete' },
redraft: { id: 'status.redraft', defaultMessage: 'Delete & re-draft' }, redraft: { id: 'status.redraft', defaultMessage: 'Delete & re-draft' },
edit: { id: 'status.edit', defaultMessage: 'Edit' }, edit: { id: 'status.edit', defaultMessage: 'Edit' },
bite: { id: 'status.bite', defaultMessage: 'Bite post' },
biteUser: { id: 'account.bite', defaultMessage: 'Bite @{name}' },
direct: { id: 'status.direct', defaultMessage: 'Privately mention @{name}' }, direct: { id: 'status.direct', defaultMessage: 'Privately mention @{name}' },
mention: { id: 'status.mention', defaultMessage: 'Mention @{name}' }, mention: { id: 'status.mention', defaultMessage: 'Mention @{name}' },
reply: { id: 'status.reply', defaultMessage: 'Reply' }, reply: { id: 'status.reply', defaultMessage: 'Reply' },
@ -73,6 +75,8 @@ class ActionBar extends PureComponent {
onEdit: PropTypes.func.isRequired, onEdit: PropTypes.func.isRequired,
onDirect: PropTypes.func.isRequired, onDirect: PropTypes.func.isRequired,
onMention: PropTypes.func.isRequired, onMention: PropTypes.func.isRequired,
onBite: PropTypes.func,
onBiteUser: PropTypes.func,
onMute: PropTypes.func, onMute: PropTypes.func,
onBlock: PropTypes.func, onBlock: PropTypes.func,
onMuteConversation: PropTypes.func, onMuteConversation: PropTypes.func,
@ -122,6 +126,14 @@ class ActionBar extends PureComponent {
this.props.onMention(this.props.status.get('account')); this.props.onMention(this.props.status.get('account'));
}; };
handleBiteClick = () => {
this.props.onBite(this.props.status.get('id'));
};
handleBiteUserClick = () => {
this.props.onBiteUser(this.props.status.getIn(['account', 'id']));
};
handleMuteClick = () => { handleMuteClick = () => {
this.props.onMute(this.props.status.get('account')); this.props.onMute(this.props.status.get('account'));
}; };
@ -198,9 +210,14 @@ class ActionBar extends PureComponent {
menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick, dangerous: true }); menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick, dangerous: true });
menu.push({ text: intl.formatMessage(messages.redraft), action: this.handleRedraftClick, dangerous: true }); menu.push({ text: intl.formatMessage(messages.redraft), action: this.handleRedraftClick, dangerous: true });
} else { } else {
menu.push({ text: intl.formatMessage(messages.bite), action: this.handleBiteClick });
menu.push({ text: intl.formatMessage(messages.biteUser, { name: status.getIn(['account', 'username']) }), action: this.handleBiteUserClick });
menu.push(null);
menu.push({ text: intl.formatMessage(messages.mention, { name: status.getIn(['account', 'username']) }), action: this.handleMentionClick }); menu.push({ text: intl.formatMessage(messages.mention, { name: status.getIn(['account', 'username']) }), action: this.handleMentionClick });
menu.push({ text: intl.formatMessage(messages.direct, { name: status.getIn(['account', 'username']) }), action: this.handleDirectClick }); menu.push({ text: intl.formatMessage(messages.direct, { name: status.getIn(['account', 'username']) }), action: this.handleDirectClick });
menu.push(null); menu.push(null);
menu.push({ text: intl.formatMessage(messages.mute, { name: status.getIn(['account', 'username']) }), action: this.handleMuteClick, dangerous: true }); menu.push({ text: intl.formatMessage(messages.mute, { name: status.getIn(['account', 'username']) }), action: this.handleMuteClick, dangerous: true });
menu.push({ text: intl.formatMessage(messages.block, { name: status.getIn(['account', 'username']) }), action: this.handleBlockClick, dangerous: true }); menu.push({ text: intl.formatMessage(messages.block, { name: status.getIn(['account', 'username']) }), action: this.handleBlockClick, dangerous: true });
menu.push({ text: intl.formatMessage(messages.report, { name: status.getIn(['account', 'username']) }), action: this.handleReport, dangerous: true }); menu.push({ text: intl.formatMessage(messages.report, { name: status.getIn(['account', 'username']) }), action: this.handleReport, dangerous: true });

View file

@ -13,7 +13,7 @@ import {
toggleReblog, toggleReblog,
toggleFavourite, toggleFavourite,
pin, pin,
unpin, unpin, bite, biteUser,
} from '../../../actions/interactions'; } from '../../../actions/interactions';
import { openModal } from '../../../actions/modal'; import { openModal } from '../../../actions/modal';
import { initMuteModal } from '../../../actions/mutes'; import { initMuteModal } from '../../../actions/mutes';
@ -94,6 +94,14 @@ const mapDispatchToProps = (dispatch) => ({
dispatch(mentionCompose(account)); dispatch(mentionCompose(account));
}, },
onBite (statusId) {
dispatch(bite(statusId));
},
onBiteUser (accountId) {
dispatch(biteUser(accountId));
},
onOpenMedia (media, index, lang) { onOpenMedia (media, index, lang) {
dispatch(openModal({ dispatch(openModal({
modalType: 'MEDIA', modalType: 'MEDIA',

View file

@ -39,7 +39,7 @@ import {
pin, pin,
unpin, unpin,
addReaction, addReaction,
removeReaction, removeReaction, bite, biteUser,
} from '../../actions/interactions'; } from '../../actions/interactions';
import { openModal } from '../../actions/modal'; import { openModal } from '../../actions/modal';
import { initMuteModal } from '../../actions/mutes'; import { initMuteModal } from '../../actions/mutes';
@ -377,6 +377,14 @@ class Status extends ImmutablePureComponent {
this.props.dispatch(mentionCompose(account)); this.props.dispatch(mentionCompose(account));
}; };
handleBiteClick = (statusId) => {
this.props.dispatch(bite(statusId));
};
handleBiteUserClick = (accountId) => {
this.props.dispatch(biteUser(accountId));
};
handleOpenMedia = (media, index, lang) => { handleOpenMedia = (media, index, lang) => {
this.props.dispatch(openModal({ this.props.dispatch(openModal({
modalType: 'MEDIA', modalType: 'MEDIA',
@ -731,6 +739,8 @@ class Status extends ImmutablePureComponent {
onEdit={this.handleEditClick} onEdit={this.handleEditClick}
onDirect={this.handleDirectClick} onDirect={this.handleDirectClick}
onMention={this.handleMentionClick} onMention={this.handleMentionClick}
onBite={this.handleBiteClick}
onBiteUser={this.handleBiteUserClick}
onMute={this.handleMuteClick} onMute={this.handleMuteClick}
onMuteConversation={this.handleConversationMuteClick} onMuteConversation={this.handleConversationMuteClick}
onBlock={this.handleBlockClick} onBlock={this.handleBlockClick}