Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
577 commits
Select commit Hold shift + click to select a range
9faaae3
filter meeting type
caldrian Jul 1, 2026
5d7fb2e
Merge branch 'feat/support-meeting-conversation-type-WPB-26589' into …
caldrian Jul 1, 2026
e2c47bf
Merge branch 'develop' of github.com:wireapp/wire-ios into chore/crea…
caldrian Jul 1, 2026
a147f0d
Merge branch 'chore/create-meetings-entities-WPB-20278' into feat/cre…
caldrian Jul 1, 2026
0891e33
rework data model
caldrian Jul 1, 2026
20d1f92
add temporary files
caldrian Jul 1, 2026
c2356c4
add more temporary files
caldrian Jul 1, 2026
11a06b4
move temporary files
caldrian Jul 1, 2026
4a2c83a
clean up
caldrian Jul 1, 2026
87d250a
fix build error
caldrian Jul 1, 2026
7a97ec7
Merge branch 'develop' of github.com:wireapp/wire-ios into chore/crea…
caldrian Jul 1, 2026
667492f
Merge branch 'chore/create-meetings-entities-WPB-20278' into feat/cre…
caldrian Jul 1, 2026
ca51884
add wiredatabase file
caldrian Jul 1, 2026
0273b48
Merge branch 'develop' of github.com:wireapp/wire-ios into chore/crea…
caldrian Jul 2, 2026
3a3a878
Potential fix for pull request finding
caldrian Jul 2, 2026
db888d0
fixes
caldrian Jul 2, 2026
e2c0367
Merge branch 'develop' of github.com:wireapp/wire-ios into chore/crea…
caldrian Jul 2, 2026
760bf51
format code
caldrian Jul 2, 2026
b4b4354
Merge branch 'chore/create-meetings-entities-WPB-20278' of github.com…
caldrian Jul 2, 2026
23180b9
add entityName property
caldrian Jul 2, 2026
aa3b72e
Update WireNetwork/Sources/WireNetwork/APIs/Rest/ConversationsAPI/Con…
caldrian Jul 2, 2026
6262d2d
minor fix
caldrian Jul 2, 2026
7bd750f
Merge branch 'develop' of github.com:wireapp/wire-ios into feat/suppo…
caldrian Jul 2, 2026
83a40ad
format code
caldrian Jul 2, 2026
f9c04f3
Merge branch 'chore/create-meetings-entities-WPB-20278' into feat/cre…
caldrian Jul 2, 2026
f3771a7
Refine entity properties
caldrian Jul 2, 2026
4fc56c1
adjust data model
caldrian Jul 2, 2026
3d9afa7
adjust recurrence properties
caldrian Jul 2, 2026
630408c
Merge branch 'develop' of github.com:wireapp/wire-ios into chore/crea…
caldrian Jul 2, 2026
fc21ee3
Merge commit '3d9afa7a76b7c93bf57f5f6693835a7ec0715383' into feat/cre…
caldrian Jul 2, 2026
dbd509d
Merge branch 'chore/create-meetings-entities-WPB-20278' into feat/cre…
caldrian Jul 2, 2026
d0262e2
recurrence
caldrian Jul 2, 2026
eb1eac3
fixes
caldrian Jul 2, 2026
c0ca19f
Merge branch 'chore/create-meetings-entities-WPB-20278' into feat/cre…
caldrian Jul 2, 2026
2d5ac87
StoredMeeting+recurrenceFrequency
caldrian Jul 2, 2026
dbda59b
Merge branch 'chore/create-meetings-entities-WPB-20278' into feat/cre…
caldrian Jul 2, 2026
4fb8e73
format code
caldrian Jul 2, 2026
ff2b2de
Merge branch 'chore/create-meetings-entities-WPB-20278' into feat/cre…
caldrian Jul 2, 2026
58e8e6e
meeting repository add
caldrian Jul 2, 2026
8e0d52f
Merge remote-tracking branch 'github/gh-readonly-queue/develop/pr-495…
caldrian Jul 2, 2026
75e8152
Merge branch 'chore/create-meetings-entities-WPB-20278' into feat/cre…
caldrian Jul 2, 2026
541654e
split use cases
caldrian Jul 2, 2026
f91abf7
refactoring
caldrian Jul 2, 2026
c762f93
fix build errors
caldrian Jul 2, 2026
fcd18e2
Merge branch 'develop' of github.com:wireapp/wire-ios into feat/suppo…
caldrian Jul 2, 2026
baa0b51
Merge branch 'feat/support-meeting-conversation-type-WPB-26589' into …
caldrian Jul 2, 2026
c25a16e
adjust TODO
caldrian Jul 2, 2026
2a7f7ca
fix build error
caldrian Jul 2, 2026
74be60d
Merge branch 'develop' of github.com:wireapp/wire-ios into feat/suppo…
caldrian Jul 3, 2026
946c6b2
add comment
caldrian Jul 3, 2026
13b4ba1
Merge remote-tracking branch 'github/gh-readonly-queue/develop/pr-494…
caldrian Jul 3, 2026
12732c3
Merge branch 'feat/support-meeting-conversation-type-WPB-26589' into …
caldrian Jul 3, 2026
79e5541
pull conversation after meeting creation
caldrian Jul 3, 2026
636972d
Merge branch 'develop' of github.com:wireapp/wire-ios into feat/creat…
caldrian Jul 3, 2026
37b6473
attempt to add participants
caldrian Jul 3, 2026
04da9e9
Merge branch 'develop' of github.com:wireapp/wire-ios into feat/creat…
caldrian Jul 6, 2026
d5f313b
set up MLS
caldrian Jul 6, 2026
5c0c26a
generate fix
caldrian Jul 6, 2026
05cabfa
clean up unused code
caldrian Jul 6, 2026
cc2c361
fix/cleanup
caldrian Jul 6, 2026
fc5a7b9
cleanup
caldrian Jul 6, 2026
4564642
Merge branch 'develop' of github.com:wireapp/wire-ios into feat/creat…
caldrian Jul 6, 2026
f454633
move repeat option
caldrian Jul 6, 2026
22d7a69
repeat option + recurrance
caldrian Jul 6, 2026
858a187
format code
caldrian Jul 6, 2026
b4f2690
import changes
caldrian Jul 6, 2026
944da91
Merge branch 'chore/send-create-meeting-request-WPB-25676' into feat/…
caldrian Jul 6, 2026
efc1d96
FocusState
caldrian Jul 6, 2026
46fb1c9
round up start date
caldrian Jul 6, 2026
14a51ac
CurrentDateProviding
caldrian Jul 6, 2026
3e67231
adjust end date
caldrian Jul 6, 2026
6e7f3c7
CreateMeetingFormViewModel factory
caldrian Jul 6, 2026
d9ebc5c
Merge branch 'chore/send-create-meeting-request-WPB-25676' into feat/…
caldrian Jul 6, 2026
5dc8f6c
update snapshot reference images
caldrian Jul 6, 2026
2bb7744
address some PR comments
caldrian Jul 6, 2026
0cac9e9
address another comment
caldrian Jul 6, 2026
886db84
unchecked sendable
caldrian Jul 6, 2026
659a08e
Merge branch 'chore/send-create-meeting-request-WPB-25676' into feat/…
caldrian Jul 6, 2026
496ea9e
Merge branch 'develop' of github.com:wireapp/wire-ios into chore/send…
caldrian Jul 7, 2026
744122f
introduce SearchMembersUseCase
caldrian Jul 7, 2026
e61b60b
Merge branch 'chore/send-create-meeting-request-WPB-25676' into feat/…
caldrian Jul 7, 2026
949bf4a
add TODO
caldrian Jul 7, 2026
cf5f547
forbid dates in the past
caldrian Jul 7, 2026
cac5860
allow same day meetings in the past
caldrian Jul 7, 2026
201ddf0
Merge branch 'develop' of github.com:wireapp/wire-ios into chore/send…
caldrian Jul 7, 2026
c585e16
Merge branch 'chore/send-create-meeting-request-WPB-25676' into feat/…
caldrian Jul 7, 2026
27fd05b
format code
caldrian Jul 7, 2026
51210fb
Merge branch 'chore/send-create-meeting-request-WPB-25676' into feat/…
caldrian Jul 7, 2026
46a9456
add preview
caldrian Jul 7, 2026
8d907be
Merge branch 'feat/create-update-list-meetings-WPB-25676' into feat/d…
caldrian Jul 7, 2026
6ff6fe1
delete unused code
caldrian Jul 7, 2026
7a2cd40
Merge branch 'feat/create-update-list-meetings-WPB-25676' into feat/d…
caldrian Jul 7, 2026
69ee27f
delete file
caldrian Jul 7, 2026
d98a531
fix build errors
caldrian Jul 7, 2026
35c947b
Merge branch 'develop' of github.com:wireapp/wire-ios into feat/creat…
caldrian Jul 7, 2026
d2b2b91
Update WireCalling/Sources/WireCallingDomain/WireMeetings/UseCases/Cr…
caldrian Jul 7, 2026
96ec335
Update WireCalling/Sources/WireCallingUI/Views/WireMeetings/CreateMee…
caldrian Jul 7, 2026
cd51627
Merge branch 'develop' of github.com:wireapp/wire-ios into chore/send…
caldrian Jul 7, 2026
ac1ab50
add comments
caldrian Jul 7, 2026
da51c00
use TimeInterval extension
caldrian Jul 7, 2026
303ee8f
don't present errors
caldrian Jul 7, 2026
ece78a2
fix syntax
caldrian Jul 7, 2026
e1021c5
Merge branch 'chore/send-create-meeting-request-WPB-25676' into feat/…
caldrian Jul 7, 2026
9c12b64
Merge branch 'feat/create-update-list-meetings-WPB-25676' into feat/d…
caldrian Jul 7, 2026
84998de
Merge remote-tracking branch 'github/gh-readonly-queue/develop/pr-496…
caldrian Jul 7, 2026
e46162d
Merge branch 'chore/send-create-meeting-request-WPB-25676' into feat/…
caldrian Jul 7, 2026
269de7d
Merge branch 'feat/create-update-list-meetings-WPB-25676' into feat/d…
caldrian Jul 7, 2026
10efc1f
Merge branch 'develop' of github.com:wireapp/wire-ios into feat/creat…
caldrian Jul 7, 2026
f037e1e
cleanup
caldrian Jul 7, 2026
ab1877c
Merge branch 'develop' of github.com:wireapp/wire-ios into feat/delet…
caldrian Jul 7, 2026
de5dc9e
Merge branch 'feat/create-update-list-meetings-WPB-25676' into feat/d…
caldrian Jul 7, 2026
7fb9d30
create MeetingsLocalStore
caldrian Jul 7, 2026
70db900
add todo
caldrian Jul 7, 2026
ba1383d
Merge branch 'develop' of github.com:wireapp/wire-ios into feat/creat…
caldrian Jul 8, 2026
bedd093
Merge branch 'feat/create-update-list-meetings-WPB-25676' into feat/d…
caldrian Jul 8, 2026
8555582
create MeetingsLocalStore
caldrian Jul 8, 2026
c9e5876
replaceAllMeetings
caldrian Jul 8, 2026
c4fb395
meeting events
caldrian Jul 8, 2026
97fc40b
add tests
caldrian Jul 8, 2026
97b4f1f
Merge branch 'develop' of github.com:wireapp/wire-ios into feat/creat…
caldrian Jul 8, 2026
477bc6d
delete redundant line
caldrian Jul 8, 2026
5a75c27
Merge branch 'feat/create-update-list-meetings-WPB-25676' into feat/d…
caldrian Jul 8, 2026
0eb88d2
squashed
caldrian Jul 8, 2026
ed573c9
Merge branch 'feat/create-update-list-meetings-WPB-25676' of github.c…
caldrian Jul 8, 2026
80ac201
import changes
caldrian Jul 8, 2026
049db52
create another MeetingRepository
caldrian Jul 8, 2026
3feadd5
delete redundant protocol
caldrian Jul 9, 2026
e10d18a
attempt to fix issues
caldrian Jul 9, 2026
ba11ceb
renamings
caldrian Jul 9, 2026
2c67e0a
fix
caldrian Jul 9, 2026
16dc0fb
fix build error
caldrian Jul 9, 2026
4686754
resolve todo
caldrian Jul 9, 2026
75ce11e
Merge branch 'develop' of github.com:wireapp/wire-ios into feat/creat…
caldrian Jul 9, 2026
421f9b6
fix more build errors
caldrian Jul 9, 2026
5731f77
Merge branch 'develop' of github.com:wireapp/wire-ios into feat/creat…
caldrian Jul 9, 2026
00e5d74
renaming
caldrian Jul 9, 2026
7468fb7
refactoring
caldrian Jul 9, 2026
ca897e5
Merge branch 'develop' of github.com:wireapp/wire-ios into feat/creat…
caldrian Jul 9, 2026
b80f8d0
Merge branch 'develop' of github.com:wireapp/wire-ios into feat/suppo…
caldrian Jul 9, 2026
898bbb1
WireMeetingsFactoryTests
caldrian Jul 9, 2026
c883832
undo change
caldrian Jul 9, 2026
bd5873b
format code
caldrian Jul 9, 2026
e2c0d29
import changes
caldrian Jul 9, 2026
0b61b24
Merge branch 'chore/prevent-name-collisions-WPB-25676' into feat/crea…
caldrian Jul 9, 2026
680b51b
resolve TODO, restore WireCallingData
caldrian Jul 9, 2026
3fb4d45
Potential fix for pull request finding
caldrian Jul 9, 2026
d3a606b
Potential fix for pull request finding
caldrian Jul 9, 2026
effb0dc
move files into WireCallingData
caldrian Jul 9, 2026
70743d2
Merge branch 'develop' of github.com:wireapp/wire-ios into chore/prev…
caldrian Jul 9, 2026
9416923
Merge branch 'chore/prevent-name-collisions-WPB-25676' of github.com:…
caldrian Jul 9, 2026
221111c
Revert "Potential fix for pull request finding"
caldrian Jul 9, 2026
6a8ab1c
Merge branch 'chore/prevent-name-collisions-WPB-25676' into feat/crea…
caldrian Jul 9, 2026
ea319b8
add todo
caldrian Jul 9, 2026
6e78dd0
Merge branch 'chore/prevent-name-collisions-WPB-25676' into feat/supp…
caldrian Jul 9, 2026
3c31b8d
Merge branch 'feat/support-meeting-events-WPB-26733' into feat/create…
caldrian Jul 9, 2026
6034dae
remove todo
caldrian Jul 9, 2026
763e2f4
trigger CI
caldrian Jul 9, 2026
62c4132
Merge branch 'feat/create-update-list-meetings-WPB-25676' into feat/d…
caldrian Jul 9, 2026
96c3c6f
add observation
caldrian Jul 9, 2026
637243f
move AsyncBroadcaster
caldrian Jul 9, 2026
1d5064e
generic
caldrian Jul 9, 2026
6ba3034
rename to AsyncMulticaster
caldrian Jul 9, 2026
413f22f
revert change
caldrian Jul 9, 2026
a038f4b
move changes out
caldrian Jul 9, 2026
a77342f
move all changes out
caldrian Jul 9, 2026
296cb19
fix build error
caldrian Jul 9, 2026
1177d38
Merge commit 'd86d63e8788223d32a03f92aebe35a1a70377361' into chore/pr…
caldrian Jul 9, 2026
02f2a41
Merge branch 'develop' of github.com:wireapp/wire-ios into chore/prev…
caldrian Jul 9, 2026
e381d2e
Merge branch 'chore/prevent-name-collisions-WPB-25676' into feat/crea…
caldrian Jul 9, 2026
1f7f111
Merge branch 'feat/create-update-list-meetings-WPB-25676' into feat/d…
caldrian Jul 9, 2026
401d50f
format code
caldrian Jul 9, 2026
6536f9f
Merge branch 'develop' of github.com:wireapp/wire-ios into feat/creat…
caldrian Jul 10, 2026
3348d0b
new model version
caldrian Jul 10, 2026
b054311
sync meetings
caldrian Jul 10, 2026
dc6e5d8
Merge branch 'feat/create-update-list-meetings-WPB-25676' into feat/d…
caldrian Jul 10, 2026
8af866c
update data model
caldrian Jul 10, 2026
93e7e3a
import changes
caldrian Jul 10, 2026
4d57b47
Merge branch 'chore/sync-meetings-WPB-20274' into feat/create-update-…
caldrian Jul 10, 2026
f05a46f
format code
caldrian Jul 10, 2026
b15ad20
Merge branch 'chore/sync-meetings-WPB-20274' into feat/create-update-…
caldrian Jul 10, 2026
3a8612d
move code around
caldrian Jul 10, 2026
ceed692
move code around
caldrian Jul 10, 2026
374e8a3
Merge branch 'chore/sync-meetings-WPB-20274' into feat/create-update-…
caldrian Jul 10, 2026
2ee3083
fix issues
caldrian Jul 10, 2026
ddbae23
fix issues
caldrian Jul 10, 2026
f01e34c
Merge branch 'chore/sync-meetings-WPB-20274' into feat/create-update-…
caldrian Jul 10, 2026
8e42c6e
format code
caldrian Jul 10, 2026
82c9768
Merge branch 'chore/sync-meetings-WPB-20274' into feat/create-update-…
caldrian Jul 10, 2026
7a80a12
Merge branch 'feat/create-update-list-meetings-WPB-25676' into feat/d…
caldrian Jul 10, 2026
6e60971
fix warnings
caldrian Jul 10, 2026
d8091f9
Merge branch 'chore/sync-meetings-WPB-20274' into feat/create-update-…
caldrian Jul 10, 2026
ea03f1e
chore: sync meetings - WPB-20274 (#4999)
caldrian Jul 10, 2026
dcfbc36
Merge branch 'chore/sync-meetings-WPB-20274' of github.com:wireapp/wi…
caldrian Jul 10, 2026
5f04c16
Merge branch 'chore/sync-meetings-WPB-20274' into feat/create-update-…
caldrian Jul 10, 2026
e301ff4
fix warning
caldrian Jul 10, 2026
8cb44aa
Merge branch 'feat/create-update-list-meetings-WPB-25676' into feat/d…
caldrian Jul 10, 2026
8a3b614
add comment
caldrian Jul 10, 2026
1ea14e2
temporarily remove tests
caldrian Jul 10, 2026
8f46d01
fix bug
caldrian Jul 10, 2026
7e6bac9
Merge branch 'develop' of github.com:wireapp/wire-ios into chore/sync…
caldrian Jul 10, 2026
b10ea87
add more linking
caldrian Jul 10, 2026
9339465
undo project changes
caldrian Jul 10, 2026
263de9a
workaround
caldrian Jul 10, 2026
36b2464
format
caldrian Jul 10, 2026
10d3b5c
Merge branch 'chore/sync-meetings-WPB-20274' into feat/create-update-…
caldrian Jul 10, 2026
0bf5ae9
format
caldrian Jul 10, 2026
25a1839
Merge branch 'chore/sync-meetings-WPB-20274' into feat/create-update-…
caldrian Jul 10, 2026
38362b4
Merge branch 'feat/create-update-list-meetings-WPB-25676' into feat/d…
caldrian Jul 10, 2026
3b7c460
fix base class
caldrian Jul 10, 2026
7749f4b
Merge branch 'chore/sync-meetings-WPB-20274' into feat/create-update-…
caldrian Jul 10, 2026
f242277
fix build error
caldrian Jul 10, 2026
4017308
Merge branch 'chore/sync-meetings-WPB-20274' into feat/create-update-…
caldrian Jul 10, 2026
59a9d68
Merge branch 'feat/create-update-list-meetings-WPB-25676' into feat/d…
caldrian Jul 10, 2026
2090937
Potential fix for pull request finding
caldrian Jul 10, 2026
b107b92
add comment
caldrian Jul 10, 2026
95c8f65
Merge branch 'chore/sync-meetings-WPB-20274' into feat/create-update-…
caldrian Jul 10, 2026
ee43e54
Merge branch 'feat/create-update-list-meetings-WPB-25676' of github.c…
caldrian Jul 10, 2026
b9c6a64
break comment
caldrian Jul 10, 2026
613d2c2
Merge branch 'chore/sync-meetings-WPB-20274' into feat/create-update-…
caldrian Jul 10, 2026
7622c82
address pr comments
caldrian Jul 10, 2026
8d5e0d6
chore: sync meetings - WPB-20274 (#4999)
caldrian Jul 10, 2026
82b53e1
Merge remote-tracking branch 'github/gh-readonly-queue/develop/pr-499…
caldrian Jul 10, 2026
fbdf4f5
Merge branch 'chore/sync-meetings-WPB-20274' into feat/create-update-…
caldrian Jul 10, 2026
df983f1
Merge branch 'feat/create-update-list-meetings-WPB-25676' into feat/d…
caldrian Jul 10, 2026
6c3fc11
Merge branch 'develop' of github.com:wireapp/wire-ios into chore/sync…
caldrian Jul 10, 2026
aa67b3f
Merge branch 'chore/sync-meetings-WPB-20274' into feat/create-update-…
caldrian Jul 10, 2026
539616c
Merge branch 'feat/create-update-list-meetings-WPB-25676' into feat/d…
caldrian Jul 10, 2026
9a18090
chore: load list of meetings from DB - WPB-25676 (#4896)
caldrian Jul 10, 2026
4f1a1b9
Merge remote-tracking branch 'github/gh-readonly-queue/develop/pr-489…
caldrian Jul 10, 2026
c0373f4
Merge branch 'feat/create-update-list-meetings-WPB-25676' into feat/d…
caldrian Jul 10, 2026
42aecbe
fix build errors
caldrian Jul 10, 2026
a5728bd
implement deleteMeeting
caldrian Jul 10, 2026
6ffa588
minor improvement
caldrian Jul 10, 2026
ee841d8
rename argument labels
caldrian Jul 10, 2026
47b97c1
fix listing meeting after create
caldrian Jul 10, 2026
94ff81e
format code
caldrian Jul 10, 2026
4d1658c
Merge branch 'feat/create-update-list-meetings-WPB-25676' into feat/d…
caldrian Jul 10, 2026
e6a093c
ask for delete confirmation
caldrian Jul 10, 2026
8d696f0
refactoring
caldrian Jul 10, 2026
7942f13
fix filtering meetings
caldrian Jul 10, 2026
89e3bd5
mock
caldrian Jul 10, 2026
b2080cd
refactoring
caldrian Jul 10, 2026
829476e
Merge branch 'feat/create-update-list-meetings-WPB-25676' into feat/d…
caldrian Jul 10, 2026
1c61b9c
fix tests
caldrian Jul 11, 2026
78196a6
Merge branch 'feat/create-update-list-meetings-WPB-25676' into feat/d…
caldrian Jul 11, 2026
9a97dae
Merge branch 'develop' of github.com:wireapp/wire-ios into feat/creat…
caldrian Jul 11, 2026
aeaa2b4
Merge branch 'feat/create-update-list-meetings-WPB-25676' into feat/d…
caldrian Jul 11, 2026
b9657b8
minor code style
caldrian Jul 11, 2026
a778491
undo changes
caldrian Jul 11, 2026
53d7b4b
fix tests
caldrian Jul 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,13 @@ public struct WireMeetingsFactory {
currentDateProvider: .system
)
let observeMeetingChangesUseCase = ObserveMeetingChangesUseCase(repository: meetingRepository)
let deleteMeetingUseCase = DeleteMeetingUseCase(repository: meetingRepository)
let searchMembersUseCase = SearchMembersUseCase(repository: memberRepository)
let meetingsViewModel = AllMeetingsViewModel(
currentDateProvider: .system,
upcomingMeetingsUseCase: fetchUpcomingMeetingsUseCase,
observeMeetingChangesUseCase: observeMeetingChangesUseCase,
deleteMeetingUseCase: deleteMeetingUseCase,
makeFormViewModel: { mode, onSuccess in
CreateMeetingFormViewModel(
mode: mode,
Expand Down
11 changes: 11 additions & 0 deletions WireCalling/Sources/WireCallingData/MeetingRepository.swift
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,17 @@ public final class MeetingRepository: MeetingRepositoryProtocol {
changeBroadcaster.broadcast()
}

public func deleteMeeting(id: QualifiedID) async throws {
do {
try await meetingsAPI.deleteMeeting(id: id)
} catch MeetingsAPIError.meetingNotFound {
// The meeting is already gone from the backend,
// so only the local copy is left to delete.
}
await localStore.deleteMeeting(id: id)
changeBroadcaster.broadcast()
}

public func fetchMeetings(in range: Range<Date>, offset: Int, limit: Int) async throws -> [Meeting] {
try await refreshStoredMeetings()

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
//
// Wire
// Copyright (C) 2026 Wire Swiss GmbH
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see http://www.gnu.org/licenses/.
//

import Foundation

// sourcery: AutoMockable
/// Deletes a meeting by its ID.
package protocol DeleteMeetingUseCaseProtocol: Sendable {

func invoke(meetingID: QualifiedID) async throws

}
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,12 @@ public protocol MeetingRepositoryProtocol: Sendable {

func deleteLocalMeeting(id: QualifiedID) async

/// Deletes a meeting on the server and removes the locally stored copy.
///
/// - Parameter id: The qualified id of the meeting to delete.

func deleteMeeting(id: QualifiedID) async throws

/// Fetches stored meetings whose start date lies in the given range,
/// refreshing the local store from the backend first.
///
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
//
// Wire
// Copyright (C) 2026 Wire Swiss GmbH
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see http://www.gnu.org/licenses/.
//

package struct DeleteMeetingUseCase: DeleteMeetingUseCaseProtocol {

private let repository: any MeetingRepositoryProtocol

package init(repository: any MeetingRepositoryProtocol) {
self.repository = repository
}

package func invoke(meetingID: QualifiedID) async throws {
try await repository.deleteMeeting(id: meetingID)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@
"wireMeetings.list.delete.alert.subtitle" = "The meeting will be deleted for you and everybody else. All participants will be notified.";
"wireMeetings.list.delete.alert.delete.button" = "Delete";
"wireMeetings.list.delete.alert.cancel.button" = "Cancel";
"wireMeetings.list.delete.error.alert.title" = "Something went wrong";
"wireMeetings.list.delete.error.alert.ok" = "OK";

// MARK: - Schedule a meeting

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ package final class AllMeetingsViewModel {
formatter: MeetingsFormatter = MeetingsFormatter(),
upcomingMeetingsUseCase: any FetchUpcomingMeetingsUseCaseProtocol,
observeMeetingChangesUseCase: any ObserveMeetingChangesUseCaseProtocol,
deleteMeetingUseCase: any DeleteMeetingUseCaseProtocol,
makeFormViewModel: @escaping @MainActor (
_ mode: CreateMeetingFormViewModel.Mode,
_ onSuccess: @escaping (Meeting) -> Void
Expand All @@ -51,7 +52,8 @@ package final class AllMeetingsViewModel {
currentDateProvider: currentDateProvider,
formatter: formatter,
upcomingMeetingsUseCase: upcomingMeetingsUseCase,
observeMeetingChangesUseCase: observeMeetingChangesUseCase
observeMeetingChangesUseCase: observeMeetingChangesUseCase,
deleteMeetingUseCase: deleteMeetingUseCase
)
self.makeFormViewModel = makeFormViewModel
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,12 @@
}
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top)
.background(ColorTheme.Backgrounds.surface.color)
.alert(
Strings.Delete.Error.Alert.title,
isPresented: $viewModel.hasDeleteError
) {
Button(Strings.Delete.Error.Alert.ok, role: .cancel) {}
}
.task {
await viewModel.loadInitialData()
}
Expand Down Expand Up @@ -67,9 +73,7 @@
onEdit: { _ in
// TODO: [WPB-25501] Implement UI
},
onDelete: { _ in
// TODO: [WPB-25514] Implement UI
}
onDelete: { viewModel.meetingToDelete = $0 }
)

if viewModel.hasMore {
Expand All @@ -88,6 +92,17 @@
.refreshable {
await viewModel.loadInitialData()
}
.alert(
Strings.Delete.Alert.title,
isPresented: $viewModel.isDeleteConfirmationPresented
) {
Button(Strings.Delete.Alert.Delete.button, role: .destructive) {
viewModel.confirmDelete()
}
Button(Strings.Delete.Alert.Cancel.button, role: .cancel) {}
} message: {
Text(Strings.Delete.Alert.subtitle)
}
}

}
Expand Down Expand Up @@ -132,7 +147,8 @@
currentDateProvider: .system,
formatter: MeetingsFormatter(),
upcomingMeetingsUseCase: PreviewFetchUpcomingMeetingsUseCase(),
observeMeetingChangesUseCase: PreviewObserveMeetingChangesUseCase()
observeMeetingChangesUseCase: PreviewObserveMeetingChangesUseCase(),
deleteMeetingUseCase: PreviewDeleteMeetingUseCase()
)
)
}
Expand All @@ -143,7 +159,8 @@
currentDateProvider: .system,
formatter: MeetingsFormatter(),
upcomingMeetingsUseCase: PreviewFetchUpcomingMeetingsUseCase(meetings: previewMeetings()),
observeMeetingChangesUseCase: PreviewObserveMeetingChangesUseCase()
observeMeetingChangesUseCase: PreviewObserveMeetingChangesUseCase(),
deleteMeetingUseCase: PreviewDeleteMeetingUseCase()
)
)
}
Expand All @@ -166,6 +183,12 @@

}

private struct PreviewDeleteMeetingUseCase: DeleteMeetingUseCaseProtocol {

func invoke(meetingID: QualifiedID) async throws {}

Check warning on line 188 in WireCalling/Sources/WireCallingUI/Views/WireMeetings/MeetingsView/MeetingsView.swift

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Remove the unused function parameter "meetingID" or name it "_".

See more on https://sonarcloud.io/project/issues?id=wireapp_wire-ios&issues=AZ742_OEVVQ7FuP0zYyN&open=AZ742_OEVVQ7FuP0zYyN&pullRequest=4883

}

private func previewMeetings() -> [Meeting] {
let calendar = Calendar.current
let now = Date()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,21 @@ package final class MeetingsViewModel {

private(set) var loadedMeetings: [Meeting] = []
private(set) var hasMore: Bool = false
var hasDeleteError = false

/// The meeting awaiting delete confirmation, or `nil` if no confirmation is in progress.
var meetingToDelete: Meeting?

var isDeleteConfirmationPresented: Bool {
get { meetingToDelete != nil }
set { if !newValue { meetingToDelete = nil } }
}

private let formatter: MeetingsFormatter
private let currentDateProvider: any CurrentDateProviding
private let upcomingMeetingsUseCase: any FetchUpcomingMeetingsUseCaseProtocol
private let observeMeetingChangesUseCase: any ObserveMeetingChangesUseCaseProtocol
private let deleteMeetingUseCase: any DeleteMeetingUseCaseProtocol

private var futureOffset: Int = 0
private let initialPageSize: Int = 10
Expand All @@ -47,12 +57,14 @@ package final class MeetingsViewModel {
currentDateProvider: any CurrentDateProviding,
formatter: MeetingsFormatter = MeetingsFormatter(),
upcomingMeetingsUseCase: any FetchUpcomingMeetingsUseCaseProtocol,
observeMeetingChangesUseCase: any ObserveMeetingChangesUseCaseProtocol
observeMeetingChangesUseCase: any ObserveMeetingChangesUseCaseProtocol,
deleteMeetingUseCase: any DeleteMeetingUseCaseProtocol
) {
self.currentDateProvider = currentDateProvider
self.formatter = formatter
self.upcomingMeetingsUseCase = upcomingMeetingsUseCase
self.observeMeetingChangesUseCase = observeMeetingChangesUseCase
self.deleteMeetingUseCase = deleteMeetingUseCase
}

// MARK: - Public Interface
Expand Down Expand Up @@ -89,6 +101,26 @@ package final class MeetingsViewModel {
formatter.timeRange(from: meeting.start, to: meeting.end)
}

/// Deletes the meeting awaiting confirmation. Synchronous on purpose: it must capture
/// `meetingToDelete` before the alert dismissal clears it via `isDeleteConfirmationPresented`.
func confirmDelete() {
guard let meeting = meetingToDelete else { return }
meetingToDelete = nil
Task {
await deleteMeeting(meeting)
}
}

func deleteMeeting(_ meeting: Meeting) async {
do {
try await deleteMeetingUseCase.invoke(meetingID: meeting.id)
loadedMeetings.removeAll { $0.id == meeting.id }
} catch {
hasDeleteError = true
WireLogger.meetings.error("failed to delete meeting: \(String(reflecting: error))")
}
}

// MARK: - Private Methods

/// Re-fetches everything that is currently loaded in a single page, because a
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,53 @@ struct MeetingRepositoryTests {
#expect(localStore.deleteMeetingIdQualifiedIDVoidReceivedInvocations == [Scaffolding.meetingID])
}

// MARK: - deleteMeeting

@Test
func deleteMeetingDeletesMeetingViaAPIAndFromLocalStore() async throws {
// Mock

meetingsAPI.deleteMeetingId_MockMethod = { _ in }

// When

try await sut.deleteMeeting(id: Scaffolding.meetingID)

// Then

#expect(meetingsAPI.deleteMeetingId_Invocations == [Scaffolding.meetingID])
#expect(localStore.deleteMeetingIdQualifiedIDVoidReceivedInvocations == [Scaffolding.meetingID])
}

@Test
func deleteMeetingDeletesLocalCopyWhenMeetingIsAlreadyGoneFromBackend() async throws {
// Mock

meetingsAPI.deleteMeetingId_MockError = MeetingsAPIError.meetingNotFound

// When

try await sut.deleteMeeting(id: Scaffolding.meetingID)

// Then

#expect(localStore.deleteMeetingIdQualifiedIDVoidReceivedInvocations == [Scaffolding.meetingID])
}

@Test
func deleteMeetingThrowsAndKeepsLocalCopyWhenDeletingFails() async {
// Mock

meetingsAPI.deleteMeetingId_MockError = MeetingsAPIError.accessDenied

// When / Then

await #expect(throws: (any Error).self) {
try await sut.deleteMeeting(id: Scaffolding.meetingID)
}
#expect(localStore.deleteMeetingIdQualifiedIDVoidReceivedInvocations.isEmpty)
}

// MARK: - observeMeetingChanges

@Test
Expand Down Expand Up @@ -210,6 +257,22 @@ struct MeetingRepositoryTests {
#expect(await changes.next() != nil)
}

@Test
func deleteMeetingBroadcastsMeetingChange() async throws {
// Mock

meetingsAPI.deleteMeetingId_MockMethod = { _ in }
var changes = sut.observeMeetingChanges().makeAsyncIterator()

// When

try await sut.deleteMeeting(id: Scaffolding.meetingID)

// Then

#expect(await changes.next() != nil)
}

@Test
func createMeetingBroadcastsMeetingChange() async throws {
// Mock
Expand Down
Loading
Loading