Skip to content

feat(companion): Add DropdownMenu and Alert Dialog for Android#44

Open
tomerqodo wants to merge 16 commits intosentry_only-issues-20260113-augment-codex-sentry_base_featcompanion_add_dropdownmenu_and_alert_dialog_for_android_pr288from
sentry_only-issues-20260113-augment-codex-sentry_head_featcompanion_add_dropdownmenu_and_alert_dialog_for_android_pr288
Open

feat(companion): Add DropdownMenu and Alert Dialog for Android#44
tomerqodo wants to merge 16 commits intosentry_only-issues-20260113-augment-codex-sentry_base_featcompanion_add_dropdownmenu_and_alert_dialog_for_android_pr288from
sentry_only-issues-20260113-augment-codex-sentry_head_featcompanion_add_dropdownmenu_and_alert_dialog_for_android_pr288

Conversation

@tomerqodo
Copy link

Benchmark PR from qodo-benchmark#288

dhairyashiil and others added 16 commits January 2, 2026 12:45
Replace Alert.alert with react-native-reusables DropdownMenu component
for Android event type list items, providing a native-feeling menu
experience that matches iOS functionality.

Changes:
- Install react-native-reusables dropdown-menu component and dependencies
  (lucide-react-native, tailwindcss-animate, class-variance-authority,
  clsx, tailwind-merge)
- Create EventTypeListItem.android.tsx with DropdownMenu implementation
  - Single ellipsis button triggers dropdown menu
  - Menu includes: Preview, Copy link, Edit, Duplicate, Delete
  - Delete action marked as destructive variant
  - Proper safe area insets handling
- Add PortalHost to app/_layout.tsx for portal rendering support
- Create lib/utils.ts with cn() helper for className merging
- Update global.css with theme CSS variables (popover, border, accent,
  destructive, etc.) for dropdown menu styling
- Update tailwind.config.js with theme colors and tailwindcss-animate plugin
- Update metro.config.js with inlineRem: 16 for proper rem unit handling
- Remove Android Alert.alert fallback from event types index.tsx
- Fix lint issues in generated dropdown-menu.tsx (remove unnecessary fragments)

The Android experience now matches iOS with a single menu button that
opens a dropdown containing all event type actions, replacing the
previous Alert.alert dialog and separate action buttons.

Refs: https://reactnativereusables.com/docs/components/dropdown-menu
…y list items

- Add BookingListItem.android.tsx with DropdownMenu for booking actions
- Add BookingDetailScreen.android.tsx with DropdownMenu in header
- Add AvailabilityListItem.android.tsx with DropdownMenu for schedule actions

Actions include: Reschedule, Edit Location, Add Guests, View Recordings,
Meeting Session Details, Mark as No-Show, Report Booking, Cancel Event
for bookings; Set as Default, Duplicate, Delete for availability schedules.
…ent types

- Install AlertDialog and Alert components from react-native-reusables
- Create Android-specific event types screen (index.android.tsx)
- Replace native Alert.alert() with AlertDialog for delete confirmation
- Add inline validation errors (red border + error text) in create modal
- Implement Toast snackbar for success/error notifications (no layout shift)
- Auto-dismiss toast after 2.5 seconds
- Fix React Compiler compatibility by removing animated refs

This provides a more consistent and polished UI experience on Android,
matching the design system used in other parts of the app.
…ncel

- Add index.android.tsx for availability with AlertDialog for delete confirmation
- Add index.android.tsx for bookings with AlertDialog for cancel (with reason input)
- Both screens include Toast snackbar for success/error notifications
- Follows the same pattern as event types Android implementation
- Replace native Alert.alert context menus with DropdownMenu component
  for event types, bookings, and availability lists
- Replace FullScreenModal with AlertDialog for create/delete/cancel flows
- Add toast notifications for success/error feedback on Android
- Set consistent 380px max-width for all AlertDialogs
- Fix layout headers showing "index" text on event-types and availability
- Create Android-specific More screen with AlertDialog logout confirmation

Uses react-native-reusables components for polished Android UI
- Logout: reverted to native Alert.alert() (simple yes/no)
- Event Types Delete: reverted to native Alert.alert() (simple yes/no)
- Availability Delete: reverted to native Alert.alert() (simple yes/no)

Keep AlertDialog only where user input is needed:
- Event Types Create (has TextInput for title)
- Availability Create (has TextInput for name)
- Bookings Cancel (has TextInput for cancellation reason)
The main index.tsx files already handle Android via Platform.OS checks.
Android-specific behavior for actions is in the list item components:
- EventTypeListItem.android.tsx
- BookingListItem.android.tsx
- AvailabilityListItem.android.tsx

This consolidates the code and reduces duplication.
Comment on lines +88 to +92
label: "Reschedule Booking",
icon: "calendar-outline",
onPress: () => onReschedule?.(booking),
variant: "default" as const,
visible: isUpcoming && !isCancelled && !isPending && !!onReschedule,
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: Action visibility logic in BookingListItem.android.tsx is missing several checks (!isRejected, allowReschedulingPastBookings, !disableCancelling), causing actions to show incorrectly for certain booking states.
Severity: MEDIUM

Suggested Fix

Update the conditional logic in BookingListItem.android.tsx to include all the checks present in the useBookingActions.ts hook. This will ensure that the visibility of booking actions is consistent across the application and respects all configuration rules.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent.
Verify if this is a real issue. If it is, propose a fix; if not, explain why it's not
valid.

Location: companion/components/booking-list-item/BookingListItem.android.tsx#L88-L92

Potential issue: In `BookingListItem.android.tsx`, the logic for showing booking actions
is inconsistent with the centralized logic in `useBookingActions.ts`. Specifically, the
component is missing checks for `!isRejected`, `allowReschedulingPastBookings`, and
`!disableCancelling`. This can lead to actions like 'Cancel', 'Reschedule', 'Edit
Location', or 'Add Guests' being incorrectly displayed for bookings that are rejected,
past (when rescheduling is disabled), or have cancellation disabled at the event-type
level.

Did we get this right? 👍 / 👎 to inform future reviews.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

Comments