Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature (LaunchView&LaunchViweCell): Create components and interaction #41

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,20 @@
B1280BC4281A098D00AD4E09 /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1280BC3281A098D00AD4E09 /* HomeViewModel.swift */; };
B157114A281FE0F300E431B2 /* Int+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1571149281FE0F300E431B2 /* Int+Extensions.swift */; };
B157114C281FE10800E431B2 /* String+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B157114B281FE10800E431B2 /* String+Extensions.swift */; };
B15711502821E9A300E431B2 /* LaunchViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B157114F2821E9A300E431B2 /* LaunchViewCell.swift */; };
B15711522821F1B300E431B2 /* LaunchBadgeWithInfos.swift in Sources */ = {isa = PBXBuildFile; fileRef = B15711512821F1B300E431B2 /* LaunchBadgeWithInfos.swift */; };
B15711542821F22C00E431B2 /* LaunchBadgeWithInfosViewData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B15711532821F22C00E431B2 /* LaunchBadgeWithInfosViewData.swift */; };
B15711562821F50C00E431B2 /* LaunchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B15711552821F50C00E431B2 /* LaunchViewModel.swift */; };
B15711582821F61600E431B2 /* SPXViewModelActor.swift in Sources */ = {isa = PBXBuildFile; fileRef = B15711572821F61600E431B2 /* SPXViewModelActor.swift */; };
B157115A2821F6FF00E431B2 /* LaunchesViewData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B15711592821F6FF00E431B2 /* LaunchesViewData.swift */; };
B1A027FA281761020021AB28 /* LaunchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1A027F9281761020021AB28 /* LaunchView.swift */; };
B1A027FF281761A90021AB28 /* SPSystemIconsConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1A027FE281761A90021AB28 /* SPSystemIconsConstants.swift */; };
B1A028072817639B0021AB28 /* SPTabBarPages.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1A028062817639B0021AB28 /* SPTabBarPages.swift */; };
B1A0281E2817685C0021AB28 /* Color+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1A0281D2817685C0021AB28 /* Color+Extension.swift */; };
B1A028262817F6E90021AB28 /* NextLaunchViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1A028252817F6E90021AB28 /* NextLaunchViewCell.swift */; };
B9A2E7BC28208B8F0069BE44 /* SPButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9A2E7BB28208B8F0069BE44 /* SPButtonView.swift */; };
E4BD81932820903300E8520F /* CompleteDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4BD81922820903300E8520F /* CompleteDetailView.swift */; };
E4BD81952820905300E8520F /* CompleteDetailsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4BD81942820905300E8520F /* CompleteDetailsViewModel.swift */; };
B9A2E7BC28208B8F0069BE44 /* SPButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9A2E7BB28208B8F0069BE44 /* SPButtonView.swift */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
Expand Down Expand Up @@ -105,14 +111,20 @@
B1280BC3281A098D00AD4E09 /* HomeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewModel.swift; sourceTree = "<group>"; };
B1571149281FE0F300E431B2 /* Int+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Int+Extensions.swift"; sourceTree = "<group>"; };
B157114B281FE10800E431B2 /* String+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Extensions.swift"; sourceTree = "<group>"; };
B157114F2821E9A300E431B2 /* LaunchViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchViewCell.swift; sourceTree = "<group>"; };
B15711512821F1B300E431B2 /* LaunchBadgeWithInfos.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchBadgeWithInfos.swift; sourceTree = "<group>"; };
B15711532821F22C00E431B2 /* LaunchBadgeWithInfosViewData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchBadgeWithInfosViewData.swift; sourceTree = "<group>"; };
B15711552821F50C00E431B2 /* LaunchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchViewModel.swift; sourceTree = "<group>"; };
B15711572821F61600E431B2 /* SPXViewModelActor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SPXViewModelActor.swift; sourceTree = "<group>"; };
B15711592821F6FF00E431B2 /* LaunchesViewData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchesViewData.swift; sourceTree = "<group>"; };
B1A027F9281761020021AB28 /* LaunchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchView.swift; sourceTree = "<group>"; };
B1A027FE281761A90021AB28 /* SPSystemIconsConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SPSystemIconsConstants.swift; sourceTree = "<group>"; };
B1A028062817639B0021AB28 /* SPTabBarPages.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SPTabBarPages.swift; sourceTree = "<group>"; };
B1A0281D2817685C0021AB28 /* Color+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Color+Extension.swift"; sourceTree = "<group>"; };
B1A028252817F6E90021AB28 /* NextLaunchViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NextLaunchViewCell.swift; sourceTree = "<group>"; };
B9A2E7BB28208B8F0069BE44 /* SPButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SPButtonView.swift; sourceTree = "<group>"; };
E4BD81922820903300E8520F /* CompleteDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompleteDetailView.swift; sourceTree = "<group>"; };
E4BD81942820905300E8520F /* CompleteDetailsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompleteDetailsViewModel.swift; sourceTree = "<group>"; };
B9A2E7BB28208B8F0069BE44 /* SPButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SPButtonView.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
Expand Down Expand Up @@ -219,9 +231,11 @@
children = (
98BDC98E2784F9D1003820AD /* AllLaunchesResponse.swift */,
B1280B80281804FC00AD4E09 /* NextLaunchViewData.swift */,
B15711592821F6FF00E431B2 /* LaunchesViewData.swift */,
B1280B952818B97400AD4E09 /* NextLaunchResponseModel.swift */,
B1A027FE281761A90021AB28 /* SPSystemIconsConstants.swift */,
B1A028062817639B0021AB28 /* SPTabBarPages.swift */,
B15711532821F22C00E431B2 /* LaunchBadgeWithInfosViewData.swift */,
5A59BA5C2820B8B90045A976 /* NextLaunchesResponseModel.swift */,
);
path = Models;
Expand Down Expand Up @@ -258,6 +272,8 @@
98B551702784D78900AC9086 /* HomeView.swift */,
B1A028252817F6E90021AB28 /* NextLaunchViewCell.swift */,
B1A027F9281761020021AB28 /* LaunchView.swift */,
B157114F2821E9A300E431B2 /* LaunchViewCell.swift */,
B15711512821F1B300E431B2 /* LaunchBadgeWithInfos.swift */,
);
path = Screens;
sourceTree = "<group>";
Expand Down Expand Up @@ -317,6 +333,7 @@
isa = PBXGroup;
children = (
B1280BC3281A098D00AD4E09 /* HomeViewModel.swift */,
B15711552821F50C00E431B2 /* LaunchViewModel.swift */,
);
path = ViewModel;
sourceTree = "<group>";
Expand All @@ -335,6 +352,7 @@
isa = PBXGroup;
children = (
B1A02809281764390021AB28 /* Extensions */,
B15711572821F61600E431B2 /* SPXViewModelActor.swift */,
);
path = Utils;
sourceTree = "<group>";
Expand Down Expand Up @@ -514,13 +532,19 @@
B1A028072817639B0021AB28 /* SPTabBarPages.swift in Sources */,
B1A0281E2817685C0021AB28 /* Color+Extension.swift in Sources */,
B1280B9A2818C62600AD4E09 /* SPTabBar.swift in Sources */,
B15711542821F22C00E431B2 /* LaunchBadgeWithInfosViewData.swift in Sources */,
B157115A2821F6FF00E431B2 /* LaunchesViewData.swift in Sources */,
B15711562821F50C00E431B2 /* LaunchViewModel.swift in Sources */,
B15711502821E9A300E431B2 /* LaunchViewCell.swift in Sources */,
98BDC9892784F891003820AD /* NetworkClient.swift in Sources */,
98BDC9872784F888003820AD /* Response.swift in Sources */,
B1280B8D2818B7DD00AD4E09 /* AllLaunchsEndpoint.swift in Sources */,
B1280BA128196B5800AD4E09 /* SpaceXAPIErrors.swift in Sources */,
B9A2E7BC28208B8F0069BE44 /* SPButtonView.swift in Sources */,
B15711522821F1B300E431B2 /* LaunchBadgeWithInfos.swift in Sources */,
98BDC98D2784F928003820AD /* SpaceXAPIClient.swift in Sources */,
98BDC9812784F865003820AD /* ContentType.swift in Sources */,
B15711582821F61600E431B2 /* SPXViewModelActor.swift in Sources */,
B1280B8B2818B70400AD4E09 /* Endpoint.swift in Sources */,
98BDC98F2784F9D1003820AD /* AllLaunchesResponse.swift in Sources */,
E4BD81932820903300E8520F /* CompleteDetailView.swift in Sources */,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
<<<<<<< HEAD
shouldUseLaunchSchemeArgsEnv = "YES"
codeCoverageEnabled = "YES">
<Testables>
Expand All @@ -50,10 +49,6 @@
ReferencedContainer = "container:SpaceApp.xcodeproj">
</BuildableReference>
</TestableReference>
=======
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
>>>>>>> 7a9d2f7883aa01d835e1abb99fc73c7a20dd3bb8
</Testables>
</TestAction>
<LaunchAction
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,13 @@
import SwiftUI

struct SPTabBar: View {

var body: some View {
setupTabBarStyle()
return makeTabBar()
}

private func makeTabBar() -> some View {
@MainActor private func makeTabBar() -> some View {
setupTabBarStyle()

return TabView {
Expand All @@ -26,7 +27,9 @@ struct SPTabBar: View {
Text(SPTabBarPages.home.tabBarName)
}

LaunchView()
let launchesService = SpaceXAPI()
let launchesViewModel = LaunchViewModel(service: launchesService)
LaunchView(viewModel: launchesViewModel)
.tabItem {
SPTabBarPages.launch.icon.image
Text(SPTabBarPages.launch.tabBarName)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
//
// LaunchBadgeWithInfosViewData.swift
// SpaceApp
//
// Created by Paolo Prodossimo Lopes on 03/05/22.
//

import Foundation

struct LaunchBadgeWithInfosViewData {
var iconImageURL: URL?
var rocketName: String?
var launchNumber: String?
var launchDate: String?
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
//
// LaunchesViewData.swift
// SpaceApp
//
// Created by Paolo Prodossimo Lopes on 03/05/22.
//

import Foundation

final class LaunchesViewData: Identifiable {

private let response: NextLaunchesDocsResponseModel?

init(_ response: NextLaunchesDocsResponseModel?) {
self.response = response
}

let id: UUID = .init()

var rocketName: String {
response?.name ?? .emptyString
}

var launchNumber: String {
let codeNumber = response?.flightNumber ?? .zero
return codeNumber.asLaunchCode
}

var launchDate: String {
let date = response?.date ?? .emptyString
return date.dateFormattedFromUTC
}

var iconImageURL: URL {
let pth = response?.links.patch.small ?? .emptyString
return URL(string: pth)!
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ struct HomeView: View {

private func setupNavigationBarAppearance() {
UINavigationBar.appearance().barStyle = .black
UINavigationBar.appearance().prefersLargeTitles = false
UINavigationBar.appearance().prefersLargeTitles = true
UINavigationBar.appearance().backgroundColor = .darkGray
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
//
// LaunchBadgeWithInfos.swift
// SpaceApp
//
// Created by Paolo Prodossimo Lopes on 03/05/22.
//

import SwiftUI

struct LaunchBadgeWithInfos: View {
//MARK: - Properties
var viewData: LaunchBadgeWithInfosViewData?

//MARK: - Constructor

init(viewData: LaunchBadgeWithInfosViewData?) {
self.viewData = viewData
}

init(_ viewData: NextLaunchViewData?) {
self.init(viewData: .init(
iconImageURL: viewData?.iconImageURL,
rocketName: viewData?.rocketName,
launchNumber: viewData?.launchNumber,
launchDate: viewData?.launchDate
))
}

//MARK: - View
var body: some View {
HStack(spacing: 16) {
bagdeIconImage
launchInformationsStack
}
}

//MARK: - Helpers
private var bagdeIconImage: some View {
AsyncImage(url: viewData?.iconImageURL) { phase in
switch phase {
case .empty:
ProgressView()
.progressViewStyle(.circular)
.frame(width: 125, height: 125)
.tint(.white)

case .success(let image):
image
.resizable()
.frame(width: 125, height: 125)
.aspectRatio(contentMode: .fit)
default:
Text("Failed fetching image. Make sure to check your data connection and try again.")
}
}
}

@ViewBuilder private var launchInformationsStack: some View {
VStack(alignment: .leading, spacing: 8) {
Text(viewData?.rocketName ?? .emptyString)
.font(.system(size: 24, weight: .semibold))

Text(viewData?.launchNumber ?? .emptyString)
.font(.system(size: 20, weight: .regular))

Text(viewData?.launchDate ?? .emptyString)
.font(.system(size: 20, weight: .regular))
}
.foregroundColor(.gray)
}
}

struct LaunchBadgeWithInfos_Previews: PreviewProvider {
static var previews: some View {
LaunchBadgeWithInfos(viewData: .init(iconImageURL: URL(string: "https://images2.imgbox.com/02/51/7NLaBm8c_o.png"), rocketName: "Aleatorio", launchNumber: "#1234", launchDate: "September 12, 2023"))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,60 @@
import SwiftUI

struct LaunchView: View {

//MARK: - Properties
@ObservedObject private var viewModel: LaunchViewModel

//MARK: - Constructor
init(viewModel: LaunchViewModel) {
self.viewModel = viewModel
}

//MARK: - View
var body: some View {
ZStack {
Color.black
.ignoresSafeArea(.all)

Text("Launch View")
.foregroundColor(.white)
NavigationView {
ZStack {
Color.black

ScrollView {
ForEach(viewModel.launches, id: \.id) { info in
LaunchViewCell(
viewData: .init(
iconImageURL: info.iconImageURL,
rocketName: info.rocketName,
launchNumber: info.launchNumber,
launchDate: info.launchDate)
)
}
}
.padding(.top)

}
.background(Color.darkGray)
.navigationTitle("Launches")
.onAppear(perform: onApearMethod)
}
}

//MARK: - Helpers
private func onApearMethod() {
setupNavigationBarAppearance()
viewModel.start()
}

private func setupNavigationBarAppearance() {
UINavigationBar.appearance().barStyle = .black
UINavigationBar.appearance().prefersLargeTitles = true
UINavigationBar.appearance().backgroundColor = .darkGray
}
}

//MARK: - PreviewProvider
struct LaunchView_Previews: PreviewProvider {
static var previews: some View {
LaunchView()
ZStack {
Color.black
LaunchView(viewModel: .init(service: SpaceXAPI()))
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
//
// LaunchViewCell.swift
// SpaceApp
//
// Created by Paolo Prodossimo Lopes on 03/05/22.
//

import SwiftUI

struct LaunchViewCell: View {

//MARK: - Properties
let viewData: LaunchBadgeWithInfosViewData?

//MARK: - View
var body: some View {
ZStack {
LaunchBadgeWithInfos(viewData: viewData)
.frame(maxWidth: .infinity)
.padding(.vertical)
.background(Color.darkGray)
.cornerRadius(10)
.padding(.horizontal)
}
}
}

struct LaunchViewCell_Previews: PreviewProvider {
static var previews: some View {
ZStack {
Color.black
.frame(maxHeight: 200)
LaunchViewCell(viewData: .init(iconImageURL: URL(string: "https://images2.imgbox.com/02/51/7NLaBm8c_o.png"), rocketName: "Aleatorio", launchNumber: "#1234", launchDate: "September 12, 2023"))
}
.previewLayout(.sizeThatFits)
}
}
Loading