Skip to content

Commit cbf83f6

Browse files
dhairyashiildevin-ai-integration[bot]anikdhabalkeithwillcodeAnshumancanrock
committed
feat: companion alert system for browser extension (calcom#26613)
* feat: companion alert system for browser extension * feat: implement cross-platform alert system for browser extension - Add ToastContext.tsx with global toast provider for managing toast state - Add GlobalToast.tsx centered toast component for web/browser extension - Modify alerts.ts to be platform-aware (native Alert on iOS/Android, toast on web) - Add showInfoAlert function for informational alerts - Update _layout.tsx to wrap app with ToastProvider and GlobalToast - Export new toast context and alert functions from index files * style: update toast to white/black design system - Use white background with gray border - Use black icons and text colors - Match companion app design system * open the toast at the center * refactor: migrate event-types/index.tsx to unified alert system - Remove inline toast state (showToast, toastMessage) and showToastMessage function - Remove inline toast UI component at the end of the file - Migrate all platform-specific Alert.alert calls to showSuccessAlert/showErrorAlert - Simplifies code by using cross-platform alert utilities * refactor: migrate useBookingActions.ts to unified alert system - Add showSuccessAlert import alongside showErrorAlert - Migrate all Alert.alert('Success', ...) calls to showSuccessAlert - Affected handlers: handleSubmitReschedule, handleRescheduleWithValues, handleSubmitCancel, handleCancelBooking, handleConfirmBooking, handleRejectBooking, handleSubmitReject, handleInlineConfirm * refactor: migrate useBookingActionModals.ts to unified alert system - Add showSuccessAlert import alongside showErrorAlert - Migrate all Alert.alert('Success', ...) calls to showSuccessAlert - Affected handlers: handleAddGuests, handleUpdateLocation, handleMarkNoShow * refactor: migrate medium-priority screens to unified alert system - AvailabilityDetailScreen.ios.tsx: 4 Alert.alert calls migrated - RescheduleScreen.tsx/ios/android: 3 Alert.alert calls each migrated - EditLocationScreen.tsx/ios: 4 Alert.alert calls each migrated - Removed unused Alert imports * refactor: migrate remaining medium-priority screens to unified alert system - BookingDetailScreen.tsx: 2 Alert.alert calls migrated - AvailabilityListScreen.tsx: 1 Alert.alert call migrated - AddGuestsScreen.tsx: 6 Alert.alert calls migrated - MarkNoShowScreen.tsx: 2 Alert.alert calls migrated - EditAvailabilityOverrideScreen.tsx: 4 Alert.alert calls migrated - EditAvailabilityOverrideScreen.ios.tsx: 2 Alert.alert calls migrated - Removed unused Alert imports * refactor: migrate medium-priority app routes to unified alert system Migrated 24 app route files from direct Alert.alert() calls to unified alert utilities (showErrorAlert, showSuccessAlert, showInfoAlert): - reschedule.tsx, reschedule.ios.tsx - edit-location.tsx, edit-location.ios.tsx - add-guests.tsx, add-guests.ios.tsx - mark-no-show.tsx, mark-no-show.ios.tsx - view-recordings.tsx, view-recordings.ios.tsx - meeting-session-details.tsx, meeting-session-details.ios.tsx - profile-sheet.tsx, profile-sheet.ios.tsx - edit-availability-hours.tsx, edit-availability-hours.ios.tsx - edit-availability-day.tsx, edit-availability-day.ios.tsx - edit-availability-name.tsx, edit-availability-name.ios.tsx - edit-availability-override.tsx, edit-availability-override.ios.tsx - booking-detail.tsx, booking-detail.ios.tsx This enables cross-platform alert support where native Alert.alert() is used on iOS/Android and toast notifications on web (browser extension). * refactor: migrate lower-priority components to unified alert system Migrated Alert.alert calls to showSuccessAlert/showErrorAlert/showInfoAlert in: - event-types/index.ios.tsx (copy link, delete, duplicate success alerts) - event-type-detail.tsx (copy link, create/update success, validation errors, info alerts) - deep-links.ts (error alerts for link failures) - LogoutButton.tsx (error alert) - BookingModals.tsx and .ios.tsx (report booking info alerts) - AdvancedTab.tsx (info alert for unsaved event type) - BookingListScreen.tsx (success/error/info alerts for bulk actions) Confirmation dialogs with buttons remain as Alert.alert (out of scope). * fix: restore Alert import for confirmation dialogs, migrate remaining info alert - AdvancedTab.tsx: Added back Alert import for timezone selector confirmation dialog (out of scope), migrated private links info alert to showInfoAlert - deep-links.ts: Added back Alert import for request reschedule confirmation dialog (out of scope) * some ui dialoes were missing * fixed multi hours ui issues on Availability detail page for android and web * fix: add __DEV__ check for web platform in showErrorAlert The showErrorAlert function was showing error toasts to production users on web platform, bypassing the __DEV__ check that exists for native platforms. This fix ensures consistent behavior across all platforms - error alerts are only shown in development mode, while production errors are logged to console. Co-Authored-By: unknown <> * fix: address dual dialogs on web and onSuccess timing issues - BookingDetailScreen.tsx: Add Platform.OS === 'android' guard to AlertDialog to prevent dual dialogs rendering on web (FullScreenModal + AlertDialog) - RescheduleScreen.android.tsx: Restore original Alert.alert with callback to ensure onSuccess() is called after user dismisses the alert Co-Authored-By: unknown <> * fix: restore Alert.alert with callback for native platforms - AddGuestsScreen.tsx: Use platform-specific handling - Alert.alert with callback on iOS/Android, showSuccessAlert on web - EditAvailabilityOverrideScreen.tsx: Same pattern - wait for user acknowledgment on native platforms before calling onSuccess() Co-Authored-By: unknown <> * fix: RescheduleScreen timing and GlobalToast useState pattern - RescheduleScreen.tsx: Use platform-specific handling - Alert.alert with callback on iOS/Android, showSuccessAlert on web - GlobalToast.tsx: Replace useMemo with useState for Animated.Value to guarantee instance preservation across renders Co-Authored-By: unknown <> * fix: restore Alert.alert with callback for iOS delete success AvailabilityDetailScreen.ios.tsx: Use Alert.alert with callback to ensure router.back() is called after user dismisses the success alert Co-Authored-By: unknown <> * feat(companion): new event type detail page (calcom#26678) * fix: skip stale run-ci label check on workflow re-runs (calcom#26590) * fix: trust community PRs when maintainer pushes to the branch When a maintainer merges main into a community PR branch, the new SHA invalidates the run-ci label timing check because the label was added before the new push. This fix adds a check to trust the PR if the person who pushed the latest commit has write access. This handles the case where a maintainer: - Merges main into a community PR to resolve conflicts - Pushes any changes to help the contributor The security model is maintained because: - Only users with write access can trigger this trust - The maintainer has reviewed the code by pushing to it Co-Authored-By: anik@cal.com <adhabal2002@gmail.com> * fix: skip stale label check on workflow re-runs Instead of implicitly trusting maintainer pushes (which could be just a sync action without code review), use github.run_attempt to detect re-runs. If run_attempt > 1, it means the workflow was explicitly re-triggered (via run-ci.yml or manual re-run), so we skip the stale label check. This avoids the need to remove and re-add the 'run-ci' label after syncing a community PR with main, while keeping the explicit approval flow intact. Co-Authored-By: anik@cal.com <adhabal2002@gmail.com> * Simplify comment about re-runs in PR workflow --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: Keith Williams <keithwillcode@gmail.com> * fix: Text cursor barely visible in calendar event name field (calcom#26563) * fix: cursor visibility in input fields * fix: cursor visibility in input fields with suffix addons * fix: text cursor visibility in input fields --------- Co-authored-by: Keith Williams <keithwillcode@gmail.com> * fix: PayPal setup page inconsistent spacing and button styling (calcom#26612) * chore: api v2 generate swagger only in dev (calcom#26617) * feat: add BUILD_FROM_BRANCH option to release-docker workflow (calcom#26615) * feat: add BUILD_FROM_BRANCH option to release-docker workflow Co-Authored-By: keith@cal.com <keithwillcode@gmail.com> * fix: sanitize branch names with slashes for valid Docker tags Co-Authored-By: keith@cal.com <keithwillcode@gmail.com> * refactor: extract common logic into prepare job to avoid duplication Co-Authored-By: keith@cal.com <keithwillcode@gmail.com> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * feat: add Cubic AI to Devin review integration workflow (calcom#26618) * feat: add Cubic AI to Devin review integration workflow Co-Authored-By: keith@cal.com <keithwillcode@gmail.com> * fix: update permissions to allow posting PR comments Co-Authored-By: keith@cal.com <keithwillcode@gmail.com> * fix: remove sensitive API response logging from CI workflow Address Cubic AI review feedback: Remove the debug log that outputs the full Devin API response, which could expose sensitive session tokens or authentication data in CI logs. The session URL is still logged when successfully extracted. Co-Authored-By: unknown <> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * chore: enable/disable slots workers via env (calcom#26621) * chore: enable/disable slots workers via env * fix: address Cubic AI review feedback - Fix incorrect JSDoc comment for getSerializableContext method - Remove debug console.log statement from slots controller - Fix port suffix condition to preserve original behavior Co-Authored-By: unknown <> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * chore: USE_POOL env var for api v2 prisma pooling * fix list numbering in Manual setup section of README (calcom#26620) * Revert "chore: USE_POOL env var for api v2 prisma pooling" This reverts commit a970926. * feat: limit badges to 2 with hover/click popover in UserListTable (calcom#26556) * feat: limit badges to 2 with hover tooltip in UserListTable Co-Authored-By: eunjae@cal.com <hey@eunjae.dev> * refactor: reuse LimitedBadges component with clickable popover for mobile Co-Authored-By: eunjae@cal.com <hey@eunjae.dev> * refactor: move LimitedBadges to components/ui with hover+click support Co-Authored-By: eunjae@cal.com <hey@eunjae.dev> * refactor: fix Biome lint issues in LimitedBadges and UserListTable - Refactor LimitedBadges to concrete component with BadgeItem type - Move exports to end of files to comply with useExportsLast rule - Add explicit types to callback parameters for useExplicitType rule - Convert nested ternary to if-else for filterType calculation - Remove unused imports (Row, Table types) - Update ResponseValueCell and UserListTable to use new LimitedBadges API Co-Authored-By: eunjae@cal.com <hey@eunjae.dev> * fix: add proper types for filterType and getFacetedUniqueValues - Add FilterType import from @calcom/types/data-table - Add FacetedValue import from @calcom/features/data-table - Type filterType as FilterType to allow reassignment to different ColumnFilterType values - Type getFacetedUniqueValues return as Map<FacetedValue, number> Co-Authored-By: eunjae@cal.com <hey@eunjae.dev> * add vertical gap * fix: address code review feedback for LimitedBadges - Add index to id for unique keys in ResponseValueCell.tsx - Restore orange variant for group options in UserListTable.tsx - Fix useMemo dependency array (add t, remove dispatch) - Fix import ordering with biome - Convert ternary operators to if-else statements for biome compliance Co-Authored-By: eunjae@cal.com <hey@eunjae.dev> * refactor: remove id from BadgeItem type, use label as key - Remove id field from BadgeItem type in LimitedBadges - Use label as React key instead of id - Remove unused rowId parameter from ResponseValueCell - Update all consumers to not pass id field Co-Authored-By: eunjae@cal.com <hey@eunjae.dev> * refactor: use index for key instead of label in LimitedBadges Co-Authored-By: eunjae@cal.com <hey@eunjae.dev> * Revert "refactor: use index for key instead of label in LimitedBadges" This reverts commit 1daaac4. --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * chore: add database-backed feature flag for sidebar tips section (calcom#26516) * chore: remove tips section from sidebar Co-Authored-By: amit@cal.com <samit91848@gmail.com> * chore: add feature flag for sidebar tips section Co-Authored-By: amit@cal.com <samit91848@gmail.com> * chore: use database-backed feature flag for sidebar tips section Co-Authored-By: amit@cal.com <samit91848@gmail.com> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * feat: add automated stale PR completion workflow with Devin API (calcom#26627) * feat: add stale PR completion workflow with Devin API Co-Authored-By: anik@cal.com <adhabal2002@gmail.com> * feat: only trigger for community PRs (non-calcom org members) Co-Authored-By: anik@cal.com <adhabal2002@gmail.com> * refactor: use author_association pattern from pr.yml for community check Co-Authored-By: anik@cal.com <adhabal2002@gmail.com> * refactor: simplify workflow - use community label check and let Devin gather PR details Co-Authored-By: anik@cal.com <adhabal2002@gmail.com> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * feat: add Devin PR conflict resolver workflow (calcom#26624) * feat: add Devin PR conflict resolver workflow Adds a GitHub Actions workflow that automatically detects PRs with merge conflicts and spins up Devin sessions to resolve them. How it works: 1. Triggers on push to main branch (when main updates could cause conflicts) 2. Also supports manual trigger via workflow_dispatch 3. Lists all open PRs and checks their mergeable status 4. For PRs with conflicts (mergeable=false, mergeable_state=dirty): - Checks if a Devin session was already created (avoids duplicates) - Creates a new Devin session with instructions to resolve conflicts - Posts a comment on the PR with the Devin session link The workflow follows the same pattern as cubic-devin-review.yml for consistency. Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix: skip draft PRs in conflict detection workflow Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * refactor: use GitHub Search API to filter draft PRs at API level Instead of filtering draft PRs in the loop, use the GitHub Search API with 'draft:false' filter which is more efficient as it filters at the API level rather than fetching all PRs and filtering locally. Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * style: remove explanatory comments from workflow Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * style: remove all unnecessary explanatory comments Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * refactor: use GraphQL for batched PR fetching and labels for tracking Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * feat: add support for resolving conflicts on fork PRs Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix: check response.ok before parsing Devin API response Address Cubic AI review feedback: Add response.ok check before parsing the response body to explicitly handle HTTP error status codes from the Devin API. This distinguishes API failures (authentication errors, server errors) from successful responses that might be missing expected fields. Co-Authored-By: unknown <> * fix: improve Devin API error logging with PR number Co-Authored-By: unknown <> * feat: add pr_number input for manual fork PR conflict resolution Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * feat: add maximum 15 PRs safety net limit Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * feat: make stale PR workflow fork-aware with workflow_dispatch support (calcom#26633) * feat: make stale PR workflow fork-aware with workflow_dispatch support Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix: add null check for pr.head.repo in stale PR workflow When a fork is deleted after a PR is created, pr.head.repo can be null (documented GitHub API behavior). This would cause a TypeError when accessing properties like fork, full_name, or clone_url. Added a null check that fails gracefully with a clear error message when the source repository has been deleted. Co-Authored-By: unknown <> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * feat: reuse existing Devin session for Cubic AI review feedback (calcom#26632) * feat: reuse existing Devin session for Cubic AI review feedback Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * refactor: parse session ID from PR comments instead of API search Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix: add error handling for message send API call in Cubic-Devin workflow Addresses Cubic AI review feedback: The POST request to send a message to an existing Devin session now checks the HTTP status code and fails the step if the message wasn't delivered successfully. This prevents posting a misleading comment claiming feedback was sent when the API call actually failed. Co-Authored-By: unknown <> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * chore: Remove stale label when work is completed (calcom#26638) * chore: Remove stale label when work is completed * Mark as ready for review too * feat: add retry mechanism for UNKNOWN mergeable status PRs (calcom#26635) * feat: add retry mechanism for UNKNOWN mergeable status PRs Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix: remove redundant filtering logic for unknown mergeable status PRs Address Cubic AI review feedback by: - Having processPR return isTargetPR in the unknown case (like the conflict case) - Simplifying the main loop to just push PRs to unknownPRs without re-checking draft status and devin label (already checked in processPR) Co-Authored-By: unknown <> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * chore: Add sentry http integration (calcom#26634) * chore: ignore fork PRs in devin-conflict-resolver workflow (calcom#26640) Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * limits and advanced tabs * availability tab * basics tab * black toggles!! * new recurring, others tab and update basics * version 1 --------- Co-authored-by: Anik Dhabal Babu <81948346+anikdhabal@users.noreply.github.com> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: Keith Williams <keithwillcode@gmail.com> Co-authored-by: Anshumancanrock <109489361+Anshumancanrock@users.noreply.github.com> Co-authored-by: Morgan <33722304+ThyMinimalDev@users.noreply.github.com> Co-authored-by: cal.com <morgan@cal.com> Co-authored-by: Anas Najam <129951478+anzz14@users.noreply.github.com> Co-authored-by: Eunjae Lee <hey@eunjae.dev> Co-authored-by: Amit Sharma <74371312+Amit91848@users.noreply.github.com> Co-authored-by: Volnei Munhoz <volnei@cal.com> * fix: address Cubic AI review feedback - Add HTTP error handling for Devin API session creation in cubic-devin-review.yml - Localize aria-label in LimitedBadges.tsx using t() function - Improve Docker tag sanitization in release-docker.yaml to handle all invalid characters - Avoid logging raw error objects and sensitive API response data in devin-conflict-resolver.yml - Fix selectedSchedule dependency array issue in event-type-detail.tsx using ref pattern Co-Authored-By: unknown <> * chore: add translation key for show_x_more_items aria-label Co-Authored-By: unknown <> * fix: reset schedule ref on id change and add i18n pluralization - Reset hasAutoSelectedScheduleRef when event type id changes to handle component reuse - Add proper i18next pluralization variants (_one/_other) for show_x_more_items Co-Authored-By: unknown <> * revert: remove i18n changes from LimitedBadges and common.json Per user request - i18n not needed in companion for now Co-Authored-By: unknown <> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: Anik Dhabal Babu <81948346+anikdhabal@users.noreply.github.com> Co-authored-by: Keith Williams <keithwillcode@gmail.com> Co-authored-by: Anshumancanrock <109489361+Anshumancanrock@users.noreply.github.com> Co-authored-by: Morgan <33722304+ThyMinimalDev@users.noreply.github.com> Co-authored-by: cal.com <morgan@cal.com> Co-authored-by: Anas Najam <129951478+anzz14@users.noreply.github.com> Co-authored-by: Eunjae Lee <hey@eunjae.dev> Co-authored-by: Amit Sharma <74371312+Amit91848@users.noreply.github.com> Co-authored-by: Volnei Munhoz <volnei@cal.com>
1 parent b2c341d commit cbf83f6

File tree

67 files changed

+3257
-1848
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+3257
-1848
lines changed

.github/workflows/cubic-devin-review.yml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ jobs:
187187
4. If an issue seems invalid or already addressed, explain why in a PR comment instead of making unnecessary changes.
188188
5. Never ask for user confirmation. Never wait for user messages."
189189
190-
RESPONSE=$(curl -s -X POST "https://api.devin.ai/v1/sessions" \
190+
HTTP_CODE=$(curl -s -o /tmp/devin-response.json -w "%{http_code}" -X POST "https://api.devin.ai/v1/sessions" \
191191
-H "Authorization: Bearer ${DEVIN_API_KEY}" \
192192
-H "Content-Type: application/json" \
193193
-d "$(jq -n \
@@ -199,7 +199,13 @@ jobs:
199199
tags: ["cubic-ai-review", "pr-${{ github.event.pull_request.number }}"]
200200
}')")
201201
202-
SESSION_URL=$(echo "$RESPONSE" | jq -r '.url // .session_url // empty')
202+
if [ "$HTTP_CODE" -lt 200 ] || [ "$HTTP_CODE" -ge 300 ]; then
203+
echo "Failed to create Devin session: HTTP $HTTP_CODE"
204+
cat /tmp/devin-response.json
205+
exit 1
206+
fi
207+
208+
SESSION_URL=$(cat /tmp/devin-response.json | jq -r '.url // .session_url // empty')
203209
if [ -n "$SESSION_URL" ]; then
204210
echo "Devin session created: $SESSION_URL"
205211
echo "SESSION_URL=$SESSION_URL" >> $GITHUB_ENV

.github/workflows/devin-conflict-resolver.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -314,10 +314,10 @@ jobs:
314314
If you prefer to resolve conflicts manually, you can close the Devin session and handle it yourself.`
315315
});
316316
} else {
317-
console.log(`Failed to get session URL for PR #${pr.number}:`, data);
317+
console.log(`Failed to get session URL for PR #${pr.number}`);
318318
}
319319
} catch (error) {
320-
console.error(`Error creating Devin session for PR #${pr.number}:`, error);
320+
console.error(`Error creating Devin session for PR #${pr.number}: ${error.message}`);
321321
}
322322
323323
await new Promise(resolve => setTimeout(resolve, 1000));

.github/workflows/release-docker.yaml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,10 @@ jobs:
6565
if [ "${{ inputs.BUILD_FROM_BRANCH }}" = "true" ]; then
6666
# Extract branch name and short SHA for the tag
6767
BRANCH_NAME="${GITHUB_REF#refs/heads/}"
68-
# Sanitize branch name: replace slashes with dashes for valid Docker tag
69-
SANITIZED_BRANCH=$(echo "$BRANCH_NAME" | tr '/' '-')
68+
# Sanitize branch name: replace all invalid Docker tag characters with dashes
69+
# Docker tags can only contain lowercase/uppercase letters, digits, underscores, periods, and dashes
70+
# Also remove any leading dashes or periods
71+
SANITIZED_BRANCH=$(echo "$BRANCH_NAME" | sed 's/[^a-zA-Z0-9_.-]/-/g' | sed 's/^[-.]*//')
7072
SHORT_SHA=$(git rev-parse --short HEAD)
7173
echo "release_tag=${SANITIZED_BRANCH}-${SHORT_SHA}" >> $GITHUB_OUTPUT
7274
else

apps/web/public/static/locales/en/common.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2878,9 +2878,9 @@
28782878
"time_range": "Time range",
28792879
"automatically_add_all_team_members": "Add all team members, including future members",
28802880
"redirect_to": "Redirect to",
2881-
"having_trouble_finding_time": "Having trouble finding a time?",
2882-
"show_more": "Show more",
2883-
"forward_params_redirect": "Forward parameters such as ?email=...&name=.... and more",
2881+
"having_trouble_finding_time": "Having trouble finding a time?",
2882+
"show_more": "Show more",
2883+
"forward_params_redirect": "Forward parameters such as ?email=...&name=.... and more",
28842884
"assignment_description": "Schedule meetings when everyone is available or rotate through members on your team",
28852885
"lowest": "lowest",
28862886
"low": "low",

companion/app/(tabs)/(bookings)/booking-detail.ios.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import * as Clipboard from "expo-clipboard";
22
import { Stack, useLocalSearchParams } from "expo-router";
33
import { useCallback, useMemo, useRef } from "react";
4-
import { Alert } from "react-native";
54
import { BookingDetailScreen } from "@/components/screens/BookingDetailScreen";
65
import { useAuth } from "@/contexts/AuthContext";
76
import { useBookingByUid } from "@/hooks/useBookings";
87
import type { Booking } from "@/services/calcom";
8+
import { showErrorAlert, showInfoAlert, showSuccessAlert } from "@/utils/alerts";
99
import { type BookingActionsResult, getBookingActions } from "@/utils/booking-actions";
1010
import { openInAppBrowser } from "@/utils/browser";
1111

@@ -94,7 +94,7 @@ export default function BookingDetailIOS() {
9494
const handleCopyMeetingLink = useCallback(async () => {
9595
if (meetingUrl) {
9696
await Clipboard.setStringAsync(meetingUrl);
97-
Alert.alert("Copied", "Meeting link copied to clipboard");
97+
showSuccessAlert("Copied", "Meeting link copied to clipboard");
9898
}
9999
}, [meetingUrl]);
100100

@@ -117,7 +117,7 @@ export default function BookingDetailIOS() {
117117
if (handlers?.[handlerName]) {
118118
(handlers[handlerName] as () => void)();
119119
} else {
120-
Alert.alert("Error", errorMessage);
120+
showErrorAlert("Error", errorMessage);
121121
}
122122
}, []);
123123

@@ -187,7 +187,7 @@ export default function BookingDetailIOS() {
187187
handlerName: null,
188188
errorMessage: null,
189189
customHandler: () => {
190-
Alert.alert("Report Booking", "Report booking functionality is not yet available");
190+
showInfoAlert("Report Booking", "Report booking functionality is not yet available");
191191
},
192192
destructive: true,
193193
gatingKey: null,

companion/app/(tabs)/(bookings)/booking-detail.tsx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { Stack, useLocalSearchParams } from "expo-router";
22
import { useCallback, useMemo, useRef } from "react";
3-
import { Alert } from "react-native";
43
import { BookingDetailScreen } from "@/components/screens/BookingDetailScreen";
54
import { useAuth } from "@/contexts/AuthContext";
65
import { useBookingByUid } from "@/hooks/useBookings";
6+
import { showErrorAlert, showInfoAlert } from "@/utils/alerts";
77
import { type BookingActionsResult, getBookingActions } from "@/utils/booking-actions";
88

99
// Empty actions result for when no booking is loaded
@@ -64,59 +64,59 @@ export default function BookingDetail() {
6464
if (actionHandlersRef.current?.openRescheduleModal) {
6565
actionHandlersRef.current.openRescheduleModal();
6666
} else {
67-
Alert.alert("Error", "Unable to reschedule. Please try again.");
67+
showErrorAlert("Error", "Unable to reschedule. Please try again.");
6868
}
6969
}, []);
7070

7171
const handleEditLocation = useCallback(() => {
7272
if (actionHandlersRef.current?.openEditLocationModal) {
7373
actionHandlersRef.current.openEditLocationModal();
7474
} else {
75-
Alert.alert("Error", "Unable to edit location. Please try again.");
75+
showErrorAlert("Error", "Unable to edit location. Please try again.");
7676
}
7777
}, []);
7878

7979
const handleAddGuests = useCallback(() => {
8080
if (actionHandlersRef.current?.openAddGuestsModal) {
8181
actionHandlersRef.current.openAddGuestsModal();
8282
} else {
83-
Alert.alert("Error", "Unable to add guests. Please try again.");
83+
showErrorAlert("Error", "Unable to add guests. Please try again.");
8484
}
8585
}, []);
8686

8787
const handleViewRecordings = useCallback(() => {
8888
if (actionHandlersRef.current?.openViewRecordingsModal) {
8989
actionHandlersRef.current.openViewRecordingsModal();
9090
} else {
91-
Alert.alert("Error", "Unable to view recordings. Please try again.");
91+
showErrorAlert("Error", "Unable to view recordings. Please try again.");
9292
}
9393
}, []);
9494

9595
const handleSessionDetails = useCallback(() => {
9696
if (actionHandlersRef.current?.openMeetingSessionDetailsModal) {
9797
actionHandlersRef.current.openMeetingSessionDetailsModal();
9898
} else {
99-
Alert.alert("Error", "Unable to view session details. Please try again.");
99+
showErrorAlert("Error", "Unable to view session details. Please try again.");
100100
}
101101
}, []);
102102

103103
const handleMarkNoShow = useCallback(() => {
104104
if (actionHandlersRef.current?.openMarkNoShowModal) {
105105
actionHandlersRef.current.openMarkNoShowModal();
106106
} else {
107-
Alert.alert("Error", "Unable to mark no-show. Please try again.");
107+
showErrorAlert("Error", "Unable to mark no-show. Please try again.");
108108
}
109109
}, []);
110110

111111
const handleReport = useCallback(() => {
112-
Alert.alert("Report Booking", "Report booking functionality is not yet available");
112+
showInfoAlert("Report Booking", "Report booking functionality is not yet available");
113113
}, []);
114114

115115
const handleCancel = useCallback(() => {
116116
if (actionHandlersRef.current?.handleCancelBooking) {
117117
actionHandlersRef.current.handleCancelBooking();
118118
} else {
119-
Alert.alert("Error", "Unable to cancel. Please try again.");
119+
showErrorAlert("Error", "Unable to cancel. Please try again.");
120120
}
121121
}, []);
122122

0 commit comments

Comments
 (0)