Align motion across mobile flows#784
Conversation
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Greptile SummaryThis PR aligns animation motion across iOS and Android for the onboarding restore flow and the swipe-to-send confirmation screen. All four changed files are animation-only — no business logic, network calls, or data handling is touched.
Confidence Score: 5/5Safe to merge — changes are scoped entirely to animation and visual presentation with no mutations to business logic or state beyond animation-local variables. Every changed file touches only rendering and animation code. The previousErrorMessage pattern is logically sound: LaunchedEffect updates it whenever a non-null error arrives, so visibleErrorMessage always holds the last error string during the exit animation. The cosine-eased opacity math in PulsingSendArrow is correct across all boundary values. No data paths, persistence, or network calls are affected. No files require special attention. Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
subgraph iOS_PulsingSendArrow["iOS: PulsingSendArrow"]
A([isPulsing = false]) -->|drag released, offset=0| B([isPulsing = true])
B -->|onChange fires| C[pulseStartedAt = now]
C --> D[TimelineView fires each frame]
D --> E[opacity = 1 - 0.4 x easedProgress]
E --> D
B -->|drag starts| A
A --> F[opacity = 1.0 guard returns early]
end
subgraph Android_Error["Android: AnimatedVisibility Error Card"]
G([errorMessage = null]) -->|error arrives| H([errorMessage != null])
H --> I[visible=true, slide+fade IN 300ms]
I --> J[LaunchedEffect: previousErrorMessage = errorMessage]
H -->|error cleared| K([errorMessage = null])
K --> L[visible=false, slide+fade OUT 300ms, content = previousErrorMessage]
L --> G
end
subgraph Android_Dots["Android: ThreeDots bounce"]
M[progress 0 to 1 tween 500ms RepeatMode.Reverse] --> N[scale = 0.5 + progress x 0.5]
N --> O[translationY = -6dp x progress]
O --> M
end
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
subgraph iOS_PulsingSendArrow["iOS: PulsingSendArrow"]
A([isPulsing = false]) -->|drag released, offset=0| B([isPulsing = true])
B -->|onChange fires| C[pulseStartedAt = now]
C --> D[TimelineView fires each frame]
D --> E[opacity = 1 - 0.4 x easedProgress]
E --> D
B -->|drag starts| A
A --> F[opacity = 1.0 guard returns early]
end
subgraph Android_Error["Android: AnimatedVisibility Error Card"]
G([errorMessage = null]) -->|error arrives| H([errorMessage != null])
H --> I[visible=true, slide+fade IN 300ms]
I --> J[LaunchedEffect: previousErrorMessage = errorMessage]
H -->|error cleared| K([errorMessage = null])
K --> L[visible=false, slide+fade OUT 300ms, content = previousErrorMessage]
L --> G
end
subgraph Android_Dots["Android: ThreeDots bounce"]
M[progress 0 to 1 tween 500ms RepeatMode.Reverse] --> N[scale = 0.5 + progress x 0.5]
N --> O[translationY = -6dp x progress]
O --> M
end
Reviews (2): Last reviewed commit: "Smooth mobile animation transitions" | Re-trigger Greptile |
Summary
How to test
./gradlew :app:compileDevDebugKotlin./gradlew ktlintCheckswiftformat --lint ios/Cove/Flows/SendFlow/ConfirmScreen/SwipeToSendView.swift --swiftversion 6just build-iosxcodebuild -scheme Cove -sdk iphonesimulator -arch arm64 -derivedDataPath /tmp/cove-ios-derived buildSummary by CodeRabbit