Skip to content

Commit

Permalink
feat: double tap to reply
Browse files Browse the repository at this point in the history
  • Loading branch information
Rexogamer committed Dec 9, 2023
1 parent 1d07872 commit 7341e69
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 2 deletions.
2 changes: 2 additions & 0 deletions i18n/strings/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,8 @@
"theme": "Theme",
"theme_remark": "You'll have to open or close the side menu for your changes to appear everywhere.",
"messaging": {
"doubleTapToReply": "Reply to messages by double-tapping them",
"doubleTapToReply_remark": "This is only supported in the new message view.",
"emojiPack": "Emoji pack",
"experimentalScrolling": "Enable channel scrolling for old message view",
"experimentalScrolling_remark": "You can only scroll backwards.",
Expand Down
8 changes: 8 additions & 0 deletions src/Generic.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,14 @@ export const app = {
default: true,
type: 'boolean',
},
{
key: 'ui.messaging.doubleTapToReply',
category: 'functionality',
default: true,
type: 'boolean',
experimental: true,
remark: true,
},
{
key: 'ui.messaging.emojiPack',
category: 'appearance',
Expand Down
59 changes: 57 additions & 2 deletions src/MessageView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,16 @@ import {Button, Text} from './components/common/atoms';
import {Message} from './components/common/messaging';
import {calculateGrouped, fetchMessages} from './lib/utils';

function renderMessage(msg: RevoltMessage, messages?: RevoltMessage[]) {
type DoubleTapState = {
count: number;
message: string;
};

function renderMessage(
msg: RevoltMessage,
onPress: (m: RevoltMessage) => void,
messages?: RevoltMessage[],
) {
let grouped: boolean;
try {
grouped = messages
Expand All @@ -40,13 +49,46 @@ function renderMessage(msg: RevoltMessage, messages?: RevoltMessage[]) {
key={`message-${msg._id}`}
message={msg}
grouped={grouped}
onPress={() => onPress(msg)}
onUserPress={() => app.openProfile(msg.author, msg.channel?.server)}
onLongPress={async () => app.openMessage(msg)}
queued={false}
/>
);
}

function handleTap(
oldState: DoubleTapState,
newMessage: RevoltMessage,
setState: (s: DoubleTapState) => void,
) {
if (newMessage._id === oldState.message) {
if (oldState.count === 1) {
if (app.settings.get('ui.messaging.doubleTapToReply')) {
const existingReplies = [...app.getReplyingMessages()];
if (
existingReplies.filter(m => m.message._id === newMessage._id).length >
0
) {
setState({count: 0, message: ''});
return;
}
if (existingReplies.length >= 5) {
setState({count: 0, message: ''});
return;
}
app.setReplyingMessages([
...existingReplies,
{message: newMessage, mentions: false},
]);
}
setState({count: 0, message: ''});
}
} else {
setState({count: 1, message: newMessage._id});
}
}

function MessageViewErrorMessage({
error,
resetErrorBoundary,
Expand Down Expand Up @@ -80,9 +122,18 @@ export const NewMessageView = observer(
console.log(`[NEWMESSAGEVIEW] Creating message view for ${channel._id}...`);
const [messages, setMessages] = React.useState([] as RevoltMessage[]);
const [loading, setLoading] = React.useState(true);
const [doubleTapStatus, setDoubleTapStatus] = React.useState({
count: 0,
message: '',
});
// const setDoubleTapStatus = (s: DoubleTapState) => {
// console.log(s);
// _setDoubleTapStatus(s);
// };
const [atEndOfPage, setAtEndOfPage] = React.useState(false);
const [error, setError] = React.useState(null as any);
let scrollView: FlatList | null;

React.useEffect(() => {
console.log(`[NEWMESSAGEVIEW] Fetching messages for ${channel._id}...`);
async function getMessages() {
Expand Down Expand Up @@ -133,8 +184,12 @@ export const NewMessageView = observer(
});

// set functions here so they don't get recreated
const onPress = (m: RevoltMessage) => {
handleTap(doubleTapStatus, m, setDoubleTapStatus);
};

const renderItem = ({item}: {item: RevoltMessage}) => {
return renderMessage(item, messages);
return renderMessage(item, onPress, messages);
};

const keyExtractor = (item: RevoltMessage) => {
Expand Down
6 changes: 6 additions & 0 deletions src/components/common/messaging/Message.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ type MessageProps = {
queued: boolean;
onUserPress?: any;
onUsernamePress?: any;
onPress?: any;
onLongPress?: any;
};

Expand Down Expand Up @@ -225,6 +226,11 @@ export const Message = observer((props: MessageProps) => {
key={props.message._id}
activeOpacity={0.8}
delayLongPress={750}
onPress={
props.message.author?.relationship === 'Blocked'
? null
: props.onPress
}
onLongPress={
props.message.author?.relationship === 'Blocked'
? null
Expand Down

0 comments on commit 7341e69

Please sign in to comment.