Skip to content

Commit bc282c1

Browse files
authored
BN-4308 [FEATURE] Add episode view
1 parent 791e867 commit bc282c1

29 files changed

+443
-355
lines changed

NetworkModuleSampleApp/NetworkModuleSampleApp.xcodeproj/project.pbxproj

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,18 @@
1313
2260DF2329938C2900ED9386 /* TextStyles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2260DF2229938C2900ED9386 /* TextStyles.swift */; };
1414
2260DF2529938E6F00ED9386 /* CircularProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2260DF2429938E6F00ED9386 /* CircularProgressView.swift */; };
1515
2290A8D92994CDD900067FFC /* ViewStyles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2290A8D82994CDD900067FFC /* ViewStyles.swift */; };
16+
2290A8DB2994EAC500067FFC /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2290A8DA2994EAC500067FFC /* Constants.swift */; };
17+
2290A8E12995118F00067FFC /* StringExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2290A8E02995118F00067FFC /* StringExtensions.swift */; };
1618
AD06FC26297FE93900A05C0F /* EpisodeHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD06FC25297FE93900A05C0F /* EpisodeHeaderView.swift */; };
1719
AD073F02297EC3DA007B8C89 /* NetworkModuleSampleAppApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD073F01297EC3DA007B8C89 /* NetworkModuleSampleAppApp.swift */; };
1820
AD073F06297EC3DC007B8C89 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AD073F05297EC3DC007B8C89 /* Assets.xcassets */; };
1921
AD073F09297EC3DC007B8C89 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AD073F08297EC3DC007B8C89 /* Preview Assets.xcassets */; };
2022
AD073F16297EC45A007B8C89 /* HomeScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD073F15297EC45A007B8C89 /* HomeScene.swift */; };
2123
AD073F1C297EC4FA007B8C89 /* EpisodeListScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD073F1B297EC4FA007B8C89 /* EpisodeListScene.swift */; };
22-
AD073F1F297EC536007B8C89 /* CharacterScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD073F1E297EC536007B8C89 /* CharacterScene.swift */; };
2324
AD073F22297EC637007B8C89 /* EpisodeListRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD073F21297EC637007B8C89 /* EpisodeListRowView.swift */; };
2425
AD073F28297FDB04007B8C89 /* HomeRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD073F27297FDB04007B8C89 /* HomeRowView.swift */; };
25-
AD073F2B297FE87D007B8C89 /* EpisodeSceneView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD073F2A297FE87D007B8C89 /* EpisodeSceneView.swift */; };
26+
AD073F2B297FE87D007B8C89 /* EpisodeScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD073F2A297FE87D007B8C89 /* EpisodeScene.swift */; };
2627
AD4F74A62983ED7B00BF96CF /* NgNetworkModuleCore in Frameworks */ = {isa = PBXBuildFile; productRef = AD4F74A52983ED7B00BF96CF /* NgNetworkModuleCore */; };
27-
AD4F74A92984168C00BF96CF /* EpisodeHeaderViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD4F74A82984168C00BF96CF /* EpisodeHeaderViewModel.swift */; };
2828
ADC19E3529801E2300E26D25 /* HomeRowType.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC19E3429801E2300E26D25 /* HomeRowType.swift */; };
2929
ADC19E4129812F6600E26D25 /* EpisodeListViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC19E4029812F6600E26D25 /* EpisodeListViewModelProtocol.swift */; };
3030
ADC19E44298130D000E26D25 /* EpisodeListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC19E43298130D000E26D25 /* EpisodeListViewModel.swift */; };
@@ -35,10 +35,9 @@
3535
ADC19E59298163A100E26D25 /* EpisodeViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC19E58298163A100E26D25 /* EpisodeViewModelProtocol.swift */; };
3636
ADC19E5B29816AC100E26D25 /* EpisodeCharacterRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC19E5A29816AC100E26D25 /* EpisodeCharacterRowView.swift */; };
3737
ADC19E602981724600E26D25 /* PreviewMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC19E5F2981724600E26D25 /* PreviewMocks.swift */; };
38-
ADE5A545298265D5003B3AE6 /* EpisodeMainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE5A544298265D5003B3AE6 /* EpisodeMainView.swift */; };
3938
ADE5A54929826893003B3AE6 /* ImagePlaceHolder.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE5A54829826893003B3AE6 /* ImagePlaceHolder.swift */; };
40-
ADE5A54B29827378003B3AE6 /* EpisodeRowModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE5A54A29827378003B3AE6 /* EpisodeRowModel.swift */; };
41-
ADE5A54D29827827003B3AE6 /* EpisodeCharacterRowModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE5A54C29827827003B3AE6 /* EpisodeCharacterRowModel.swift */; };
39+
ADE5A54B29827378003B3AE6 /* EpisodeViewData.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE5A54A29827378003B3AE6 /* EpisodeViewData.swift */; };
40+
ADE5A54D29827827003B3AE6 /* CharacterViewData.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE5A54C29827827003B3AE6 /* CharacterViewData.swift */; };
4241
/* End PBXBuildFile section */
4342

4443
/* Begin PBXFileReference section */
@@ -47,18 +46,18 @@
4746
2260DF2229938C2900ED9386 /* TextStyles.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextStyles.swift; sourceTree = "<group>"; };
4847
2260DF2429938E6F00ED9386 /* CircularProgressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CircularProgressView.swift; sourceTree = "<group>"; };
4948
2290A8D82994CDD900067FFC /* ViewStyles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewStyles.swift; sourceTree = "<group>"; };
49+
2290A8DA2994EAC500067FFC /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = "<group>"; };
50+
2290A8E02995118F00067FFC /* StringExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringExtensions.swift; sourceTree = "<group>"; };
5051
AD06FC25297FE93900A05C0F /* EpisodeHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EpisodeHeaderView.swift; sourceTree = "<group>"; };
5152
AD073EFE297EC3DA007B8C89 /* NetworkModuleSampleApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NetworkModuleSampleApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
5253
AD073F01297EC3DA007B8C89 /* NetworkModuleSampleAppApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkModuleSampleAppApp.swift; sourceTree = "<group>"; };
5354
AD073F05297EC3DC007B8C89 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
5455
AD073F08297EC3DC007B8C89 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
5556
AD073F15297EC45A007B8C89 /* HomeScene.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeScene.swift; sourceTree = "<group>"; };
5657
AD073F1B297EC4FA007B8C89 /* EpisodeListScene.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EpisodeListScene.swift; sourceTree = "<group>"; };
57-
AD073F1E297EC536007B8C89 /* CharacterScene.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CharacterScene.swift; sourceTree = "<group>"; };
5858
AD073F21297EC637007B8C89 /* EpisodeListRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EpisodeListRowView.swift; sourceTree = "<group>"; };
5959
AD073F27297FDB04007B8C89 /* HomeRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeRowView.swift; sourceTree = "<group>"; };
60-
AD073F2A297FE87D007B8C89 /* EpisodeSceneView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EpisodeSceneView.swift; sourceTree = "<group>"; };
61-
AD4F74A82984168C00BF96CF /* EpisodeHeaderViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EpisodeHeaderViewModel.swift; sourceTree = "<group>"; };
60+
AD073F2A297FE87D007B8C89 /* EpisodeScene.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EpisodeScene.swift; sourceTree = "<group>"; };
6261
ADC19E3429801E2300E26D25 /* HomeRowType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeRowType.swift; sourceTree = "<group>"; };
6362
ADC19E4029812F6600E26D25 /* EpisodeListViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EpisodeListViewModelProtocol.swift; sourceTree = "<group>"; };
6463
ADC19E43298130D000E26D25 /* EpisodeListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EpisodeListViewModel.swift; sourceTree = "<group>"; };
@@ -69,10 +68,9 @@
6968
ADC19E58298163A100E26D25 /* EpisodeViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EpisodeViewModelProtocol.swift; sourceTree = "<group>"; };
7069
ADC19E5A29816AC100E26D25 /* EpisodeCharacterRowView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EpisodeCharacterRowView.swift; sourceTree = "<group>"; };
7170
ADC19E5F2981724600E26D25 /* PreviewMocks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewMocks.swift; sourceTree = "<group>"; };
72-
ADE5A544298265D5003B3AE6 /* EpisodeMainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EpisodeMainView.swift; sourceTree = "<group>"; };
7371
ADE5A54829826893003B3AE6 /* ImagePlaceHolder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImagePlaceHolder.swift; sourceTree = "<group>"; };
74-
ADE5A54A29827378003B3AE6 /* EpisodeRowModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EpisodeRowModel.swift; sourceTree = "<group>"; };
75-
ADE5A54C29827827003B3AE6 /* EpisodeCharacterRowModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EpisodeCharacterRowModel.swift; sourceTree = "<group>"; };
72+
ADE5A54A29827378003B3AE6 /* EpisodeViewData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EpisodeViewData.swift; sourceTree = "<group>"; };
73+
ADE5A54C29827827003B3AE6 /* CharacterViewData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CharacterViewData.swift; sourceTree = "<group>"; };
7674
/* End PBXFileReference section */
7775

7876
/* Begin PBXFrameworksBuildPhase section */
@@ -114,6 +112,14 @@
114112
path = Style;
115113
sourceTree = "<group>";
116114
};
115+
2290A8DF2995117C00067FFC /* Extensions */ = {
116+
isa = PBXGroup;
117+
children = (
118+
2290A8E02995118F00067FFC /* StringExtensions.swift */,
119+
);
120+
path = Extensions;
121+
sourceTree = "<group>";
122+
};
117123
AD073EF5297EC3DA007B8C89 = {
118124
isa = PBXGroup;
119125
children = (
@@ -206,7 +212,6 @@
206212
children = (
207213
ADC19E4F298158D100E26D25 /* Model */,
208214
AD073F29297FE6C0007B8C89 /* Views */,
209-
AD073F1E297EC536007B8C89 /* CharacterScene.swift */,
210215
);
211216
path = Character;
212217
sourceTree = "<group>";
@@ -225,7 +230,7 @@
225230
ADC19E552981621F00E26D25 /* ViewModel */,
226231
ADC19E4C2981584500E26D25 /* Model */,
227232
AD073F2C297FE8DE007B8C89 /* Views */,
228-
AD073F2A297FE87D007B8C89 /* EpisodeSceneView.swift */,
233+
AD073F2A297FE87D007B8C89 /* EpisodeScene.swift */,
229234
);
230235
path = Episode;
231236
sourceTree = "<group>";
@@ -248,7 +253,6 @@
248253
AD073F2C297FE8DE007B8C89 /* Views */ = {
249254
isa = PBXGroup;
250255
children = (
251-
ADE5A544298265D5003B3AE6 /* EpisodeMainView.swift */,
252256
ADC19E5A29816AC100E26D25 /* EpisodeCharacterRowView.swift */,
253257
AD06FC25297FE93900A05C0F /* EpisodeHeaderView.swift */,
254258
);
@@ -292,8 +296,7 @@
292296
isa = PBXGroup;
293297
children = (
294298
ADC19E4D2981584F00E26D25 /* EpisodeModel.swift */,
295-
ADE5A54C29827827003B3AE6 /* EpisodeCharacterRowModel.swift */,
296-
AD4F74A82984168C00BF96CF /* EpisodeHeaderViewModel.swift */,
299+
ADE5A54C29827827003B3AE6 /* CharacterViewData.swift */,
297300
);
298301
path = Model;
299302
sourceTree = "<group>";
@@ -309,7 +312,7 @@
309312
ADC19E5229815AE200E26D25 /* Model */ = {
310313
isa = PBXGroup;
311314
children = (
312-
ADE5A54A29827378003B3AE6 /* EpisodeRowModel.swift */,
315+
ADE5A54A29827378003B3AE6 /* EpisodeViewData.swift */,
313316
);
314317
path = Model;
315318
sourceTree = "<group>";
@@ -334,9 +337,11 @@
334337
ADE5A5462982687B003B3AE6 /* Common */ = {
335338
isa = PBXGroup;
336339
children = (
340+
2290A8DF2995117C00067FFC /* Extensions */,
337341
2260DF2129938BF500ED9386 /* Style */,
338342
2260DF1A29926EF900ED9386 /* Networking */,
339343
ADE5A54729826885003B3AE6 /* Views */,
344+
2290A8DA2994EAC500067FFC /* Constants.swift */,
340345
);
341346
path = Common;
342347
sourceTree = "<group>";
@@ -447,7 +452,6 @@
447452
buildActionMask = 2147483647;
448453
files = (
449454
AD073F28297FDB04007B8C89 /* HomeRowView.swift in Sources */,
450-
ADE5A545298265D5003B3AE6 /* EpisodeMainView.swift in Sources */,
451455
AD073F16297EC45A007B8C89 /* HomeScene.swift in Sources */,
452456
2260DF2329938C2900ED9386 /* TextStyles.swift in Sources */,
453457
ADC19E4129812F6600E26D25 /* EpisodeListViewModelProtocol.swift in Sources */,
@@ -457,15 +461,15 @@
457461
ADC19E59298163A100E26D25 /* EpisodeViewModelProtocol.swift in Sources */,
458462
ADE5A54929826893003B3AE6 /* ImagePlaceHolder.swift in Sources */,
459463
2260DF2529938E6F00ED9386 /* CircularProgressView.swift in Sources */,
460-
AD073F2B297FE87D007B8C89 /* EpisodeSceneView.swift in Sources */,
461-
ADE5A54B29827378003B3AE6 /* EpisodeRowModel.swift in Sources */,
462-
ADE5A54D29827827003B3AE6 /* EpisodeCharacterRowModel.swift in Sources */,
464+
2290A8DB2994EAC500067FFC /* Constants.swift in Sources */,
465+
2290A8E12995118F00067FFC /* StringExtensions.swift in Sources */,
466+
AD073F2B297FE87D007B8C89 /* EpisodeScene.swift in Sources */,
467+
ADE5A54B29827378003B3AE6 /* EpisodeViewData.swift in Sources */,
468+
ADE5A54D29827827003B3AE6 /* CharacterViewData.swift in Sources */,
463469
ADC19E51298159D100E26D25 /* CharacterModel.swift in Sources */,
464-
AD4F74A92984168C00BF96CF /* EpisodeHeaderViewModel.swift in Sources */,
465470
AD073F1C297EC4FA007B8C89 /* EpisodeListScene.swift in Sources */,
466471
ADC19E5B29816AC100E26D25 /* EpisodeCharacterRowView.swift in Sources */,
467472
2260DF2029926F7500ED9386 /* GetEpisodesListRequest.swift in Sources */,
468-
AD073F1F297EC536007B8C89 /* CharacterScene.swift in Sources */,
469473
ADC19E4B2981537E00E26D25 /* Routes.swift in Sources */,
470474
AD073F02297EC3DA007B8C89 /* NetworkModuleSampleAppApp.swift in Sources */,
471475
ADC19E602981724600E26D25 /* PreviewMocks.swift in Sources */,

NetworkModuleSampleApp/NetworkModuleSampleApp/App/Routes/Routes.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import Foundation
77

88
enum Route: Hashable {
99
case home
10-
case episodeList(NetworkModuleApiType)
11-
case episode(requestType: NetworkModuleApiType, episodeId: Int)
12-
case character
10+
case episodeList(requestType: NetworkModuleApiType)
11+
case episode(selectedNetworkApi: NetworkModuleApiType, episode: EpisodeModel)
1312
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//
2+
// Constants.swift
3+
// Netguru iOS Network Module
4+
//
5+
6+
import SwiftUI
7+
8+
enum Constants {
9+
10+
enum Miniature {
11+
static let size = CGSize(width: 100, height: 100)
12+
static let progressIndicatorThickness = CGFloat(5)
13+
static let cornerRadius = CGFloat(5)
14+
}
15+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
//
2+
// StringExtensions.swift
3+
// Netguru iOS Network Module
4+
//
5+
6+
import Foundation
7+
8+
extension String {
9+
10+
var toSafeUrl: URL? {
11+
URL(string: replacingOccurrences(of: "http://", with: "https://"))
12+
}
13+
}
14+
15+
extension Optional where Wrapped == String {
16+
17+
func orUnknown() -> String {
18+
if let self {
19+
return self
20+
}
21+
return "---"
22+
}
23+
}

NetworkModuleSampleApp/NetworkModuleSampleApp/Common/Style/TextStyles.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,23 @@ struct SingleLineScaledToFitTextModifier: ViewModifier {
1414
}
1515
}
1616

17+
struct NetworkErrorTextModifier: ViewModifier {
18+
19+
func body(content: Content) -> some View {
20+
content
21+
.lineLimit(3)
22+
.font(.body)
23+
.foregroundColor(Color("white"))
24+
.bold()
25+
}
26+
}
27+
1728
extension Text {
1829
func singleLineScaledToFit() -> some View {
1930
modifier(SingleLineScaledToFitTextModifier())
2031
}
32+
33+
func networkError() -> some View {
34+
modifier(NetworkErrorTextModifier())
35+
}
2136
}

NetworkModuleSampleApp/NetworkModuleSampleApp/Common/Style/ViewStyles.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,18 @@ struct EpisodeMiniatureImageModifier: ViewModifier {
1111

1212
func body(content: Content) -> some View {
1313
content
14-
.frame(width: size.width, height: size.height)
1514
.scaledToFill()
15+
.frame(width: size.width, height: size.height)
16+
.clipped()
1617
.cornerRadius(cornerRadius)
1718
}
1819
}
1920

2021
extension View {
2122

2223
func episodeMiniature(
23-
size: CGSize = CGSize(width: 100, height: 100),
24-
cornerRadius: CGFloat = 5
24+
size: CGSize = Constants.Miniature.size,
25+
cornerRadius: CGFloat = Constants.Miniature.cornerRadius
2526
) -> some View {
2627
modifier(EpisodeMiniatureImageModifier(size: size, cornerRadius: cornerRadius))
2728
}

NetworkModuleSampleApp/NetworkModuleSampleApp/Common/Views/ImagePlaceHolder.swift

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,25 @@
66
import SwiftUI
77

88
struct ImagePlaceHolder: View {
9+
let size: CGSize
10+
let thickness: CGFloat
11+
912
var body: some View {
1013
ZStack {
1114
Color("episode_background")
12-
.episodeMiniature()
15+
.episodeMiniature(size: size, cornerRadius: floor(size.width / 10))
1316

14-
CircularProgressView(thickness: 4)
15-
.frame(width: 40, height: 40)
17+
CircularProgressView(thickness: thickness)
18+
.frame(width: size.width / 3, height: size.height / 3)
1619
}
1720
}
1821
}
1922

2023
struct ImagePlaceHolder_Previews: PreviewProvider {
2124
static var previews: some View {
22-
ImagePlaceHolder()
25+
ImagePlaceHolder(
26+
size: .init(width: 300, height: 300),
27+
thickness: 10
28+
)
2329
}
2430
}

NetworkModuleSampleApp/NetworkModuleSampleApp/PreviewMocks/PreviewMocks.swift

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,46 @@ enum PreviewMocks {
1616
characters: [],
1717
imageURL: ""
1818
)
19+
static let mockCharacterModel = CharacterModel(
20+
id: Int.random(in: 0...1000),
21+
name: "Character",
22+
status: "active",
23+
species: "human",
24+
gender: "male",
25+
hair: "",
26+
alias: [],
27+
origin: "Earth",
28+
abilities: ["leadership"],
29+
imageURL: ""
30+
)
1931

20-
static let mockEpisodeRowModel = EpisodeRowModel(model: mockEpisodeModel)
21-
static let mockCharacterRowModel = EpisodeCharacterRowModel(id: nil, name: "Gary Junior", imageURL: nil)
22-
static let mockEpisodeHeaderModel = EpisodeHeaderViewModel(model: mockEpisodeModel)
32+
static let mockEpisodeViewData = EpisodeViewData(episode: mockEpisodeModel, selectedNetworkApi: .classic)
33+
static let mockCharacterRowModel = CharacterViewData(id: 0, name: "Gary Junior", imageURL: nil)
2334
}
2435

2536
extension PreviewMocks {
2637

2738
final class EpisodeListViewModelStub: EpisodeListViewModelProtocol {
28-
var requestType: NetworkModuleApiType = .classic
39+
var selectedNetworkApi: NetworkModuleApiType = .classic
2940

3041
@Published var viewState: EpisodeListViewState = .loading
3142
var viewStatePublished: Published<EpisodeListViewState> { _viewState }
3243
var viewStatePublisher: Published<EpisodeListViewState>.Publisher { $viewState }
3344

3445
func fetchData() {}
3546
}
47+
48+
final class EpisodeViewModelStub: EpisodeViewModelProtocol {
49+
var selectedNetworkingAPI: NetworkModuleApiType = .classic
50+
51+
@Published var viewState: EpisodeViewStates = .loading(PreviewMocks.mockEpisodeModel)
52+
var viewStatePublished: Published<EpisodeViewStates> { _viewState }
53+
var viewStatePublisher: Published<EpisodeViewStates>.Publisher { $viewState }
54+
55+
@Published var characters: [CharacterModel] = []
56+
var charactersPublished: Published<[CharacterModel]> { _characters }
57+
var charactersPublisher: Published<[CharacterModel]>.Publisher { $characters }
58+
59+
func fetchData() {}
60+
}
3661
}

NetworkModuleSampleApp/NetworkModuleSampleApp/Scenes/Character/CharacterScene.swift

Lines changed: 0 additions & 19 deletions
This file was deleted.

0 commit comments

Comments
 (0)