-
Notifications
You must be signed in to change notification settings - Fork 245
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Message List from Same User is now Distinguishable via Surface Tint on Long Press #1152
base: main
Are you sure you want to change the base?
Message List from Same User is now Distinguishable via Surface Tint on Long Press #1152
Conversation
Please post screenshots of your changes in the PR description, as videos are hard to review. |
Alya means before/after screenshots of the app's UI. We can read your code easily without screenshots :) |
Also I see there's a failing check; please run tests locally ( |
Are those before/after scheenshots the same? The point is to show the differences from your PR's changes. |
@alya, |
Oh, I see it now. Is it happening in the dark theme screenshot? I don't see a difference, so if the effect is there, it's too subtle. |
It's also best to take screenshots that are identical other than the change your PR makes, to make them easy to compare. |
@alya |
Sure, please be mindful to review your own work carefully next time. Posting screenshots is one of the things that should help you identify any problems yourself, before asking someone else to take a look. |
Here, is the updated PR. Requirements according to Figma FileBefore and After Screenshots
Both |
Hi @Gaurav-Kushwaha-1225! Thanks for the updates. For the PR to be reviewable, we need tests for this: https://github.com/zulip/zulip-flutter?tab=readme-ov-file#submitting-a-pull-request Please also pay attention to the point on commit style guide from that link, and organize the commit history coherently. |
I see you're adding merge commits; Zulip doesn't use those. |
Hi @PIG208, I have added the necessary tests for these changes in |
Looks like this update still hasn't addressed my previous comment on the commit style:
As Chris said, we don't use merge commits. Could you please also review the commit style guide linked in our README? |
1b7e27d
to
4d26607
Compare
I’ve updated the commits, improving the commit style and making other enhancements. Please let me know if any further changes are required. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks! Comments below. Please also squash these two commits into one, so the tests land in the same commit as the code they're testing.
lib/widgets/theme.dart
Outdated
@@ -332,6 +335,7 @@ class DesignVariables extends ThemeExtension<DesignVariables> { | |||
final Color subscriptionListHeaderLine; | |||
final Color subscriptionListHeaderText; | |||
final Color unreadCountBadgeTextForChannel; | |||
final Color pressedTint; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Since this comes from a variable in the Figma, please move it so it's with the other Figma variables: background
, bannerBgIntDanger
, etc., and put it there alphabetically, so (in current main
) between mainBackground
and textInput
.
(And reorder its other appearances accordingly)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It is named as pressedTint
itself in the design file.
And, regarding the reordering, that I will reorder and update soon.
lib/widgets/message_list.dart
Outdated
onLongPress: () => showMessageActionSheet(context: context, message: message), | ||
onLongPress: () async { | ||
setState(() { | ||
isMessageActionSheetOpen = true; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If isMessageActionSheetOpen
is supposed to mean what its name says, it isn't accurate here. The action sheet won't be open until 100ms have passed.
I'd like to try a different approach, using an existing Flutter API that seems suitable.
-
_MessageWithPossibleSenderState
gets a new final field:final WidgetStatesController statesController = WidgetStatesController();
-
Override
_MessageWithPossibleSenderState.initState
like so:@override void initState() { super.initState(); statesController.addListener(() { setState(() { // Force a rebuild to resolve background color }); }); }
-
Override
_MessageWithPossibleSenderState.dispose
, callingstatesController.dispose()
-
In addition to the existing
onLongPress
, passonLongPressDown
,onLongPressCancel
, andonLongPressUp
to theGestureDetector
. Each passed callback should callstatesController.update(WidgetState.pressed, …
with true or false as appropriate. -
At the top of the existing
onLongPress
calback, callstatesController.update(WidgetState.selected, true)
. When the action sheet is dismissed, unset that withfalse
. -
For the background color, use:
color: const WidgetStateColor.fromMap({ WidgetState.pressed: designVariables.pressedTint, WidgetState.selected: designVariables.pressedTint, WidgetState.any: Colors.transparent, }).resolve(statesController.value)
lib/widgets/message_list.dart
Outdated
isMessageActionSheetOpen = true; | ||
}); | ||
|
||
await Future.delayed(const Duration(milliseconds: 100), () { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think we want an additional 100ms delay here; let's remove it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In addition to Chris's comments above, one other high-level comment. (I've only done an initial skim of this PR, since it's still in maintainer review.)
lib/widgets/action_sheet.dart
Outdated
@@ -61,7 +62,7 @@ void _showActionSheet( | |||
children: optionButtons))))), | |||
const ActionSheetCancelButton(), | |||
]))); | |||
}); | |||
}).whenComplete(onDismiss ?? () {}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This type of API based on callbacks can make the control flow pretty confusing to follow. The behavior here can be more cleanly modeled using Future.
Let's also avoid using explicit Future methods like whenComplete
, in favor of async
and await
.
Concretely, let's have this function _showActionSheet
, and its caller showMessageActionSheet
, mimic the API we developed for showErrorDialog
:
/// Displays an [AlertDialog] with a dismiss button.
///
/// The [DialogStatus.closed] field of the return value can be used
/// for waiting for the dialog to be closed.
// This API is inspired by [ScaffoldManager.showSnackBar]. We wrap
// [showDialog]'s return value, a [Future], inside [DialogStatus]
// whose documentation can be accessed. This helps avoid confusion when
// intepreting the meaning of the [Future].
DialogStatus showErrorDialog({
We can use the same DialogStatus
type for the return value. I'll update your PR branch with a quick prep commit that gives it a slightly more general name ModalStatus
, and slightly more general docs, so that it's ready to be used that way.
Done. @Gaurav-Kushwaha-1225 As the first step when you start work on your next revision, be sure to pull down the updated version of this branch — use |
We'll soon use this for modal bottom sheets too, aka action sheets. Arguably that could mean it belongs in some other file, not specific to dialogs nor bottom sheets. But there isn't an obvious other file for it, and I think this is as good a home as any.
It allows to see a tint color on the message when it is pressed. Moved `MessageWithPossibleSender` to `StatefulWidget` and used `ModalStatus` return type of `showMessageActionSheet` to check whether BottomSheet is open or not. Added `pressedTint` to `DesignVariables` for using it in `MessageWithPossibleSender`. Added tests too in `message_list_test.dart`. Fixes: zulip#1142
22832d0
to
029c9a8
Compare
Changes Made
This issue resolved by:
MessageWithPossibleSender
with aContainer
isMessageActionSheetOpen
istrue
show the surface tint, else remainColors.transparent
.For this,
MessageWithPossibleSender
fromStatelessWidget
toStatefulWidget
.VoidCallback? onDismiss
method in parameters ofshowMessageActionSheet
or BottomSheet for updating the Surface Tint of message.Fixes #1142
Screenshots
video_2024-12-13_13-16-02.mp4
video_2024-12-13_13-16-08.mp4