Skip to content

Commit

Permalink
Merge sheet and fullscreen cover functions
Browse files Browse the repository at this point in the history
  • Loading branch information
Šimon Šesták committed Aug 7, 2024
1 parent 24ccf4f commit 38d1d8a
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 53 deletions.
52 changes: 14 additions & 38 deletions Sources/FuturedArchitecture/Architecture/Coordinator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,55 +15,31 @@ public protocol Coordinator: ObservableObject {

@ViewBuilder
func scene(for destination: Destination) -> DestinationViews
func onSheetDismiss()
#if !os(macOS)
func onFullscreenCoverDismiss()
#endif
func onModalDismiss()
}

public extension Coordinator {
func present(sheet: Destination) {
Task { @MainActor in
self.sheet = sheet
}
}

func dismissSheet() {
Task { @MainActor in
self.sheet = nil
}
}

func onSheetDismiss() {}

var sheet: Destination? {
get { modalCover?.style == .sheet ? modalCover?.destination : nil }
set { modalCover = newValue.map { ModalCoverModel(destination: $0, style: .sheet) } }
}

var fullscreenCover: Destination? {
get { modalCover?.style == .fullscreenCover ? modalCover?.destination : nil }
set { modalCover = newValue.map { ModalCoverModel(destination: $0, style: .fullscreenCover) } }
}
}

#if !os(macOS)
public extension Coordinator {
func present(fullscreenCover: Destination) {
Task { @MainActor in
self.fullscreenCover = fullscreenCover
func present(modal destination: Destination, type: ModalCoverModel<Destination>.Style) {
switch type {
case .sheet:
Task { @MainActor in
self.modalCover = .init(destination: destination, style: .sheet)
}
case .fullscreenCover:
Task { @MainActor in
self.modalCover = .init(destination: destination, style: .fullscreenCover)
}
}
}

func dismissFullscreenCover() {
func dismissModal() {
Task { @MainActor in
self.fullscreenCover = nil
self.modalCover = nil
}
}

func onFullscreenCoverDismiss() {}
func onModalDismiss() {}
}
#endif

public protocol TabCoordinator: Coordinator {
associatedtype Tab: Hashable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,11 @@ public struct ModalCoverModel<Destination: Hashable & Identifiable>: Identifiabl
let destination: Destination
let style: Style

enum Style {
public enum Style {
case sheet
#if !os(macOS)
case fullscreenCover
#endif
}

public var id: Destination.ID {
Expand Down
20 changes: 18 additions & 2 deletions Sources/FuturedArchitecture/Architecture/NavigationStackFlow.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,24 @@ public struct NavigationStackFlow<Coordinator: NavigationStackCoordinator, Conte
NavigationStack(path: $coordinator.path) {
content().navigationDestination(for: Coordinator.Destination.self, destination: coordinator.scene(for:))
}
.sheet(item: $coordinator.sheet, onDismiss: coordinator.onSheetDismiss, content: coordinator.scene(for:))
.fullScreenCover(item: $coordinator.fullscreenCover, onDismiss: coordinator.onFullscreenCoverDismiss, content: coordinator.scene(for:))
.sheet(item: sheetBinding, onDismiss: coordinator.onModalDismiss, content: coordinator.scene(for:))
.fullScreenCover(item: fullscreenCoverBinding, onDismiss: coordinator.onModalDismiss, content: coordinator.scene(for:))
}
#endif

private var sheetBinding: Binding<Coordinator.Destination?> {
.init {
coordinator.modalCover?.style == .sheet ? coordinator.modalCover?.destination : nil
} set: { destination in
coordinator.modalCover = destination.map { .init(destination: $0, style: .sheet) }
}
}

private var fullscreenCoverBinding: Binding<Coordinator.Destination?> {
.init {
coordinator.modalCover?.style == .fullscreenCover ? coordinator.modalCover?.destination : nil
} set: { destination in
coordinator.modalCover = destination.map { .init(destination: $0, style: .fullscreenCover) }
}
}
}
20 changes: 18 additions & 2 deletions Sources/FuturedArchitecture/Architecture/TabViewFlow.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,24 @@ public struct TabViewFlow<Coordinator: TabCoordinator, Content: View>: View {
TabView(selection: $coordinator.selectedTab) {
content()
}
.sheet(item: $coordinator.sheet, onDismiss: coordinator.onSheetDismiss, content: coordinator.scene(for:))
.fullScreenCover(item: $coordinator.fullscreenCover, onDismiss: coordinator.onFullscreenCoverDismiss, content: coordinator.scene(for:))
.sheet(item: sheetBinding, onDismiss: coordinator.onModalDismiss, content: coordinator.scene(for:))
.fullScreenCover(item: fullscreenCoverBinding, onDismiss: coordinator.onModalDismiss, content: coordinator.scene(for:))
}
#endif

private var sheetBinding: Binding<Coordinator.Destination?> {
.init {
coordinator.modalCover?.style == .sheet ? coordinator.modalCover?.destination : nil
} set: { destination in
coordinator.modalCover = destination.map { .init(destination: $0, style: .sheet) }
}
}

private var fullscreenCoverBinding: Binding<Coordinator.Destination?> {
.init {
coordinator.modalCover?.style == .fullscreenCover ? coordinator.modalCover?.destination : nil
} set: { destination in
coordinator.modalCover = destination.map { .init(destination: $0, style: .fullscreenCover) }
}
}
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,10 @@
// ___FILEHEADER___

import EnumIdentable
import FuturedArchitecture
import SwiftUI

final class ___VARIABLE_tabCoordinatorIdentifier___TabCoordinator: TabCoordinator {
enum Destination: String, Hashable, Identifiable {
case destination

var id: String {
rawValue
}
}

enum Tab {
case firstTab
case secondTab
Expand All @@ -20,8 +13,7 @@ final class ___VARIABLE_tabCoordinatorIdentifier___TabCoordinator: TabCoordinato
private let container: Container

@Published var selectedTab: Tab
@Published var sheet: Destination?
@Published var fullscreenCover: Destination?
@Published var modalCover: ModalCoverModel<Destination>?

init(container: Container, selectedTab: Tab) {
self.container = container
Expand Down Expand Up @@ -52,3 +44,10 @@ final class ___VARIABLE_tabCoordinatorIdentifier___TabCoordinator: TabCoordinato
}
}
}

extension ___VARIABLE_tabCoordinatorIdentifier___TabCoordinator {
@EnumIdentable
enum Destination: String, Hashable, Identifiable {
case destination
}
}

0 comments on commit 38d1d8a

Please sign in to comment.