feat: support editing meetings - WPB-25501#5043
Conversation
There was a problem hiding this comment.
Pull request overview
This PR adds end-to-end support for editing existing meetings, spanning the network layer (update request encoding), domain layer (update use case + repositories), and WireCalling UI (edit-mode meeting form + member selection), with accompanying unit/snapshot test updates.
Changes:
- Add an
UpdateMeetingUseCaseand repository support to update meetings and adjust conversation participants. - Extend the meetings UI to present a unified
MeetingFormViewin create/schedule/edit modes, plus a new member selection screen. - Update WireNetwork meeting update request encoding/snapshots (including explicit
recurrence: null) and expand tests/snapshot reference assets.
Reviewed changes
Copilot reviewed 38 out of 69 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| WireNetwork/Tests/WireNetworkTests/APIs/Rest/MeetingsAPI/Snapshots/MeetingsAPITests/testUpdateMeeting_Request_Generation_V16.request-0-v16.txt | Snapshot updated to include recurrence:null in update request body |
| WireNetwork/Sources/WireNetwork/Models/Meetings/UpdateMeetingParameters.swift | Update-meeting encoding adjusted (explicit null recurrence) |
| WireDomain/Tests/WireDomainTests/Synchronization/PullMeetingsSyncTests.swift | Test mock expanded to include updateMeeting and richer deleteMeeting tracking |
| WireCalling/Tests/WireCallingTests/WireMeetings/PresentationTests/Views/ScheduledMeetingFormViewSnapshotTests.swift | Snapshot tests migrated to MeetingFormView / MeetingFormViewModel |
| WireCalling/Tests/WireCallingTests/WireMeetings/PresentationTests/Views/InstantMeetingFormViewSnapshotTests.swift | Snapshot tests migrated to MeetingFormView / MeetingFormViewModel |
| WireCalling/Tests/WireCallingTests/WireMeetings/PresentationTests/Views/EditMeetingFormViewSnapshotTests.swift | New snapshot coverage for edit-mode form rendering |
| WireCalling/Tests/WireCallingTests/WireMeetings/PresentationTests/MeetingFormViewModelTests.swift | Tests migrated/expanded for edit mode and update-submit behavior |
| WireCalling/Tests/WireCallingTests/WireMeetings/DomainTests/UpdateMeetingUseCaseTests.swift | New unit tests for update use case participant diffing + failure behavior |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/ScheduledMeetingFormViewSnapshotTests/testEmptyStateDynamicTypeVariants.xxxLarge.png | Snapshot reference image (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/ScheduledMeetingFormViewSnapshotTests/testEmptyStateDynamicTypeVariants.xxLarge.png | Snapshot reference image (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/ScheduledMeetingFormViewSnapshotTests/testEmptyStateDynamicTypeVariants.xSmall.png | Snapshot reference image (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/ScheduledMeetingFormViewSnapshotTests/testEmptyStateDynamicTypeVariants.xLarge.png | Snapshot reference image (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/ScheduledMeetingFormViewSnapshotTests/testEmptyStateDynamicTypeVariants.small.png | Snapshot reference image (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/ScheduledMeetingFormViewSnapshotTests/testEmptyStateDynamicTypeVariants.medium.png | Snapshot reference image (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/ScheduledMeetingFormViewSnapshotTests/testEmptyStateDynamicTypeVariants.large.png | Snapshot reference image (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/ScheduledMeetingFormViewSnapshotTests/testEmptyStateDynamicTypeVariants.accessibility5.png | Snapshot reference image (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/ScheduledMeetingFormViewSnapshotTests/testEmptyStateDynamicTypeVariants.accessibility4.png | Snapshot reference image (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/ScheduledMeetingFormViewSnapshotTests/testEmptyStateDynamicTypeVariants.accessibility3.png | Snapshot reference image (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/ScheduledMeetingFormViewSnapshotTests/testEmptyStateDynamicTypeVariants.accessibility2.png | Snapshot reference image (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/ScheduledMeetingFormViewSnapshotTests/testEmptyStateDynamicTypeVariants.accessibility1.png | Snapshot reference image (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/ScheduledMeetingFormViewSnapshotTests/testEmptyStateColorSchemeVariants.light.png | Snapshot reference image (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/ScheduledMeetingFormViewSnapshotTests/testEmptyStateColorSchemeVariants.dark.png | Snapshot reference image (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/InstantMeetingFormViewSnapshotTests/testEmptyStateDynamicTypeVariants.xxxLarge.png | Snapshot reference image (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/InstantMeetingFormViewSnapshotTests/testEmptyStateDynamicTypeVariants.xxLarge.png | Snapshot reference image (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/InstantMeetingFormViewSnapshotTests/testEmptyStateDynamicTypeVariants.xSmall.png | Snapshot reference image (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/InstantMeetingFormViewSnapshotTests/testEmptyStateDynamicTypeVariants.xLarge.png | Snapshot reference image (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/InstantMeetingFormViewSnapshotTests/testEmptyStateDynamicTypeVariants.small.png | Snapshot reference image (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/InstantMeetingFormViewSnapshotTests/testEmptyStateDynamicTypeVariants.medium.png | Snapshot reference image (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/InstantMeetingFormViewSnapshotTests/testEmptyStateDynamicTypeVariants.large.png | Snapshot reference image (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/InstantMeetingFormViewSnapshotTests/testEmptyStateDynamicTypeVariants.accessibility5.png | Snapshot reference image (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/InstantMeetingFormViewSnapshotTests/testEmptyStateDynamicTypeVariants.accessibility4.png | Snapshot reference image (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/InstantMeetingFormViewSnapshotTests/testEmptyStateDynamicTypeVariants.accessibility3.png | Snapshot reference image (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/InstantMeetingFormViewSnapshotTests/testEmptyStateDynamicTypeVariants.accessibility2.png | Snapshot reference image (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/InstantMeetingFormViewSnapshotTests/testEmptyStateDynamicTypeVariants.accessibility1.png | Snapshot reference image (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/InstantMeetingFormViewSnapshotTests/testEmptyStateColorSchemeVariants.light.png | Snapshot reference image (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/InstantMeetingFormViewSnapshotTests/testEmptyStateColorSchemeVariants.dark.png | Snapshot reference image (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/EditMeetingFormViewSnapshotTests/testPrefilledFormDynamicTypeVariants.xxxLarge.png | Snapshot reference image pointer added (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/EditMeetingFormViewSnapshotTests/testPrefilledFormDynamicTypeVariants.xxLarge.png | Snapshot reference image pointer added (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/EditMeetingFormViewSnapshotTests/testPrefilledFormDynamicTypeVariants.xSmall.png | Snapshot reference image pointer added (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/EditMeetingFormViewSnapshotTests/testPrefilledFormDynamicTypeVariants.xLarge.png | Snapshot reference image pointer added (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/EditMeetingFormViewSnapshotTests/testPrefilledFormDynamicTypeVariants.small.png | Snapshot reference image pointer added (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/EditMeetingFormViewSnapshotTests/testPrefilledFormDynamicTypeVariants.medium.png | Snapshot reference image pointer added (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/EditMeetingFormViewSnapshotTests/testPrefilledFormDynamicTypeVariants.large.png | Snapshot reference image pointer added (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/EditMeetingFormViewSnapshotTests/testPrefilledFormDynamicTypeVariants.accessibility5.png | Snapshot reference image pointer added (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/EditMeetingFormViewSnapshotTests/testPrefilledFormDynamicTypeVariants.accessibility4.png | Snapshot reference image pointer added (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/EditMeetingFormViewSnapshotTests/testPrefilledFormDynamicTypeVariants.accessibility3.png | Snapshot reference image pointer added (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/EditMeetingFormViewSnapshotTests/testPrefilledFormDynamicTypeVariants.accessibility2.png | Snapshot reference image pointer added (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/EditMeetingFormViewSnapshotTests/testPrefilledFormDynamicTypeVariants.accessibility1.png | Snapshot reference image pointer added (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/EditMeetingFormViewSnapshotTests/testPrefilledFormColorSchemeVariants.light.png | Snapshot reference image pointer added (Git LFS) |
| WireCalling/Tests/WireCallingTests/Resources/ReferenceImages/EditMeetingFormViewSnapshotTests/testPrefilledFormColorSchemeVariants.dark.png | Snapshot reference image pointer added (Git LFS) |
| WireCalling/Sources/WireCallingUI/Views/WireMeetings/MeetingsView/MeetingsView.swift | Plumb edit action via onEditMeeting callback |
| WireCalling/Sources/WireCallingUI/Views/WireMeetings/MeetingsView/AllMeetingsViewModel.swift | Present edit-mode form by setting .edit(meeting) |
| WireCalling/Sources/WireCallingUI/Views/WireMeetings/MeetingsView/AllMeetingsView.swift | Wire edit action from list into the form sheet presentation |
| WireCalling/Sources/WireCallingUI/Views/WireMeetings/MeetingForm/MemberSelection/MemberSelectionViewModel.swift | New view model for debounced member search + selection state |
| WireCalling/Sources/WireCallingUI/Views/WireMeetings/MeetingForm/MemberSelection/MemberSelectionView.swift | New SwiftUI member selection screen (search + selected list) |
| WireCalling/Sources/WireCallingUI/Views/WireMeetings/MeetingForm/MeetingRepeatOption.swift | New repeat-option enum used by the meeting form |
| WireCalling/Sources/WireCallingUI/Views/WireMeetings/MeetingForm/MeetingFormViewModel.swift | Rename/extend form view model to support edit mode + update use case |
| WireCalling/Sources/WireCallingUI/Views/WireMeetings/MeetingForm/MeetingFormView.swift | Rename/extend form view to support edit mode (labels, focus behavior, previews) |
| WireCalling/Sources/WireCallingUI/Resources/Localization/en.lproj/Localizable.strings | Add “Edit meeting” + “Save” strings |
| WireCalling/Sources/WireCallingDomain/WireMeetings/UseCases/UpdateMeetingUseCase.swift | New use case to update meeting + sync participants with conversation |
| WireCalling/Sources/WireCallingDomain/WireMeetings/Protocols/UpdateMeetingUseCaseProtocol.swift | New protocol for update use case |
| WireCalling/Sources/WireCallingDomain/WireMeetings/Protocols/MeetingRepositoryProtocol.swift | Add updateMeeting API to repository |
| WireCalling/Sources/WireCallingDomain/WireMeetings/Protocols/MeetingConversationRepositoryProtocol.swift | Add removeParticipants API |
| WireCalling/Sources/WireCallingDomain/WireMeetings/Model/MeetingRecurrence.swift | Make recurrence Hashable (needed for edit mode identity) |
| WireCalling/Sources/WireCallingDomain/WireMeetings/Model/Meeting.swift | Make meeting Hashable (needed for edit mode identity) |
| WireCalling/Sources/WireCallingData/MeetingRepository.swift | Implement updateMeeting via WireNetwork and refresh local store |
| WireCalling/Sources/WireCallingAssembly/WireMeetingsFactory.swift | Wire UpdateMeetingUseCase into the UI view-model factory |
| wire-ios/Wire-iOS/Sources/UserInterface/MainController/ZClientViewController.swift | Provide participants service dependency for meeting conversation bridge |
| wire-ios/Wire-iOS/Sources/UserInterface/Calling/Meetings/MeetingConversationRepositoryBridge.swift | Support participant removal + established-group add-members path |
Comments suppressed due to low confidence (1)
WireCalling/Sources/WireCallingUI/Views/WireMeetings/MeetingForm/MeetingFormViewModel.swift:249
- In edit mode, unsupported recurrence intervals are collapsed to a supported
MeetingRepeatOption(e.g. weekly interval 3 ->.weekly). If the user edits something unrelated (like the title) and taps Save,toRecurrence()will write back the collapsed value, silently changing the meeting’s recurrence. Consider preserving the originalmeeting.recurrenceunless the user explicitly changes the repeat option, or representing unsupported recurrences explicitly in the UI.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Test Results – batch 12 340 tests 2 313 ✅ 2m 31s ⏱️ Results for commit f8fac5a. ♻️ This comment has been updated with latest results. |
Test Results – batch 0 2 files 160 suites 25s ⏱️ Results for commit f8fac5a. ♻️ This comment has been updated with latest results. |
|
…0-0c785c9486b6107f1f24b939e82c3dc7134964b3' into feat/edit-meeting-WPB-25501
…meeting-WPB-25501
…meeting-WPB-25501
…meeting-WPB-25501
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 41 out of 72 changed files in this pull request and generated 1 comment.
Comments suppressed due to low confidence (1)
WireCalling/Sources/WireCallingUI/Views/WireMeetings/MeetingForm/MeetingFormViewModel.swift:48
- The edit-mode docstring is now out of sync with the actual UI strings: the primary button label comes from
wireMeetings.schedule.save.button(currently "Confirm"), and the navigation title fromwireMeetings.schedule.edit.title("Edit Meeting"). Keeping the comment accurate avoids misleading future changes.
…g-WPB-25501 # Conflicts: # WireDomain/Sources/WireDomain/Repositories/Meetings/MeetingLocalStore.swift
…' into feat/edit-meeting-WPB-25501
Issue
This PR adds support for editing existing meetings.
Testing
Enable the WireMeetings feature flag.
Create a meeting.
Edit the meeting from the list of meetings, try to change the participants, time, title and/or recurrence.
Checklist
[WPB-XXX].UI accessibility checklist
If your PR includes UI changes, please utilize this checklist: