Show "unplayed" dot on incoming audio messages
This commit is contained in:
parent
9fd191ae00
commit
b0750e5f4e
36 changed files with 812 additions and 175 deletions
50
ts/test-both/messages/MessageReadStatus_test.ts
Normal file
50
ts/test-both/messages/MessageReadStatus_test.ts
Normal file
|
@ -0,0 +1,50 @@
|
|||
// Copyright 2021 Signal Messenger, LLC
|
||||
// SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
import { assert } from 'chai';
|
||||
|
||||
import { ReadStatus, maxReadStatus } from '../../messages/MessageReadStatus';
|
||||
|
||||
describe('message read status utilities', () => {
|
||||
describe('maxReadStatus', () => {
|
||||
it('returns the status if passed the same status twice', () => {
|
||||
assert.strictEqual(
|
||||
maxReadStatus(ReadStatus.Unread, ReadStatus.Unread),
|
||||
ReadStatus.Unread
|
||||
);
|
||||
});
|
||||
|
||||
it('sorts Unread < Read', () => {
|
||||
assert.strictEqual(
|
||||
maxReadStatus(ReadStatus.Unread, ReadStatus.Read),
|
||||
ReadStatus.Read
|
||||
);
|
||||
assert.strictEqual(
|
||||
maxReadStatus(ReadStatus.Read, ReadStatus.Unread),
|
||||
ReadStatus.Read
|
||||
);
|
||||
});
|
||||
|
||||
it('sorts Read < Viewed', () => {
|
||||
assert.strictEqual(
|
||||
maxReadStatus(ReadStatus.Read, ReadStatus.Viewed),
|
||||
ReadStatus.Viewed
|
||||
);
|
||||
assert.strictEqual(
|
||||
maxReadStatus(ReadStatus.Viewed, ReadStatus.Read),
|
||||
ReadStatus.Viewed
|
||||
);
|
||||
});
|
||||
|
||||
it('sorts Unread < Viewed', () => {
|
||||
assert.strictEqual(
|
||||
maxReadStatus(ReadStatus.Unread, ReadStatus.Viewed),
|
||||
ReadStatus.Viewed
|
||||
);
|
||||
assert.strictEqual(
|
||||
maxReadStatus(ReadStatus.Viewed, ReadStatus.Unread),
|
||||
ReadStatus.Viewed
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
55
ts/test-both/messages/migrateLegacyReadStatus_test.ts
Normal file
55
ts/test-both/messages/migrateLegacyReadStatus_test.ts
Normal file
|
@ -0,0 +1,55 @@
|
|||
// Copyright 2021 Signal Messenger, LLC
|
||||
// SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
// We want to cast to `any` because we're passing an unexpected field.
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
|
||||
import { assert } from 'chai';
|
||||
import { ReadStatus } from '../../messages/MessageReadStatus';
|
||||
|
||||
import { migrateLegacyReadStatus } from '../../messages/migrateLegacyReadStatus';
|
||||
|
||||
describe('migrateLegacyReadStatus', () => {
|
||||
it("doesn't migrate messages that already have the modern read state", () => {
|
||||
assert.isUndefined(
|
||||
migrateLegacyReadStatus({ readStatus: ReadStatus.Read })
|
||||
);
|
||||
assert.isUndefined(
|
||||
migrateLegacyReadStatus({ readStatus: ReadStatus.Unread })
|
||||
);
|
||||
});
|
||||
|
||||
it('converts legacy read values to "read"', () => {
|
||||
assert.strictEqual(migrateLegacyReadStatus({}), ReadStatus.Read);
|
||||
assert.strictEqual(
|
||||
migrateLegacyReadStatus({ unread: 0 } as any),
|
||||
ReadStatus.Read
|
||||
);
|
||||
assert.strictEqual(
|
||||
migrateLegacyReadStatus({ unread: false } as any),
|
||||
ReadStatus.Read
|
||||
);
|
||||
});
|
||||
|
||||
it('converts legacy unread values to "unread"', () => {
|
||||
assert.strictEqual(
|
||||
migrateLegacyReadStatus({ unread: 1 } as any),
|
||||
ReadStatus.Unread
|
||||
);
|
||||
assert.strictEqual(
|
||||
migrateLegacyReadStatus({ unread: true } as any),
|
||||
ReadStatus.Unread
|
||||
);
|
||||
});
|
||||
|
||||
it('converts unexpected truthy values to "unread"', () => {
|
||||
assert.strictEqual(
|
||||
migrateLegacyReadStatus({ unread: 99 } as any),
|
||||
ReadStatus.Unread
|
||||
);
|
||||
assert.strictEqual(
|
||||
migrateLegacyReadStatus({ unread: 'wow!' } as any),
|
||||
ReadStatus.Unread
|
||||
);
|
||||
});
|
||||
});
|
|
@ -21,6 +21,7 @@ import {
|
|||
} from '../../../state/selectors/search';
|
||||
import { makeLookup } from '../../../util/makeLookup';
|
||||
import { getDefaultConversation } from '../../helpers/getDefaultConversation';
|
||||
import { ReadStatus } from '../../../messages/MessageReadStatus';
|
||||
|
||||
import { StateType, reducer as rootReducer } from '../../../state/reducer';
|
||||
|
||||
|
@ -54,7 +55,7 @@ describe('both/state/selectors/search', () => {
|
|||
sourceUuid: 'sourceUuid',
|
||||
timestamp: NOW,
|
||||
type: 'incoming' as const,
|
||||
unread: false,
|
||||
readStatus: ReadStatus.Read,
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -2,20 +2,22 @@
|
|||
// SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
import { assert } from 'chai';
|
||||
import { ReadStatus } from '../../messages/MessageReadStatus';
|
||||
|
||||
import { isMessageUnread } from '../../util/isMessageUnread';
|
||||
|
||||
describe('isMessageUnread', () => {
|
||||
it("returns false if the message's `unread` field is undefined", () => {
|
||||
it("returns false if the message's `readStatus` field is undefined", () => {
|
||||
assert.isFalse(isMessageUnread({}));
|
||||
assert.isFalse(isMessageUnread({ unread: undefined }));
|
||||
assert.isFalse(isMessageUnread({ readStatus: undefined }));
|
||||
});
|
||||
|
||||
it('returns false if the message is read', () => {
|
||||
assert.isFalse(isMessageUnread({ unread: false }));
|
||||
it('returns false if the message is read or viewed', () => {
|
||||
assert.isFalse(isMessageUnread({ readStatus: ReadStatus.Read }));
|
||||
assert.isFalse(isMessageUnread({ readStatus: ReadStatus.Viewed }));
|
||||
});
|
||||
|
||||
it('returns true if the message is unread', () => {
|
||||
assert.isTrue(isMessageUnread({ unread: true }));
|
||||
assert.isTrue(isMessageUnread({ readStatus: ReadStatus.Unread }));
|
||||
});
|
||||
});
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue