Skip to content

fix: improve Meetings error feedback and retry - WPB-27431 - #5232

Open
acv-w wants to merge 2 commits into
developfrom
fix/meeting-connection-errors-WPB-27431
Open

acv-w wants to merge 2 commits into
developfrom
fix/meeting-connection-errors-WPB-27431

Conversation

@acv-w

@acv-w acv-w commented Sep 15, 2026

Copy link
Copy Markdown
Contributor
StoryWPB-27431 [iOS] Handle network/connection errors in Meetings with retry

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

  • Title contains a reference JIRA issue number like [WPB-XXX].
  • Description is filled and free of optional paragraphs.
  • Adds/updates automated tests.

UI accessibility checklist

If your PR includes UI changes, please utilize this checklist:

  • Make sure you use the API for UI elements that support large fonts.
  • All colors are taken from WireDesign.ColorTheme or constructed using WireDesign.BaseColorPalette.
  • New UI elements have Accessibility strings for VoiceOver.

@acv-w
acv-w requested review from a team, KaterinaWire and samwyndham and removed request for a team September 15, 2026 09:36
@acv-w
acv-w requested review from jullianm and removed request for KaterinaWire September 15, 2026 09:36
@github-actions

github-actions Bot commented Sep 15, 2026

Copy link
Copy Markdown
Contributor

Test Results

  1 files   14 suites   7s ⏱️
160 tests 160 ✅ 0 💤 0 ❌
161 runs  161 ✅ 0 💤 0 ❌

Results for commit 0a9c27a.

♻️ This comment has been updated with latest results.

Summary: workflow run #35018186665
Allure report (download zip): html-report-33417-fix_meeting-connection-errors-WPB-27431

@samwyndham
samwyndham requested a lite review from Copilot September 15, 2026 14:48

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@samwyndham
samwyndham requested a lite review from Copilot September 15, 2026 14:57

@samwyndham samwyndham left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 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-51 and de.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 errorContent mapping 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 loadMoreIfNeeded fails, but that path has already set hasMore to false while leaving futureOffset at the failed page. Calling loadInitialData() 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

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.

3 participants