Skip to content

feat: support editing meetings - WPB-25501#5043

Open
caldrian wants to merge 30 commits into
feat/fetch-meetings-participantsfrom
feat/edit-meeting-WPB-25501
Open

feat: support editing meetings - WPB-25501#5043
caldrian wants to merge 30 commits into
feat/fetch-meetings-participantsfrom
feat/edit-meeting-WPB-25501

Conversation

@caldrian

@caldrian caldrian commented Jul 22, 2026

Copy link
Copy Markdown
Contributor
TaskWPB-25501 [iOS] Edit a meeting

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

  • 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.

@caldrian caldrian added the WIP label Jul 22, 2026
@caldrian
caldrian marked this pull request as ready for review July 22, 2026 11:45
Copilot AI review requested due to automatic review settings July 22, 2026 11:45
@caldrian caldrian changed the title feat: support editing meetings - WPB-25501 feat: support editing meetings - WPB-25501x Jul 22, 2026
@caldrian caldrian changed the title feat: support editing meetings - WPB-25501x feat: support editing meetings - WPB-25501 Jul 22, 2026

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.

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 UpdateMeetingUseCase and repository support to update meetings and adjust conversation participants.
  • Extend the meetings UI to present a unified MeetingFormView in 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 original meeting.recurrence unless 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.

Comment thread WireNetwork/Sources/WireNetwork/Models/Meetings/UpdateMeetingParameters.swift Outdated
@github-actions

github-actions Bot commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

Test Results – batch 1

2 340 tests   2 313 ✅  2m 31s ⏱️
  343 suites     27 💤
    2 files        0 ❌

Results for commit f8fac5a.

♻️ This comment has been updated with latest results.

@github-actions

github-actions Bot commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

Test Results – batch 0

  2 files  160 suites   25s ⏱️
686 tests 686 ✅ 0 💤 0 ❌
687 runs  687 ✅ 0 💤 0 ❌

Results for commit f8fac5a.

♻️ This comment has been updated with latest results.

@datadog-wireapp

Copy link
Copy Markdown

Tests

⚠️ Warnings

🧪 2 Tests failed

    testPrefilledFormColorSchemeVariants() from WireCallingTests.EditMeetingFormViewSnapshotTests

    testPrefilledFormDynamicTypeVariants() from WireCallingTests.EditMeetingFormViewSnapshotTests

Useful? React with 👍 / 👎

This comment will be updated automatically if new data arrives.
🔗 Commit SHA: 244c56a | Docs | Give us feedback!

@caldrian
caldrian marked this pull request as draft July 22, 2026 19:12
@caldrian
caldrian marked this pull request as ready for review July 23, 2026 13:04
@caldrian caldrian removed the WIP label Jul 24, 2026
@caldrian
caldrian requested review from a team, Copilot, johnxnguyen, jullianm and samwyndham and removed request for a team and johnxnguyen July 24, 2026 13:02

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.

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 from wireMeetings.schedule.edit.title ("Edit Meeting"). Keeping the comment accurate avoids misleading future changes.

caldrian added 2 commits July 24, 2026 15:25
…g-WPB-25501

# Conflicts:
#	WireDomain/Sources/WireDomain/Repositories/Meetings/MeetingLocalStore.swift

@jullianm jullianm 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.

Nice work

@caldrian
caldrian changed the base branch from develop to feat/fetch-meetings-participants July 24, 2026 14:46
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