Update call-only conversation message request UI

This commit is contained in:
trevor-signal 2023-05-12 14:20:10 -04:00 committed by GitHub
parent ac8bec1ac0
commit bd0e08d6fd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 93 additions and 53 deletions

View file

@ -2260,16 +2260,6 @@ export class ConversationModel extends window.Backbone
return undefined;
}
decrementMessageCount(numberOfMessages = 1): void {
this.set({
messageCount: Math.max(
(this.get('messageCount') || 0) - numberOfMessages,
0
),
});
window.Signal.Data.updateConversation(this.attributes);
}
incrementSentMessageCount({ dry = false }: { dry?: boolean } = {}):
| Partial<ConversationAttributesType>
| undefined {
@ -2287,20 +2277,6 @@ export class ConversationModel extends window.Backbone
return undefined;
}
decrementSentMessageCount(numberOfMessages = 1): void {
this.set({
messageCount: Math.max(
(this.get('messageCount') || 0) - numberOfMessages,
0
),
sentMessageCount: Math.max(
(this.get('sentMessageCount') || 0) - numberOfMessages,
0
),
});
window.Signal.Data.updateConversation(this.attributes);
}
/**
* This function is called when a message request is accepted in order to
* handle sending read receipts and download any pending attachments.
@ -3464,7 +3440,17 @@ export class ConversationModel extends window.Backbone
})
);
if (
detailsToSave.callMode === CallMode.Direct &&
!detailsToSave.wasIncoming
) {
this.incrementSentMessageCount();
} else {
this.incrementMessageCount();
}
this.trigger('newmessage', model);
void this.updateUnread();
this.set('active_at', timestamp);

View file

@ -53,17 +53,9 @@ class ExpiringMessagesDeletionService {
sentAt: message.get('sent_at'),
});
const conversation = message.getConversation();
// We do this to update the UI, if this message is being displayed somewhere
message.trigger('expired');
window.reduxActions.conversations.messageExpired(message.id);
if (conversation) {
// An expired message only counts as decrementing the message count, not
// the sent message count
conversation.decrementMessageCount();
}
});
if (messages.length > 0) {

View file

@ -111,11 +111,7 @@ import {
import { missingCaseError } from '../../util/missingCaseError';
import { viewSyncJobQueue } from '../../jobs/viewSyncJobQueue';
import { ReadStatus } from '../../messages/MessageReadStatus';
import {
isIncoming,
isOutgoing,
processBodyRanges,
} from '../selectors/message';
import { isIncoming, processBodyRanges } from '../selectors/message';
import { getActiveCallState } from '../selectors/calling';
import { sendDeleteForEveryoneMessage } from '../../util/sendDeleteForEveryoneMessage';
import type { ShowToastActionType } from './toast';
@ -1638,9 +1634,6 @@ function deleteMessages({
throw new Error('deleteMessage: No conversation found');
}
let outgoingDeleted = 0;
let incomingDeleted = 0;
await Promise.all(
messageIds.map(async messageId => {
const message = await getMessageById(messageId);
@ -1654,12 +1647,6 @@ function deleteMessages({
`deleteMessages: message conversation ${messageConversationId} doesn't match provided conversation ${conversationId}`
);
}
if (isOutgoing(message.attributes)) {
outgoingDeleted += 1;
} else {
incomingDeleted += 1;
}
})
);
@ -1682,12 +1669,6 @@ function deleteMessages({
await window.Signal.Data.removeMessages(messageIds);
if (outgoingDeleted > 0) {
conversation.decrementSentMessageCount(outgoingDeleted);
}
if (incomingDeleted > 0) {
conversation.decrementMessageCount(incomingDeleted);
}
popPanelForConversation()(dispatch, getState, undefined);
if (nearbyMessageId != null) {

View file

@ -94,7 +94,6 @@ const mapStateToProps = (
const maxGroupSize = getGroupSizeHardLimit(1001);
const maxRecommendedGroupSize = getGroupSizeRecommendedLimit(151);
return {
...props,
areWeASubscriber: getAreWeASubscriber(state),

View file

@ -0,0 +1,82 @@
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { PrimaryDevice } from '@signalapp/mock-server';
import createDebug from 'debug';
import Long from 'long';
import type { Page } from 'playwright';
import assert from 'assert';
import * as durations from '../../util/durations';
import type { App } from '../playwright';
import { Bootstrap } from '../bootstrap';
export const debug = createDebug('mock:test:edit');
describe('unknown contacts', function unknownContacts() {
this.timeout(durations.MINUTE);
let bootstrap: Bootstrap;
let app: App;
let page: Page;
let unknownContact: PrimaryDevice;
beforeEach(async () => {
bootstrap = new Bootstrap();
await bootstrap.init();
app = await bootstrap.link();
page = await app.getWindow();
const { server, desktop } = bootstrap;
unknownContact = await server.createPrimaryDevice({
profileName: 'Hugh Ameye',
});
const ourKey = await desktop.popSingleUseKey();
await unknownContact.addSingleUseKey(desktop, ourKey);
});
afterEach(async function after() {
if (!bootstrap) {
return;
}
if (this.currentTest?.state !== 'passed') {
await bootstrap.saveLogs(app);
}
await app.close();
await bootstrap.teardown();
});
it('blocks incoming calls from unknown contacts & shows message request', async () => {
const { desktop } = bootstrap;
debug('sending calling offer message');
await unknownContact.sendRaw(desktop, {
callingMessage: {
offer: {
callId: new Long(Math.floor(Math.random() * 1e10)),
},
},
});
debug('opening conversation');
const leftPane = page.locator('.left-pane-wrapper');
const conversationListItem = leftPane.getByRole('button', {
name: 'Chat with Unknown contact',
});
await conversationListItem.getByText('Message Request').click();
const conversationStack = page.locator('.conversation-stack');
await conversationStack.getByText('Missed voice call').waitFor();
debug('accepting message request');
await page.getByText('message you and share your name').waitFor();
await page.getByRole('button', { name: 'Accept' }).click();
assert.strictEqual(
await page.getByText('message you and share your name').count(),
0
);
});
});