-
Notifications
You must be signed in to change notification settings - Fork 89
/
Router.swift
89 lines (68 loc) · 2.25 KB
/
Router.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
//
// Router.swift
// iosApp
//
// Created by Daniele Baroncelli on 04/05/21.
// Copyright © 2021 orgName. All rights reserved.
//
import SwiftUI
import shared
let twopaneWidthThreshold : CGFloat = 1000
func isTwoPane() -> Bool {
let width = UIScreen.main.bounds.width
let height = UIScreen.main.bounds.height
if width < height || width < twopaneWidthThreshold {
return false
}
return true
}
extension Navigation {
@ViewBuilder func router() -> some View {
ZStack {
if !isTwoPane() {
ForEach(self.statefulBackstack, id: \.self.index) { entry in
self.onePane(entry.screenIdentifier)
}
} else {
self.twoPane()
}
}
.navigationViewStyle(StackNavigationViewStyle())
.gesture(
DragGesture(minimumDistance: 20, coordinateSpace: .local).onEnded({ value in
if value.translation.width > 0 { // RIGHT SWIPE
if (!self.only1ScreenInBackstack) { self.exitScreen() }
}
})
)
.navigationBarColor(backgroundUIColor: UIColor(customBgColor), tintUIColor: .white)
.toolbarColor(backgroundUIColor: UIColor(customBgColor), tintUIColor: .white)
}
@ViewBuilder func backButton() -> some View {
if (!only1ScreenInBackstack) {
Button(action: { withAnimation { self.exitScreen() } } ) {
HStack {
Image(systemName: "chevron.left")
Text("Back")
}.foregroundColor(linkColor)
}
}
}
func navigate(_ screen: Screen, _ params: ScreenParams?) { // just to remove named parameters
navigate(screen: screen, params: params)
}
}
struct NavigationLink<Content: View>: View {
var linkFunction: () -> Void
let content: () -> Content
var body: some View {
Button(action: { linkFunction() }) {
VStack(spacing: 0) {
HStack(spacing: 0) {
content()
Image(systemName: "chevron.right").resizable().frame(width: 6, height: 12).foregroundColor(lightGreyColor)
}
}
}
}
}