fix(map-view): preserve scroll position and other magic scrolling UX tricks#1216
Conversation
fb1d305 to
6ee5521
Compare
Greptile Summaryelo żelo solvrowiczu 👋 This PR overhauls the map bottom-sheet scroll UX by capturing the sheet expansion and list scroll offset just before a marker is activated, then restoring them after deactivation via a post-frame retry loop (
Confidence Score: 5/5Safe to merge — the core restore logic is well-guarded with attachment/hasClients checks and a capped retry budget; no data loss or broken navigation paths identified. All changes are additive UX improvements or clean-up. The scroll/sheet preserve-and-restore logic has appropriate isAttached/hasClients guards and bounded retry counts, errors are surfaced via FlutterError.reportError, and the calendar DST fix is straightforwardly correct. No changes to data persistence, auth, or network layers. lib/features/bottom_scroll_sheet/hooks/use_preserved_scroll_offset.dart — the new _SheetPositionRestorer has no cancellation mechanism for concurrent restorers on rapid user taps, and the T == Parking type dispatch couples domain logic into generic restore code. Important Files Changed
Sequence Diagram%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
participant User
participant MapController
participant usePreservedSheetPosition
participant BottomSheetController
participant SheetPositionRestorer
User->>MapController: tap marker (activate)
MapController->>BottomSheetController: resetSafe()
MapController->>usePreservedSheetPosition: "activeMarker prev=null → next=item"
usePreservedSheetPosition->>BottomSheetController: "preservedPosition = {offset, sheetSize, tabIndex}"
usePreservedSheetPosition->>ScrollController: jumpTo(0)
User->>MapController: tap marker (deactivate)
MapController->>usePreservedSheetPosition: "activeMarker prev=item → next=null"
usePreservedSheetPosition->>BottomSheetController: clearPreservedPosition()
usePreservedSheetPosition->>BottomSheetController: "pendingTabIndex = position.tabIndex"
usePreservedSheetPosition->>SheetPositionRestorer: start() → schedulePostFrame
SheetPositionRestorer->>BottomSheetController: animateToSafe / jumpToSafe (sheet size)
SheetPositionRestorer->>ScrollController: jumpTo(savedOffset)
Note over SheetPositionRestorer: Retries up to 12× if sheet/scroll not ready yet
%%{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"}}}%%
sequenceDiagram
participant User
participant MapController
participant usePreservedSheetPosition
participant BottomSheetController
participant SheetPositionRestorer
User->>MapController: tap marker (activate)
MapController->>BottomSheetController: resetSafe()
MapController->>usePreservedSheetPosition: "activeMarker prev=null → next=item"
usePreservedSheetPosition->>BottomSheetController: "preservedPosition = {offset, sheetSize, tabIndex}"
usePreservedSheetPosition->>ScrollController: jumpTo(0)
User->>MapController: tap marker (deactivate)
MapController->>usePreservedSheetPosition: "activeMarker prev=item → next=null"
usePreservedSheetPosition->>BottomSheetController: clearPreservedPosition()
usePreservedSheetPosition->>BottomSheetController: "pendingTabIndex = position.tabIndex"
usePreservedSheetPosition->>SheetPositionRestorer: start() → schedulePostFrame
SheetPositionRestorer->>BottomSheetController: animateToSafe / jumpToSafe (sheet size)
SheetPositionRestorer->>ScrollController: jumpTo(savedOffset)
Note over SheetPositionRestorer: Retries up to 12× if sheet/scroll not ready yet
Reviews (3): Last reviewed commit: "refactor: streamline error reporting in ..." | Re-trigger Greptile |
…mSliver and enhance scroll restoration logic in use_preserved_scroll_offset
…y consolidating FlutterErrorDetails construction
hopefully for the better :P