[CORRUPTED] Synthetic Benchmark PR #26931 - feat(companion): add optimistic updates to availability edit screens#656
Open
tomerqodo wants to merge 9 commits intobase_pr_26931_20260121_8861from
Conversation
- Refactor useUpdateSchedule hook with optimistic updates - Update EditAvailabilityNameScreen to use mutation hook instead of direct API call - Update EditAvailabilityNameScreen.ios.tsx with same pattern - Cache is updated immediately on save, then synced with server - On error, cache is rolled back to previous state
…is empty - Update list cache in onMutate even when detail cache doesn't exist - Remove onSettled invalidation that was causing issues with staleTime: Infinity - Add fallback invalidation in onSuccess when list cache doesn't exist
…ates The previous optimistic updates implementation in EditAvailabilityNameScreen correctly updated the React Query cache, but AvailabilityDetailScreen was still using direct CalComAPIService.getScheduleById() calls with local useState, completely bypassing the cache. The disconnect: - EditAvailabilityNameScreen → useUpdateSchedule → Updates React Query Cache ✓ - AvailabilityDetailScreen → CalComAPIService.getScheduleById → Local state ✗ This meant when a user saved changes to a schedule's name/timezone, the cache was updated but the detail screen (and subsequently the list screen) never saw those updates because they weren't reading from the cache. Changes: - Refactor AvailabilityDetailScreen.tsx to use useScheduleById hook - Refactor AvailabilityDetailScreen.ios.tsx to use useScheduleById hook - Replace direct API calls with React Query for cache synchronization - Add RefreshControl for pull-to-refresh support - Use mutation hooks (useSetScheduleAsDefault, useDeleteSchedule) for actions - Derive availability/overrides data using useMemo from query result Now when EditAvailabilityNameScreen updates the cache, AvailabilityDetailScreen automatically reflects those changes because both read from the same cache.
…ion hook - Replace direct CalComAPIService.updateSchedule calls with useUpdateSchedule hook - Remove local isSaving state, use isPending from mutation hook instead - Cache is now updated automatically via the mutation hook's optimistic updates - Consistent pattern with EditAvailabilityNameScreen refactoring
- Replace direct CalComAPIService.updateSchedule calls with useUpdateSchedule hook - Remove local isSaving state, use isPending from mutation hook instead - Cache is now updated automatically via the mutation hook's optimistic updates - Consistent pattern with EditAvailabilityNameScreen and EditAvailabilityOverrideScreen
…eduleById hook The working hours page (page 2 in the flow) was showing stale data because it used direct CalComAPIService.getScheduleById() calls with local useState, bypassing the React Query cache. The disconnect: - EditAvailabilityDayScreen → useUpdateSchedule → Updates React Query Cache ✓ - edit-availability-hours route → CalComAPIService.getScheduleById → Local state ✗ This meant when a user saved changes to a day's availability, the cache was updated but the working hours page never saw those updates because it wasn't reading from the cache. Changes: - Refactor edit-availability-hours.tsx to use useScheduleById hook - Refactor edit-availability-hours.ios.tsx to use useScheduleById hook - Replace direct API calls with React Query for cache synchronization - Now all 3 pages in the flow read from the same cache
Previously, when there were no date overrides, the Date Overrides section was just a plain View without any press handler, making it impossible for users to navigate to the edit override page to add new overrides. This follows the same pattern as other sections (Weekly Schedule, Timezone) which are always clickable regardless of their content state. Changes: - Wrap the 'No Overrides' section in AppPressable with navigation handler - Add chevron-forward icon to indicate it's tappable - Apply fix to both AvailabilityDetailScreen.tsx and .ios.tsx
- Change useMemo to useEffect for onActionsReady callback (side effect) - Move error handling (showErrorAlert, router.back) to useEffect - Keep early return for error state after useEffect hooks Fixes Cubic AI review feedback (confidence 9/10)
|
Hey there and thank you for opening this pull request! 👋🏼 We require pull request titles to follow the Conventional Commits specification and it looks like your proposed title needs to be adjusted. Details: |
|
This PR has been marked as stale due to inactivity. If you're still working on it or need any help, please let us know or update the PR to keep it active. |
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.
Benchmark PR calcom#26931
Type: Corrupted (contains bugs)
Original PR Title: feat(companion): add optimistic updates to availability edit screens
Original PR Description:
Screen.Recording.2026-01-16.at.6.56.47.PM.mov
Fixes calcom#26908
Fixes CAL-7077
What does this PR do?
Implements optimistic updates for availability edit screens in the companion app (iOS, Android, browser extension). This is part of a larger refactoring effort to add auto-refresh/reload after save actions.
Phase 1 - EditAvailabilityNameScreen:
useUpdateSchedulehook with full optimistic update support (onMutate, onSuccess, onError)EditAvailabilityNameScreen.tsxandEditAvailabilityNameScreen.ios.tsxto use the mutation hook instead of direct API callsPhase 2 - EditAvailabilityOverrideScreen:
EditAvailabilityOverrideScreen.tsxandEditAvailabilityOverrideScreen.ios.tsxto useuseUpdateSchedulemutation hookCalComAPIService.updateSchedulecalls with the mutation hookisSavingstate in favor ofisPendingfrom the mutation hookPhase 3 - EditAvailabilityDayScreen:
EditAvailabilityDayScreen.tsxandEditAvailabilityDayScreen.ios.tsxto useuseUpdateSchedulemutation hookCalComAPIService.updateSchedulecalls with the mutation hookisSavingstate in favor ofisPendingfrom the mutation hookSupporting Changes (by @dhairyashiil):
AvailabilityDetailScreen.tsxandAvailabilityDetailScreen.ios.tsxto useuseScheduleByIdhook instead of direct API callsRefreshControlfor pull-to-refresh supportuseSetScheduleAsDefaultanduseDeleteSchedulehooksUpdates since last revision
Fixed stale data issue on the Working Hours page (page 2 in the edit flow):
edit-availability-hours.tsxandedit-availability-hours.ios.tsxroute files to useuseScheduleByIdhookCalComAPIService.getScheduleById()calls with localuseState, bypassing the React Query cacheFixed Date Overrides section not clickable when empty:
AppPressablewith navigation handler and chevron iconMandatory Tasks (DO NOT REMOVE)
How should this be tested?
Phase 1 - Edit Name/Timezone:
Phase 2 - Edit Overrides:
Phase 3 - Edit Day Availability:
Date Overrides Empty State:
Error case: If network fails, UI should roll back to previous state and show error alert
Checklist
Human Review Checklist
AvailabilityDetailScreenproperly reads from React Query cache viauseScheduleById(critical for cache updates to propagate)edit-availability-hoursroute files properly read from React Query cache viauseScheduleByIduseUpdateSchedulehandlesavailabilityfield correctly via spread operatoronErrorrestores both detail and list caches correctlyLink to Devin run: https://app.devin.ai/sessions/0e35f5cdab8943dabb66fc182e4241fe
Requested by: Dhairyashil Shinde (@dhairyashiil)
Original PR URL: calcom#26931