Skip to content

Commit

Permalink
feat: Added CharacterDetailViewModel logic
Browse files Browse the repository at this point in the history
  • Loading branch information
xramos committed Apr 8, 2024
1 parent 988df70 commit 13e7154
Show file tree
Hide file tree
Showing 4 changed files with 170 additions and 3 deletions.
136 changes: 134 additions & 2 deletions MyComics/MyComics/Scenes/CharacterDetail/CharacterDetailView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,138 @@ struct CharacterDetailView: View {
@StateObject var viewModel: CharacterDetailViewModel

var body: some View {
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)

VStack {

content

}.onAppear {

viewModel.getCharacterDetail()
}
}
}

private extension CharacterDetailView {

@ViewBuilder
private var content: some View {

switch viewModel.state {
case .idle:
idleView()
case .loading:
loadingView()
case .failed:
failureView()
case .success:
successView()
}
}

private func idleView() -> some View {

EmptyView()
}

private func loadingView() -> some View {

ProgressView()
}

private func failureView() -> some View {

EmptyView()
}

private func successView() -> some View {

VStack(alignment: .center) {

headerView

Divider()

detailView
}
.padding([.leading, .trailing], Value.paddingLarge)
}
}

private extension CharacterDetailView {

@ViewBuilder
var headerView: some View {

HStack(alignment: .center, spacing: Value.spacing) {

// Image

VStack(alignment: .leading, spacing: Value.spacing) {

Text(viewModel.character.name)
.font(.largeTitle)

Text(viewModel.character.realName)
.font(.body)
}

Spacer()
}
}

@ViewBuilder
var detailView: some View {

ScrollView {

if !viewModel.character.birth.isEmpty {

titleView(title: viewModel.localization.birth,
value: viewModel.character.birth)

Spacer().frame(height: Value.spaceHeight)
}
}
}

func titleView(title: String, value: String) -> some View {

HStack(alignment: .center) {

VStack(alignment: .leading) {

Text(title)
.font(.headline)
}

Spacer()

VStack(alignment: .trailing) {

Text(value)
.font(.body)
}
}
}

func infoView(title: String, value: String) -> some View {

HStack(alignment: .center) {

VStack(alignment: .leading) {

Text(title)
.font(.headline)

Spacer().frame(height: Value.spaceHeight)

Text(value)
.font(.body)
}

Spacer()
}
}
}

Expand All @@ -23,13 +154,14 @@ struct CharacterDetailView: View {
realName: "Bruce Wayne",
aliases: "",
image: nil,
birth: "",
birth: "Gotham",
deck: "",
gender: .male,
origin: "",
powers: [])

let viewModel = CharacterDetailViewModel(character: character)
viewModel.state = .success

return CharacterDetailView(viewModel: viewModel)
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,45 @@ class CharacterDetailViewModel: ObservableObject {

// Variables

let localization: CharacterDetailLocalization

@Published public private(set) var character: Character
@Published var state: State = State.idle

// Cancellables

private var cancellable: AnyCancellable?

// MARK: - Methods

init(character: Character) {

self.localization = CharacterDetailLocalization()
self.character = character
}

func getCharacterDetail() {

state = .loading

cancellable = GetCharacterDetailUseCase().execute(id: character.id)
.receive(on: DispatchQueue.main)
.sink(receiveCompletion: { completion in

switch completion {
case .finished:
self.state = .success
case .failure(let error):
self.state = .failed

print("Get character error: \(error)")
}

}, receiveValue: { (character: Character) in

self.character = character
})
}
}

extension CharacterDetailViewModel {
Expand Down
4 changes: 4 additions & 0 deletions MyComics/MyComics/Value.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,8 @@ struct Value {

static let padding: CGFloat = 8
static let paddingLarge: CGFloat = 16

static let spacing: CGFloat = 16

static let spaceHeight: CGFloat = 8
}
2 changes: 1 addition & 1 deletion MyComics/MyComics/Views/CharacterListView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ struct CharacterListView: View {

Divider()
}
.padding([.leading, .trailing], Value.padding)
//.padding([.leading, .trailing], Value.padding)
}
}

Expand Down

0 comments on commit 13e7154

Please sign in to comment.