Skip to content

Instantly share code, notes, and snippets.

@damodarnamala
Created November 10, 2021 13:41
Show Gist options
  • Save damodarnamala/356a7def9171b3bd8d353506038246e8 to your computer and use it in GitHub Desktop.
Save damodarnamala/356a7def9171b3bd8d353506038246e8 to your computer and use it in GitHub Desktop.
struct ContentView: View {
@State var loginPresented = false
@State var activeSheet: ActiveSheet?
@State var loginConfig = LoginView.Configuration()
enum ActiveSheet {
case home, dashboard
}
var body: some View {
prepareLogin()
.sheet(isPresented: $loginPresented) {
if let sheet = activeSheet {
switch sheet {
case .home:
HomeView(config: loginConfig)
case .dashboard:
Text("Dashboard")
}
}
}
}
func prepareLogin() -> some View {
DispatchQueue.main.async {
loginConfig.router.onLogin = {
activeSheet = .home
loginPresented.toggle()
}
loginConfig.router.gotoHome = {
activeSheet = .dashboard
loginPresented = true
}
loginConfig.design.strings.loginTitle = "Signin"
}
let veiw = LoginView(config: loginConfig)
return veiw
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
struct LoginView: View {
var config: Configuration
var body: some View {
VStack(alignment: .center, spacing: 32){
Button(config.design.strings.loginTitle) {
config.router.onLogin?()
}
}
}
}
extension LoginView {
struct Configuration {
var router = Router()
var design = Design()
struct Router {
var onLogin: (() -> (Void))?
var gotoHome: (() -> (Void))?
}
struct Design {
var strings = Strings()
struct Strings {
var loginTitle = "Login"
}
}
}
}
struct HomeView: View {
let config: LoginView.Configuration
var body: some View {
VStack {
Text("Hello, HomeView!")
.padding()
Button("Goto Home ") {
config.router.gotoHome?()
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment