Skip to content

Commit

Permalink
Merge pull request #11 from jtouzy/feature/breaking_bad_ios
Browse files Browse the repository at this point in the history
Refacto iOS app to Breaking Bad API
  • Loading branch information
StephaneBg authored Jan 27, 2020
2 parents e2675ba + 7dd4cf3 commit 5478423
Show file tree
Hide file tree
Showing 10 changed files with 115 additions and 76 deletions.
64 changes: 38 additions & 26 deletions Examples/DemoApp/iosApp/DemoApp.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,13 @@
53B6BF8A23D848B700A717C0 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53B6BF8823D848B700A717C0 /* LaunchScreen.storyboard */; };
53B6BFB223D854E500A717C0 /* shared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53B6BFB023D854DB00A717C0 /* shared.framework */; };
53B6BFB323D854E500A717C0 /* shared.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 53B6BFB023D854DB00A717C0 /* shared.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
53B6BFB623D8834100A717C0 /* MarvelCharactersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53B6BFB523D8834100A717C0 /* MarvelCharactersView.swift */; };
53B6BFB623D8834100A717C0 /* CharactersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53B6BFB523D8834100A717C0 /* CharactersView.swift */; };
53B6BFBB23D883CB00A717C0 /* ObservableStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53B6BFBA23D883CB00A717C0 /* ObservableStore.swift */; };
53B6BFBF23D8845E00A717C0 /* MarvelCharactersAssembler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53B6BFBE23D8845E00A717C0 /* MarvelCharactersAssembler.swift */; };
53FB5E0623DB121100704A2D /* String+extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53FB5E0523DB121100704A2D /* String+extension.swift */; };
53FB5E0923DB156500704A2D /* CharacterProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53FB5E0823DB156500704A2D /* CharacterProfileView.swift */; };
53FB5E0B23DB157000704A2D /* CharacterProfileAssembler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53FB5E0A23DB157000704A2D /* CharacterProfileAssembler.swift */; };
53B6BFBF23D8845E00A717C0 /* CharactersAssembler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53B6BFBE23D8845E00A717C0 /* CharactersAssembler.swift */; };
53C60EF423DF0766004537F8 /* ActivityIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53C60EF323DF0766004537F8 /* ActivityIndicator.swift */; };
53FB5E0623DB121100704A2D /* Character+extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53FB5E0523DB121100704A2D /* Character+extension.swift */; };
53FB5E0923DB156500704A2D /* CharacterQuotesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53FB5E0823DB156500704A2D /* CharacterQuotesView.swift */; };
53FB5E0B23DB157000704A2D /* CharacterQuotesAssembler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53FB5E0A23DB157000704A2D /* CharacterQuotesAssembler.swift */; };
/* End PBXBuildFile section */

/* Begin PBXCopyFilesBuildPhase section */
Expand All @@ -44,12 +45,13 @@
53B6BF8B23D848B700A717C0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
53B6BFAE23D84CEC00A717C0 /* buildKotlinFrameworks.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = buildKotlinFrameworks.sh; sourceTree = "<group>"; };
53B6BFB023D854DB00A717C0 /* shared.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = shared.framework; sourceTree = "<group>"; };
53B6BFB523D8834100A717C0 /* MarvelCharactersView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarvelCharactersView.swift; sourceTree = "<group>"; };
53B6BFB523D8834100A717C0 /* CharactersView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CharactersView.swift; sourceTree = "<group>"; };
53B6BFBA23D883CB00A717C0 /* ObservableStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ObservableStore.swift; sourceTree = "<group>"; };
53B6BFBE23D8845E00A717C0 /* MarvelCharactersAssembler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarvelCharactersAssembler.swift; sourceTree = "<group>"; };
53FB5E0523DB121100704A2D /* String+extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+extension.swift"; sourceTree = "<group>"; };
53FB5E0823DB156500704A2D /* CharacterProfileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CharacterProfileView.swift; sourceTree = "<group>"; };
53FB5E0A23DB157000704A2D /* CharacterProfileAssembler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CharacterProfileAssembler.swift; sourceTree = "<group>"; };
53B6BFBE23D8845E00A717C0 /* CharactersAssembler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CharactersAssembler.swift; sourceTree = "<group>"; };
53C60EF323DF0766004537F8 /* ActivityIndicator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityIndicator.swift; sourceTree = "<group>"; };
53FB5E0523DB121100704A2D /* Character+extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Character+extension.swift"; sourceTree = "<group>"; };
53FB5E0823DB156500704A2D /* CharacterQuotesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CharacterQuotesView.swift; sourceTree = "<group>"; };
53FB5E0A23DB157000704A2D /* CharacterQuotesAssembler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CharacterQuotesAssembler.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
Expand Down Expand Up @@ -90,6 +92,7 @@
53B6BF7F23D848B400A717C0 /* SceneDelegate.swift */,
53B6BF8323D848B700A717C0 /* Assets.xcassets */,
53B6BF8823D848B700A717C0 /* LaunchScreen.storyboard */,
53C60EF223DF0755004537F8 /* Components */,
53FB5E0423DB11DD00704A2D /* Extensions */,
53B6BFB923D883AB00A717C0 /* Modules */,
53B6BFB823D883A500A717C0 /* UI */,
Expand All @@ -105,13 +108,13 @@
path = Frameworks;
sourceTree = "<group>";
};
53B6BFB723D8834600A717C0 /* MarvelCharacters */ = {
53B6BFB723D8834600A717C0 /* Characters */ = {
isa = PBXGroup;
children = (
53B6BFB523D8834100A717C0 /* MarvelCharactersView.swift */,
53B6BFBE23D8845E00A717C0 /* MarvelCharactersAssembler.swift */,
53B6BFB523D8834100A717C0 /* CharactersView.swift */,
53B6BFBE23D8845E00A717C0 /* CharactersAssembler.swift */,
);
path = MarvelCharacters;
path = Characters;
sourceTree = "<group>";
};
53B6BFB823D883A500A717C0 /* UI */ = {
Expand All @@ -125,27 +128,35 @@
53B6BFB923D883AB00A717C0 /* Modules */ = {
isa = PBXGroup;
children = (
53FB5E0723DB154B00704A2D /* CharacterProfile */,
53B6BFB723D8834600A717C0 /* MarvelCharacters */,
53B6BFB723D8834600A717C0 /* Characters */,
53FB5E0723DB154B00704A2D /* CharacterQuotes */,
);
path = Modules;
sourceTree = "<group>";
};
53C60EF223DF0755004537F8 /* Components */ = {
isa = PBXGroup;
children = (
53C60EF323DF0766004537F8 /* ActivityIndicator.swift */,
);
path = Components;
sourceTree = "<group>";
};
53FB5E0423DB11DD00704A2D /* Extensions */ = {
isa = PBXGroup;
children = (
53FB5E0523DB121100704A2D /* String+extension.swift */,
53FB5E0523DB121100704A2D /* Character+extension.swift */,
);
path = Extensions;
sourceTree = "<group>";
};
53FB5E0723DB154B00704A2D /* CharacterProfile */ = {
53FB5E0723DB154B00704A2D /* CharacterQuotes */ = {
isa = PBXGroup;
children = (
53FB5E0823DB156500704A2D /* CharacterProfileView.swift */,
53FB5E0A23DB157000704A2D /* CharacterProfileAssembler.swift */,
53FB5E0823DB156500704A2D /* CharacterQuotesView.swift */,
53FB5E0A23DB157000704A2D /* CharacterQuotesAssembler.swift */,
);
path = CharacterProfile;
path = CharacterQuotes;
sourceTree = "<group>";
};
/* End PBXGroup section */
Expand Down Expand Up @@ -241,14 +252,15 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
53B6BFBF23D8845E00A717C0 /* MarvelCharactersAssembler.swift in Sources */,
53B6BFBF23D8845E00A717C0 /* CharactersAssembler.swift in Sources */,
53B6BF7E23D848B400A717C0 /* AppDelegate.swift in Sources */,
53FB5E0623DB121100704A2D /* String+extension.swift in Sources */,
53FB5E0623DB121100704A2D /* Character+extension.swift in Sources */,
53B6BF8023D848B400A717C0 /* SceneDelegate.swift in Sources */,
53B6BFB623D8834100A717C0 /* MarvelCharactersView.swift in Sources */,
53B6BFB623D8834100A717C0 /* CharactersView.swift in Sources */,
53B6BFBB23D883CB00A717C0 /* ObservableStore.swift in Sources */,
53FB5E0B23DB157000704A2D /* CharacterProfileAssembler.swift in Sources */,
53FB5E0923DB156500704A2D /* CharacterProfileView.swift in Sources */,
53FB5E0B23DB157000704A2D /* CharacterQuotesAssembler.swift in Sources */,
53C60EF423DF0766004537F8 /* ActivityIndicator.swift in Sources */,
53FB5E0923DB156500704A2D /* CharacterQuotesView.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down
27 changes: 27 additions & 0 deletions Examples/DemoApp/iosApp/DemoApp/Components/ActivityIndicator.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
//
// ActivityIndicator.swift
// DemoApp
//
// Created by Jérémy TOUZY on 27/01/2020.
// Copyright © 2020 jtouzy. All rights reserved.
//

import SwiftUI

//
// MARK: Component ActivityIndicator
//
struct ActivityIndicator: UIViewRepresentable {
let style: UIActivityIndicatorView.Style

func makeUIView(context: UIViewRepresentableContext<ActivityIndicator>) -> UIActivityIndicatorView {
return UIActivityIndicatorView(style: style)
}

func updateUIView(_ uiView: UIActivityIndicatorView,
context: UIViewRepresentableContext<ActivityIndicator>) {
if (!uiView.isAnimating) {
uiView.startAnimating()
}
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
//
// String+extension.swift
// Character+extension.swift
// DemoApp
//
// Created by Jérémy TOUZY on 24/01/2020.
// Copyright © 2020 jtouzy. All rights reserved.
//

extension String: Identifiable {
import shared

extension Character: Identifiable {
public var id: String {
return self
return name
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
//
// CharacterQuotesAssembler.swift
// DemoApp
//
// Created by Jérémy TOUZY on 24/01/2020.
// Copyright © 2020 jtouzy. All rights reserved.
//

class CharacterQuotesAssembler {
static func assemble() -> CharacterQuotesView {
return CharacterQuotesView()
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//
// CharacterProfileView.swift
// CharacterQuotesView.swift
// DemoApp
//
// Created by Jérémy TOUZY on 24/01/2020.
Expand All @@ -11,10 +11,10 @@ import SwiftUI
//
// MARK: View Layout
//
struct CharacterProfileView: View {
struct CharacterQuotesView: View {
var body: some View {
VStack {
Text("Profile view")
Text("Quotes view")
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//
// CharactersAssembler.swift
// DemoApp
//
// Created by Jérémy TOUZY on 22/01/2020.
// Copyright © 2020 jtouzy. All rights reserved.
//

import shared

class CharactersAssembler {
static func assemble() -> CharactersView {
let store = ObservableStore<CharactersViewState>(baseState: Loading())
let presenter = CharactersPresenterImpl(store: store, api: BreakingBadApi())
return CharactersView(presenter: presenter, store: store)
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//
// MarvelCharactersView.swift
// CharactersView.swift
// DemoApp
//
// Created by Jérémy TOUZY on 22/01/2020.
Expand All @@ -12,31 +12,31 @@ import shared
//
// MARK: View Layout
//
struct MarvelCharactersView: View {
let presenter: MarvelCharactersPresenter
@ObservedObject var store: ObservableStore<MarvelCharactersViewState>
var viewState: MarvelCharactersViewState { store.state }
struct CharactersView: View {
let presenter: CharactersPresenter
@ObservedObject var store: ObservableStore<CharactersViewState>
var viewState: CharactersViewState { store.state }

var body: some View {
NavigationView {
VStack {
dynamicContainedView()
}
.navigationBarTitle("Marvel Characters")
.navigationBarTitle("Breaking Bad Quotes")
}
.onAppear { self.onViewAppear() }
}

func dynamicContainedView() -> AnyView {
if viewState is Loading {
return AnyView(Text("Loading"))
return AnyView(ActivityIndicator(style: .large))
} else if let contentViewState = viewState as? Content {
return AnyView(
List(contentViewState.characters) { character in
NavigationLink(destination: CharacterProfileAssembler.assemble()) {
NavigationLink(destination: CharacterQuotesAssembler.assemble()) {
HStack {
Image(systemName: "heart.fill")
Text(character)
Text(character.name)
}
.padding()
}
Expand All @@ -51,10 +51,8 @@ struct MarvelCharactersView: View {
//
// MARK: Events
//
extension MarvelCharactersView {
extension CharactersView {
func onViewAppear() {
DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: {
self.presenter.loadCharaters()
})
presenter.loadCharacters()
}
}

This file was deleted.

2 changes: 1 addition & 1 deletion Examples/DemoApp/iosApp/DemoApp/SceneDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
func scene(_ scene: UIScene,
willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions) {
let baseView = MarvelCharactersAssembler.assemble()
let baseView = CharactersAssembler.assemble()

if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
Expand Down

0 comments on commit 5478423

Please sign in to comment.