-
-
Notifications
You must be signed in to change notification settings - Fork 198
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
Add accept/decline buttons to game result dialog after rematch offer received #1153
Add accept/decline buttons to game result dialog after rematch offer received #1153
Conversation
In some language "Rematch offered" can be a long text, so I'm not sure it would display nicely on one line. We could instead have the "Rematch offered" on one line and below the centered buttons "Accept Decline". |
One thing I'm noticing here is that swapping out the button to offer a rematch might be problematic in the case that the user is about the offer a rematch and the UX changes under them. Not sure how big of a problem this is in reality |
Good question, now sure either how to handle this properly. Perhaps it is not that much a problem. Also, how about having the whole rematch offer block stand out with a light background color for instance? |
@veloce thanks, I am a bit worried if we add a label above the buttons it will cause a layout shift which could be annoying. I wonder how clear the latest approach is, the "Accept rematch" button implies one has been offered but it's maybe not clear. I think the design is clean, at least |
Layout shift can be handled by animating the change I think. Like a height change animation coupled with an opacity animation maybe? |
Feel free to experiment with this and share screen recording of the UX that you find works well also. |
Sure I have not really worked with animations so I will have a play around, appreciate the feedback |
Here is an attempt at using animation, I think it works. In summary:
400ms based on gut feel and this Simulator.Screen.Recording.-.iPhone.16.Plus.-.2024-11-13.at.13.17.40.mp4 |
I think it would be better without animation 😅 Or with a faster one |
It can be faster I thought it would be easier to show it a bit slower for review. Not much point going too fast without simply removing it and I think without it the layout shift could be annoying. Happy for someone to make the call, ultimately, just trying things out at the moment |
bffa752
to
eec9d65
Compare
As suggested by @Boubou78000 your alternate approach is better to avoid the layout shift (not showing the "Your opponent offered a rematch"). We'd still use a It should be pretty obvious that the opponent offers a rematch, seeing the labels "Accept rematch", "Decline". Can you post a video showing all the states:
Thanks! |
Yeah I'm a little concerned that the buttons alone are not enough but happy to go with that for now. I suspect there will be feedback if it's not clear! Will make the changes, no problem |
f54c9ed
to
b0d9fc5
Compare
Changes as discussed. Video: Simulator.Screen.Recording.-.iPhone.16.Pro.-.2024-11-14.at.13.41.28.mp4 |
@Jimima there is still the rematch button when clicked it? Should it not just show a cancel rematch button, not both? Weird 😅 |
…imima/lichess-mobile into 1148-accept-or-decline-rematch-request
Oops, yeah that's just a bug. I should have noticed that. Should be better now Simulator.Screen.Recording.-.iPhone.16.Pro.-.2024-11-14.at.16.20.28.mp4 |
Nice 👍 I just noticed another small thing: the rematch and the cancel rematch buttons are the same design, so MAYBE add a box or anything, just to see a visual change 🤔 Othetwise I think this PR is ready to merge 😃 |
@veloce I thought I had the commit but apparently not, IDE local history had it though :-) I have pushed up the animated version. I had a quick look at how I might keep the rematch button but disable it and I couldn't work out how the enabled/disabled state was being managed. Can you enlighten me? |
Actually never mind, I figured it out I think. Here is a version as requested (I think) Simulator.Screen.Recording.-.iPhone.16.Pro.-.2024-11-19.at.16.48.27.mp4 |
Yeah I think it's better like that! Thank you. Looks like the lint is failing. |
It is. I have a bit of tidying up to do anyway so I will do that and let you know |
FYI for next time, in case your IDE does not have the code in its undo history: you can recover "lost" commits (they're not actually lost, just unreachable) via |
I think there is a small padding problem between the rematch button and the accept rematch one... But I'm not sure... |
…imima/lichess-mobile into 1148-accept-or-decline-rematch-request
Latest (possibly final 🙂) iteration Edit: I should probably do a bit more testing of edge cases but here it is in the meantime Screen.Recording.2024-11-19.at.21.00.05.mov |
Again, it looks like there is extra space above the rematch button... |
You're right I'll take a look at that tomorrow |
@@ -89,6 +89,7 @@ class _GameEndDialogState extends ConsumerState<GameResultDialog> { | |||
Widget build(BuildContext context) { | |||
final ctrlProvider = gameControllerProvider(widget.id); | |||
final gameState = ref.watch(ctrlProvider).requireValue; | |||
final ValueNotifier<bool> animationFinished = ValueNotifier(false); |
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.
A ValueNotifier
should not be declared in build
method I think. If you do that you cannot properly dispose
it.
Rather than using ValueNotifier
and ValueListenableBuilder
you can directly declare a bool
in the state object and use setState
in onEnd
.
visible: animationFinished.value, | ||
child: Column( | ||
children: [ | ||
if (gameState.game.opponent?.offeringRematch == 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.
Instead of returning an empty column if gameState.game.opponent?.offeringRematch
is false, you could use a ternary operator to return either the column or a Sizebox.shrink()
if the opponent is not offering rematch.
@@ -98,6 +99,62 @@ class _GameEndDialogState extends ConsumerState<GameResultDialog> { | |||
padding: const EdgeInsets.only(bottom: 16.0), | |||
child: GameResult(game: gameState.game), | |||
), | |||
AnimatedSize( |
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.
Instead of using AnimatedSize
with Visibility
have you tried AnimatedCrossfade
? This is higher level and the result may be better since it animates size and opacity.
AnimatedCrossFade(
duration: const Duration(milliseconds: 400),
firstChild: Sizedbox.shrink(),
secondChild: RematchOfferDialog(...),
crossFadeState: gameState.game.opponent?.offeringRematch == true ? CrossFadeState.showSecond : CrossFadeState.showFirst,
)
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 wasn't aware of this, will take a look!
8fd87d8
to
cff7251
Compare
@veloce I think I addressed your comments. The AnimatedCrossfade works well. I used the curves to somewhat mimic the animation I had before but it's a little nicer, much nicer in code. You can play around with the curves to your hearts content. I think what I have is good but you (or anyone) might prefer a slightly different UX when fading in/out Simulator.Screen.Recording.-.iPhone.16.Pro.-.2024-11-20.at.11.53.20.mp4 |
Again, there is extra space above the rematch button, maybe because of the box around accept rematch? I mean that there is not the same distance between the accept rematch button (text) and the rematch button and between the rematch button the new opponent button... |
I added some padding because otherwise the layout felt cramped. This looks well spaced to my eyes |
Ok. Maybe keep padding, but less? |
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.
Looks great! Thanks @Jimima
@Jimima On android, the accept rematch and decline buttons aren’t good spaced: there is no horizontal padding... |
Just looking at this, seems straightforward to do but just wondering how to handle the UI. Initial implementation (not styled). UI suggestions welcome!
Relates to #1148