Skip to content

Commit 18f53ba

Browse files
change api of modals: calculate model with item
1 parent c04f440 commit 18f53ba

File tree

4 files changed

+26
-20
lines changed

4 files changed

+26
-20
lines changed

Sources/ComponentsKit/Components/Modal/SwiftUI/Helpers/ModalPresentationModifier.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ struct ModalPresentationModifier<Modal: View>: ViewModifier {
2828
self.isPresented = true
2929
}
3030
}
31-
.onChange(of: self.isContentVisible) { newValue in
32-
if newValue {
31+
.onChange(of: self.isContentVisible) { isVisible in
32+
if isVisible {
3333
self.isPresented = true
3434
} else {
3535
DispatchQueue.main.asyncAfter(deadline: .now() + self.transitionDuration) {

Sources/ComponentsKit/Components/Modal/SwiftUI/Helpers/ModalPresentationWithItemModifier.swift

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ struct ModalPresentationWithItemModifier<Modal: View, Item: Identifiable>: ViewM
66

77
@ViewBuilder var content: (Item) -> Modal
88

9-
let transitionDuration: TimeInterval
9+
let transitionDuration: (Item) -> TimeInterval
1010
let onDismiss: (() -> Void)?
1111

1212
init(
1313
item: Binding<Item?>,
14-
transitionDuration: TimeInterval,
14+
transitionDuration: @escaping (Item) -> TimeInterval,
1515
onDismiss: (() -> Void)?,
1616
@ViewBuilder content: @escaping (Item) -> Modal
1717
) {
@@ -23,11 +23,17 @@ struct ModalPresentationWithItemModifier<Modal: View, Item: Identifiable>: ViewM
2323

2424
func body(content: Content) -> some View {
2525
content
26-
.onChange(of: self.visibleItem.isNotNil) { newValue in
27-
if newValue {
26+
.onAppear {
27+
self.presentedItem = self.visibleItem
28+
}
29+
.onChange(of: self.visibleItem.isNotNil) { isVisible in
30+
if isVisible {
2831
self.presentedItem = self.visibleItem
2932
} else {
30-
DispatchQueue.main.asyncAfter(deadline: .now() + self.transitionDuration) {
33+
let duration = self.presentedItem.map { item in
34+
self.transitionDuration(item)
35+
} ?? 0.3
36+
DispatchQueue.main.asyncAfter(deadline: .now() + duration) {
3137
self.presentedItem = self.visibleItem
3238
}
3339
}
@@ -49,7 +55,7 @@ struct ModalPresentationWithItemModifier<Modal: View, Item: Identifiable>: ViewM
4955
extension View {
5056
func modal<Modal: View, Item: Identifiable>(
5157
item: Binding<Item?>,
52-
transitionDuration: TimeInterval,
58+
transitionDuration: @escaping (Item) -> TimeInterval,
5359
onDismiss: (() -> Void)? = nil,
5460
@ViewBuilder content: @escaping (Item) -> Modal
5561
) -> some View {

Sources/ComponentsKit/Components/Modal/SwiftUI/SUBottomModal.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ extension View {
195195
/// }
196196
/// .bottomModal(
197197
/// item: $selectedItem,
198-
/// model: BottomModalVM(),
198+
/// model: { _ in BottomModalVM() },
199199
/// onDismiss: {
200200
/// print("Modal dismissed")
201201
/// },
@@ -218,15 +218,15 @@ extension View {
218218
/// ```
219219
public func bottomModal<Item: Identifiable, Header: View, Body: View, Footer: View>(
220220
item: Binding<Item?>,
221-
model: BottomModalVM = .init(),
221+
model: @escaping (Item) -> BottomModalVM = { _ in .init() },
222222
onDismiss: (() -> Void)? = nil,
223223
@ViewBuilder header: @escaping (Item) -> Header,
224224
@ViewBuilder body: @escaping (Item) -> Body,
225225
@ViewBuilder footer: @escaping (Item) -> Footer
226226
) -> some View {
227227
return self.modal(
228228
item: item,
229-
transitionDuration: model.transition.value,
229+
transitionDuration: { model($0).transition.value },
230230
onDismiss: onDismiss,
231231
content: { unwrappedItem in
232232
SUBottomModal(
@@ -242,7 +242,7 @@ extension View {
242242
}
243243
}
244244
),
245-
model: model,
245+
model: model(unwrappedItem),
246246
header: { header(unwrappedItem) },
247247
body: { body(unwrappedItem) },
248248
footer: { footer(unwrappedItem) }
@@ -289,7 +289,7 @@ extension View {
289289
/// }
290290
/// .bottomModal(
291291
/// item: $selectedItem,
292-
/// model: BottomModalVM(),
292+
/// model: { _ in BottomModalVM() },
293293
/// onDismiss: {
294294
/// print("Modal dismissed")
295295
/// },
@@ -302,7 +302,7 @@ extension View {
302302
/// ```
303303
public func bottomModal<Item: Identifiable, Body: View>(
304304
item: Binding<Item?>,
305-
model: BottomModalVM = .init(),
305+
model: @escaping (Item) -> BottomModalVM = { _ in .init() },
306306
onDismiss: (() -> Void)? = nil,
307307
@ViewBuilder body: @escaping (Item) -> Body
308308
) -> some View {

Sources/ComponentsKit/Components/Modal/SwiftUI/SUCenterModal.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ extension View {
157157
/// }
158158
/// .centerModal(
159159
/// item: $selectedItem,
160-
/// model: CenterModalVM(),
160+
/// model: { _ in CenterModalVM() },
161161
/// onDismiss: {
162162
/// print("Modal dismissed")
163163
/// },
@@ -180,15 +180,15 @@ extension View {
180180
/// ```
181181
public func centerModal<Item: Identifiable, Header: View, Body: View, Footer: View>(
182182
item: Binding<Item?>,
183-
model: CenterModalVM = .init(),
183+
model: @escaping (Item) -> CenterModalVM = { _ in .init() },
184184
onDismiss: (() -> Void)? = nil,
185185
@ViewBuilder header: @escaping (Item) -> Header,
186186
@ViewBuilder body: @escaping (Item) -> Body,
187187
@ViewBuilder footer: @escaping (Item) -> Footer
188188
) -> some View {
189189
return self.modal(
190190
item: item,
191-
transitionDuration: model.transition.value,
191+
transitionDuration: { model($0).transition.value },
192192
onDismiss: onDismiss,
193193
content: { unwrappedItem in
194194
SUCenterModal(
@@ -204,7 +204,7 @@ extension View {
204204
}
205205
}
206206
),
207-
model: model,
207+
model: model(unwrappedItem),
208208
header: { header(unwrappedItem) },
209209
body: { body(unwrappedItem) },
210210
footer: { footer(unwrappedItem) }
@@ -251,7 +251,7 @@ extension View {
251251
/// }
252252
/// .centerModal(
253253
/// item: $selectedItem,
254-
/// model: CenterModalVM(),
254+
/// model: { _ in CenterModalVM() },
255255
/// onDismiss: {
256256
/// print("Modal dismissed")
257257
/// },
@@ -264,7 +264,7 @@ extension View {
264264
/// ```
265265
public func centerModal<Item: Identifiable, Body: View>(
266266
item: Binding<Item?>,
267-
model: CenterModalVM = .init(),
267+
model: @escaping (Item) -> CenterModalVM = { _ in .init() },
268268
onDismiss: (() -> Void)? = nil,
269269
@ViewBuilder body: @escaping (Item) -> Body
270270
) -> some View {

0 commit comments

Comments
 (0)