fix: improve modal behavior on web and Android scrolling
- Restructure ModalBase to use absolute-positioned backdrop behind card content, fixing modal stacking issues on web (React Native Web portals) - Hide EventOverlay when DeleteEventModal is open to prevent z-index conflicts on web - Add nestedScrollEnabled to CardBase ScrollView for Android - Use TouchableOpacity with delayPressIn in EventCard for scroll-friendly touch handling - Keep eventToDelete state stable during modal fade-out to prevent content flash between recurring/single variants - Fix German umlauts in DeleteEventModal
This commit is contained in:
12
CLAUDE.md
12
CLAUDE.md
@@ -200,6 +200,11 @@ Reusable base components for cards and modals with consistent styling.
|
||||
|
||||
ModalBase provides: transparent Modal + backdrop (click-outside-to-close) + Android back button support.
|
||||
|
||||
**ModalBase Architecture Note:** Uses absolute-positioned backdrop behind the card content (not nested Pressables). This approach:
|
||||
- Fixes modal stacking issues on web (React Native Web renders modals as DOM portals)
|
||||
- Allows proper scrolling on Android (no touch event conflicts)
|
||||
- Card naturally blocks touches from reaching backdrop due to z-order
|
||||
|
||||
**Component Hierarchy:**
|
||||
```
|
||||
CardBase
|
||||
@@ -502,6 +507,7 @@ NODE_ENV=development # development = pretty logs, production = JSON
|
||||
- Supports events from adjacent months visible in grid
|
||||
- Uses `useFocusEffect` for automatic reload on tab focus
|
||||
- DeleteEventModal integration for recurring event deletion with three modes
|
||||
- EventOverlay hides when DeleteEventModal is open (fixes modal stacking on web)
|
||||
- Chat screen fully functional with FlashList, message sending, and event confirm/reject
|
||||
- **Multiple event proposals**: AI can propose multiple events in one response
|
||||
- Arrow navigation between proposals with "Event X von Y" counter
|
||||
@@ -515,10 +521,10 @@ NODE_ENV=development # development = pretty logs, production = JSON
|
||||
- keyboardDismissMode="interactive" and keyboardShouldPersistTaps="handled"
|
||||
- `EventService`: getAll(), getById(), getByDateRange(), create(), update(), delete(mode, occurrenceDate) - fully implemented with recurring delete modes
|
||||
- `ChatService`: sendMessage(), confirmEvent(deleteMode, occurrenceDate), rejectEvent(), getConversations(), getConversation() - fully implemented with cursor pagination and recurring delete support
|
||||
- `CardBase`: Reusable card component with header (title/subtitle), content area, and optional footer button - configurable padding, border, text size via props
|
||||
- `ModalBase`: Reusable modal wrapper with backdrop, uses CardBase internally - provides click-outside-to-close and Android back button support
|
||||
- `CardBase`: Reusable card component with header (title/subtitle), content area, and optional footer button - configurable padding, border, text size via props, ScrollView uses `nestedScrollEnabled` for Android
|
||||
- `ModalBase`: Reusable modal wrapper with backdrop (absolute-positioned behind card), uses CardBase internally - provides click-outside-to-close, Android back button support, and proper scrolling on Android
|
||||
- `EventCardBase`: Event card with date/time/recurring icons - uses CardBase for structure
|
||||
- `EventCard`: Uses EventCardBase + edit/delete buttons for calendar display
|
||||
- `EventCard`: Uses EventCardBase + edit/delete buttons (TouchableOpacity with delayPressIn for scroll-friendly touch handling)
|
||||
- `ProposedEventCard`: Uses EventCardBase + confirm/reject buttons for chat proposals (supports create/update/delete actions with deleteMode display)
|
||||
- `DeleteEventModal`: Delete confirmation modal using ModalBase - shows three options for recurring events (single/future/all), simple confirm for non-recurring
|
||||
- `EventOverlay` (in calendar.tsx): Day events overlay using ModalBase - shows EventCards for selected day
|
||||
|
||||
Reference in New Issue
Block a user