Skip to content
Open
Show file tree
Hide file tree
Changes from 59 commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
516c650
PR 1
brianHarder Jun 10, 2025
5e47c5c
Update README.md
brianHarder Jun 10, 2025
cb57288
Update README.md
brianHarder Jun 27, 2025
d781d40
Update README.md
brianHarder Jun 27, 2025
9489563
Merge branch 'signalapp:main' into main
brianHarder Jun 27, 2025
d76782c
Merge branch 'signalapp:main' into main
brianHarder Jul 9, 2025
155ca30
Merge branch 'signalapp:main' into main
brianHarder Jul 13, 2025
9ce876d
Merge branch 'signalapp:main' into main
brianHarder Jul 18, 2025
3352a3d
Update README.md
brianHarder Jul 23, 2025
46f000f
Merge branch 'signalapp:main' into main
brianHarder Jul 27, 2025
2dfcf8c
Update README.md
brianHarder Jul 30, 2025
28d12a6
Merge branch 'signalapp:main' into main
brianHarder Aug 4, 2025
5316376
Merge branch 'signalapp:main' into main
brianHarder Aug 6, 2025
1cd1527
Fix self badge retrieval
yash-signal Aug 7, 2025
fda89ea
Update pino to 9.8.0
indutny-signal Aug 7, 2025
369a2d4
Update electron to 37.2.6
ayumi-signal Aug 7, 2025
62f6462
Faster CI runs
indutny-signal Aug 7, 2025
7e06391
Fix calls tab mark read error when adhoc call is the latest
ayumi-signal Aug 7, 2025
7658722
Update @signalapp/sqlcipher to 2.2.2
indutny-signal Aug 7, 2025
8819e4d
Add support for call link epochs
emir-signal Aug 7, 2025
1e5c0ca
Filter out SMS conversations with no messages from the contact results
jamiebuilds-signal Aug 7, 2025
283247c
Use larger windows runner in CI
indutny-signal Aug 7, 2025
2b00d58
Fix benchmark name
indutny-signal Aug 8, 2025
ab03113
Fix quote annotation for GIFs
indutny-signal Aug 8, 2025
54fc9e8
Fix backup thumbnail encryption when downloading
trevor-signal Aug 8, 2025
297e444
Remove unused capabilities
indutny-signal Aug 8, 2025
04c4a8b
Fix check in wasGroupCallRingPreviouslyCanceled
indutny-signal Aug 8, 2025
811bde2
getConversation: first/familyName should use nickname if set
scottnonnenberg-signal Aug 11, 2025
91ebd7a
Revert react-virtualized key changes
indutny-signal Aug 11, 2025
d0e8a28
Key ConversationList by mode in left pane
indutny-signal Aug 11, 2025
cd98e1d
Fix image thumbnail cover size
jamiebuilds-signal Aug 11, 2025
3573884
Upgrade libsignal to v0.78.2
akonradi-signal Aug 11, 2025
c2be1f1
Use ErrorBoundary for donations
ayumi-signal Aug 11, 2025
76de8cb
Treat 403 from CDN0 the same as a 404 from others CDNs
trevor-signal Aug 11, 2025
5566c94
Linux builds: Use ubuntu 22 image
ayumi-signal Aug 11, 2025
a771c29
Add license-comments eslint rule
jamiebuilds-signal Aug 11, 2025
4272f5f
Remove backbone as a dependency
scottnonnenberg-signal Aug 11, 2025
cfcd9d5
Get Tailwind ready for general usage
jamiebuilds-signal Aug 11, 2025
7bf9b78
Add setting for "keep muted chats archived"
yash-signal Aug 12, 2025
a018c70
ConversationController: Listen for updates and update unread count
scottnonnenberg-signal Aug 12, 2025
9543b81
Add in progress donation placeholder badge to donations home
ayumi-signal Aug 12, 2025
a4407ce
Post Donate Badge Toggle Modal
yash-signal Aug 13, 2025
b782aed
Fix attachment key in AttachmentList
indutny-signal Aug 13, 2025
5d584f6
Use fully qualified keys in ConversationList
indutny-signal Aug 13, 2025
d6cd88f
Release notes fetcher test flake fix
yash-signal Aug 13, 2025
f71fb14
Add existence check to addStickerPackReference
indutny-signal Aug 13, 2025
21cc370
Upgrade mock-server to v13.2.2
akonradi-signal Aug 13, 2025
bcfe4da
Begin Donations testing
ayumi-signal Aug 13, 2025
770953f
Release notes for 7.67
indutny-signal Aug 13, 2025
1054177
Update strings
indutny-signal Aug 13, 2025
5b77a52
Update DNS fallback
indutny-signal Aug 13, 2025
6588b5b
v7.69.0-alpha.1
indutny-signal Aug 13, 2025
37cc148
Added CSS selectors to modify chat list highlighting
brianHarder Aug 14, 2025
0b9b262
Prevent default mouse behavior
brianHarder Aug 14, 2025
e085483
Test file for chat highlighting
brianHarder Aug 14, 2025
0c0e037
Rebase update
brianHarder Aug 15, 2025
4f0afcb
Fixed grey tone for keyboard highlight
brianHarder Aug 15, 2025
fadd5ba
Merge branch 'signalapp:main' into chat-highlighting
brianHarder Aug 15, 2025
3dd9a7a
Update README to pass linter
brianHarder Aug 15, 2025
5444447
Merge remote-tracking branch 'upstream/main' into chat-highlighting
brianHarder Sep 15, 2025
966f668
Remove unit test
brianHarder Sep 15, 2025
90c1fe7
Remove onMouseDown change in base convo list item
brianHarder Sep 15, 2025
ba7d149
Switch to light-dark() syntax
brianHarder Sep 15, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 18 additions & 2 deletions stylesheets/_modules.scss
Original file line number Diff line number Diff line change
Expand Up @@ -5290,8 +5290,7 @@ button.module-calling-participants-list__contact {
}
}

&:hover:not(:disabled, &--disabled, &--is-selected),
&:focus:not(:disabled, &--disabled, &--is-selected) {
&:hover:not(:disabled, &--disabled, &--is-selected) {
@include mixins.light-theme {
background-color: variables.$color-gray-05;
#{$unread-indicator} {
Expand All @@ -5306,6 +5305,23 @@ button.module-calling-participants-list__contact {
}
}

@include mixins.keyboard-mode {
&:focus:not(:disabled, &--disabled, &--is-selected) {
@include mixins.light-theme {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are we trying to set the colors to the opposite of the hover state above (I may just be not understanding).

Also, have you tested this in light mode? I'm not sure nested mixings work the way we always intend. We've been moving to the newer CSS syntax light-dark() which might work well here.

background-color: variables.$color-gray-75;
#{$unread-indicator} {
border-color: variables.$color-gray-75;
}
}
@include mixins.dark-theme {
background-color: variables.$color-gray-05;
#{$unread-indicator} {
border-color: variables.$color-gray-05;
}
}
}
}

&--is-selected {
@include mixins.light-theme {
background-color: variables.$color-gray-15;
Expand Down
7 changes: 6 additions & 1 deletion ts/components/conversationList/BaseConversationListItem.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,12 @@ export const BaseConversationListItem: FunctionComponent<PropsType> =
data-testid={testId}
disabled={disabled}
onClick={onClick}
onMouseDown={onMouseDown}
onMouseDown={event => {
event.preventDefault();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can you say more why this change is necessary?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@trevor-signal thank you for the feedback! I included this line of code because the default Chromium behavior would maintain an 'active' state on a chat list item throughout the drag, which I believe could cause the highlight to linger. This change was specifically to address the highlight during dragging.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you say more? If I remove this line, things seem to continue to work well.

if (onMouseDown) {
onMouseDown();
}
}}
type="button"
>
{contents}
Expand Down
99 changes: 99 additions & 0 deletions ts/test-mock/messaging/conversationListHighlight_test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
// Copyright 2024 Signal Messenger, LLC
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@brianHarder like I mentioned in the review, this is really cool that we could have a mock test here, but I think a mock test for this minor UI change is unnecessary (each mock test has an overhead). Do you mind (sadly) removing it?

// SPDX-License-Identifier: AGPL-3.0-only

import { expect } from 'playwright/test';

import { Bootstrap } from '../bootstrap';
import type { App } from '../playwright';
import * as durations from '../../util/durations';
import { strictAssert } from '../../util/assert';

describe('conversation list highlighting', function (this: Mocha.Suite) {
this.timeout(durations.MINUTE);

let bootstrap: Bootstrap;
let app: App;

beforeEach(async () => {
bootstrap = new Bootstrap();
await bootstrap.init();
app = await bootstrap.link();
});

afterEach(async function (this: Mocha.Context) {
if (!bootstrap) {
return;
}

await bootstrap.maybeSaveLogs(this.currentTest, app);
await app.close();
await bootstrap.teardown();
});

it('highlights only on hover', async () => {
const { contacts, desktop } = bootstrap;
const [friend] = contacts;

await friend.sendText(desktop, 'hi');

const page = await app.getWindow();
const leftPane = page.locator('#LeftPane');
const item = leftPane
.locator('.module-conversation-list__item--contact-or-conversation')
.first();

await item.waitFor();

const defaultBg = await item.evaluate(
el => getComputedStyle(el).backgroundColor
);

await item.hover();
const hoverBg = await item.evaluate(
el => getComputedStyle(el).backgroundColor
);
expect(hoverBg).not.toBe(defaultBg);

await page.mouse.move(0, 0);
const afterHoverBg = await item.evaluate(
el => getComputedStyle(el).backgroundColor
);
expect(afterHoverBg).toBe(defaultBg);
});

it('does not stay highlighted after drag', async () => {
const { contacts, desktop } = bootstrap;
const [friend] = contacts;

await friend.sendText(desktop, 'hi');

const page = await app.getWindow();
const leftPane = page.locator('#LeftPane');
const item = leftPane
.locator('.module-conversation-list__item--contact-or-conversation')
.first();

await item.waitFor();

const defaultBg = await item.evaluate(
el => getComputedStyle(el).backgroundColor
);

const box = await item.boundingBox();
strictAssert(box, 'Bounding box not found');

await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2);
await page.mouse.down();
await page.mouse.move(box.x + box.width / 2, box.y - 40);
await page.mouse.up();
await page.mouse.move(0, 0);

const afterDragBg = await item.evaluate(
el => getComputedStyle(el).backgroundColor
);
expect(afterDragBg).toBe(defaultBg);

const isActive = await item.evaluate(el => document.activeElement === el);
expect(isActive).toBe(false);
});
});