Conversation
Test Results 1 files 14 suites 7s ⏱️ Results for commit 0a9c27a. ♻️ This comment has been updated with latest results. Summary: workflow run #35018186665 |
There was a problem hiding this comment.
🟡 Changes recommended
One or more issues must be addressed before approval.
Get a fresh assessment by requesting another Copilot review.
Review details
Suppressed comments (4)
WireCalling/Sources/WireCallingUI/Resources/Localization/en.lproj/Localizable.strings:25
- codebase_conventions: These new user-facing keys are added only to
en.lproj, while the supported WireCallingUI locale files keep the existing WireMeetings key set (for example,fr.lproj/Localizable.strings:21-51andde.lproj/Localizable.strings:21-51). Non-English users will therefore fall back to English for the new load/delete feedback and retry label; add these keys/translations to the other locale resources as well.
"meetings.list.loadError" = "Could not load meetings. Please try again.";
"meetings.deleteModal.error.deleteFailedTitle" = "Could not delete meeting";
"meetings.deleteModal.error.deleteFailed" = "Something went wrong while deleting the meeting. Please try again.";
"meetings.deleteModal.error.leaveConversationFailedTitle" = "Could not leave meeting";
"meetings.deleteModal.error.leaveConversationFailed" = "Something went wrong while leaving the meeting conversation. Please try again.";
WireCalling/Sources/WireCallingUI/Views/WireMeetings/MeetingForm/MeetingFormView.swift:127
- The new mode-specific
errorContentmapping is untested. Existing form snapshots cover only the initial forms and the view-model tests assert the error flag, so a swapped or missing title/body for instant, scheduled, or edit failures would pass; add error-state coverage for all three modes.
private var errorContent: (title: String, message: String) {
typealias Errors = L10n.Localizable.Meetings
switch viewModel.mode {
case .instant:
return (Errors.MeetNowModal.Error.createFailedTitle, Errors.MeetNowModal.Error.createFailed)
case .scheduled:
return (Errors.ScheduleModal.Error.createFailedTitle, Errors.ScheduleModal.Error.createFailed)
case .edit:
return (Errors.ScheduleModal.Error.updateFailedTitle, Errors.ScheduleModal.Error.updateFailed)
WireCalling/Sources/WireCallingUI/Views/WireMeetings/MeetingsView/MeetingsView.swift:116
- This retry is also used after
loadMoreIfNeededfails, but that path has already sethasMoreto false while leavingfutureOffsetat the failed page. CallingloadInitialData()resets the offset to zero and replaces the previously loaded pages with only the first page, so retrying a pagination failure loses meetings. Track the failed load type/offset and retry that page (or otherwise preserve the loaded range) instead of always restarting the list.
Button(L10n.Localizable.WireMeetings.retry) {
Task { await viewModel.loadInitialData() }
WireCalling/Sources/WireCallingUI/Views/WireMeetings/MeetingsView/MeetingsViewModel.swift:77
- The new organizer-versus-participant error copy is not covered by the tests: the existing failure test uses the default organizer fixture and never asserts either computed string. Add organizer and non-organizer cases that verify both the title and message so a regression cannot show delete copy for a leave failure.
var deleteErrorTitle: String {
let strings = L10n.Localizable.Meetings.DeleteModal.Error.self
return failedMeetingToDelete.map { !isOrganizer($0) } == true
? strings.leaveConversationFailedTitle : strings.deleteFailedTitle
}
var deleteErrorMessage: String {
let strings = L10n.Localizable.Meetings.DeleteModal.Error.self
return failedMeetingToDelete.map { !isOrganizer($0) } == true
? strings.leaveConversationFailed : strings.deleteFailed
- Files reviewed: 5/5 changed files
- Comments generated: 1
- Review effort level: Lite
Issue
Add loading indicators and action-specific error titles/bodies for scheduling, Meet Now, editing, and deleting/leaving meetings. Add Retry for failed list loads and deletions; forms retain inputs for resubmission.
Checklist
[WPB-XXX].UI accessibility checklist
If your PR includes UI changes, please utilize this checklist: