feat(companion): add configurable landing page#3
Merged
Conversation
- Add useUserPreferences hook for persistent storage of landing page preference - Add LandingPagePicker component for both iOS and Android/web platforms - Update tabs index to redirect based on user preference - Update bookings index to accept initial filter from URL params - Add App Settings section in More screen with landing page selector - Clear user preferences on logout for fresh state Co-Authored-By: dhairyashil@cal.com <dhairyashil10101010@gmail.com>
Contributor
🤖 Devin AI EngineerI'll be helping with this pull request! Here's what you should know: ✅ I will automatically:
Note: I can only respond to comments from users who have write access to this repository. ⚙️ Control Options:
|
volnei
approved these changes
Feb 15, 2026
devin-ai-integration Bot
pushed a commit
that referenced
this pull request
May 23, 2026
- Reject /notify in Telegram groups with DM hint (#3) - Validate payload fields (title, timeZone, start, end, hosts, attendees) in parseDeliverRequest (#4) - Wrap deliverNotifications in try/catch, return 422 on formatter crash (#4) - Add logging across route, service, and delivery modules (#5) - Add /notify to Slack and Telegram help cards (#7) - Add error field to DeliverResult for backend retry/unsubscribe decisions (#9) - Change confirmation message from 'here' to 'via DM' (#10) - Validate timeZone with Intl.DateTimeFormat before processing (#11) - Add fallback badge for unknown notificationType (#12) - Reject /notify in groups with 'check DMs' message (#13)
devin-ai-integration Bot
pushed a commit
that referenced
this pull request
May 29, 2026
…registration races Addresses parallel-review findings: - #1/#2: add a monotonic auth generation (epoch) bumped on clearAuth and every new login. Refreshes discard their result if the epoch changed mid-flight, and 401 retries abort instead of replaying a stale request under a new identity. - #3: loginFromWebSession now clears the query cache before flipping auth state so a previous user's in-memory cache can't be re-persisted under the new owner. - #4: a registration that completes after logout/switch is not persisted as the active record; it is parked for retry instead of leaving a live subscription. - #5: compare the full {token,userId,region,deviceId} tuple and keep unresolved prior registrations in a retry queue instead of clobbering the single slot.
dhairyashiil
added a commit
that referenced
this pull request
Jun 2, 2026
…es (epoch guard + auth-transition lock) (#97) * fix(mobile): durable push registration, single-flight token refresh, identity-scoped query cache * fix(mobile): address review feedback on push/auth/cache hardening - write cal_auth_user_id in loginFromWebSession so web-session users keep persisted cache - treat backend 404 on unregister as already-gone (region-aware) and clear stale record - resolve a differing previous push registration before overwriting it - add safe, PII-free logs (region, userId, deviceId, token hash) to push cleanup paths * fix(mobile): guard auth session with a generation/epoch; harden push registration races Addresses parallel-review findings: - #1/#2: add a monotonic auth generation (epoch) bumped on clearAuth and every new login. Refreshes discard their result if the epoch changed mid-flight, and 401 retries abort instead of replaying a stale request under a new identity. - #3: loginFromWebSession now clears the query cache before flipping auth state so a previous user's in-memory cache can't be re-persisted under the new owner. - #4: a registration that completes after logout/switch is not persisted as the active record; it is parked for retry instead of leaving a live subscription. - #5: compare the full {token,userId,region,deviceId} tuple and keep unresolved prior registrations in a retry queue instead of clobbering the single slot. * fix(mobile): close epoch-guard gaps in refresh/boot/logout/push paths * fix(mobile): close residual epoch/partial-write and push-404 ownership gaps * fix(mobile): close rollback/web-login/push-cleanup gaps from round 4 * fix(mobile): epoch-guard setupAfterLogin/loginWithOAuth, tighten rollback marker + late-registration cleanup * fix(mobile): close remaining setupAfterLogin/loginWithOAuth/web-session epoch windows * fix(mobile): serialize auth/storage marker mutations via auth-transition lock; pre-POST generation check for push registration * fix(mobile): recheck auth generation after setupAfterLogin before installing refresh fn * fix(mobile): coalesce concurrent logouts, re-entrancy guard for auth lock, region-safe cache envelope, pending-queue cap
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
feat(companion): add configurable landing page
Summary
Ports calcom/cal.com#27267 to the new companion repo. This PR adds a user-configurable landing page feature, allowing users to choose which screen opens on app launch (Event Types, Bookings, or Bookings Unconfirmed).
Key changes:
useUserPreferenceshook persisting landing page preference viageneralStorageLandingPagePickercomponent — iOS uses nativeActionSheetIOS, Android/web uses aFullScreenModalapp/(tabs)/index.tsx) redirects based on stored preferenceindex.tsx,index.ios.tsx) accept?filter=URL param to support "Bookings (Unconfirmed)" landingAuthContextBookingListScreen: replaces<Activity>wrapper with standard conditional renderingReview & Testing Checklist for Human
<Activity>→ conditional rendering inBookingListScreen.tsx: The original code used<Activity mode="visible"|"hidden">(keeps components mounted but hidden). This PR replaces them with{condition && ...}(unmounts when hidden). Verify this doesn't cause scroll position loss, state resets, or UI flicker when switching between empty/list/search states./(tabs)/works correctly and persists across app restarts.LandingPagePickerrenders correctly on both platforms — the iOS.ios.tsxvariant usesActionSheetIOSwhile the default uses a custom modal.Suggested test plan:
Notes
biome.jsondifference (root: truevsroot: false, extranoUnknownAtRulesrule) is pre-existing and not part of this PRLink to Devin run: https://app.devin.ai/sessions/3054c020cba246bf8dc67780f7d90f88
Requested by: @dhairyashiil