Skip to content

Commit 694d0c0

Browse files
committed
feat: [SwiftUI Redux Movies demo]finish Home List
1 parent 905774a commit 694d0c0

File tree

4 files changed

+66
-36
lines changed

4 files changed

+66
-36
lines changed

SwiftUI/SwiftUIRedux_MovieApp/ReduxAsync.xcodeproj/project.pbxproj

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
9A11191F2C4D018A005C31F4 /* String+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A11191D2C4D018A005C31F4 /* String+Extensions.swift */; };
3636
9A1119212C4D04EF005C31F4 /* RatingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A1119202C4D04EF005C31F4 /* RatingView.swift */; };
3737
9A1119222C4D04EF005C31F4 /* RatingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A1119202C4D04EF005C31F4 /* RatingView.swift */; };
38+
9A1119272C4D1156005C31F4 /* MoviesMiddleware.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A1119262C4D1156005C31F4 /* MoviesMiddleware.swift */; };
39+
9A1119282C4D1156005C31F4 /* MoviesMiddleware.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A1119262C4D1156005C31F4 /* MoviesMiddleware.swift */; };
3840
/* End PBXBuildFile section */
3941

4042
/* Begin PBXFileReference section */
@@ -57,6 +59,7 @@
5759
34D2F6F3251150DC00117401 /* AppReducer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppReducer.swift; sourceTree = "<group>"; };
5860
9A11191D2C4D018A005C31F4 /* String+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Extensions.swift"; sourceTree = "<group>"; };
5961
9A1119202C4D04EF005C31F4 /* RatingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RatingView.swift; sourceTree = "<group>"; };
62+
9A1119262C4D1156005C31F4 /* MoviesMiddleware.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoviesMiddleware.swift; sourceTree = "<group>"; };
6063
/* End PBXFileReference section */
6164

6265
/* Begin PBXFrameworksBuildPhase section */
@@ -202,6 +205,7 @@
202205
9A1119232C4D0F3A005C31F4 /* Middlewares */ = {
203206
isa = PBXGroup;
204207
children = (
208+
9A1119262C4D1156005C31F4 /* MoviesMiddleware.swift */,
205209
);
206210
path = Middlewares;
207211
sourceTree = "<group>";
@@ -250,7 +254,7 @@
250254
isa = PBXProject;
251255
attributes = {
252256
LastSwiftUpdateCheck = 1200;
253-
LastUpgradeCheck = 1200;
257+
LastUpgradeCheck = 1420;
254258
TargetAttributes = {
255259
342978C6250FEC1500F20610 = {
256260
CreatedOnToolsVersion = 12.0;
@@ -303,6 +307,7 @@
303307
isa = PBXSourcesBuildPhase;
304308
buildActionMask = 2147483647;
305309
files = (
310+
9A1119272C4D1156005C31F4 /* MoviesMiddleware.swift in Sources */,
306311
340AF8242514034700D0E6B7 /* ImageLoader.swift in Sources */,
307312
34111D5D250FFE8C009064B8 /* Store.swift in Sources */,
308313
343CB8BB25193AF4008E9A7B /* View+Extensions.swift in Sources */,
@@ -323,6 +328,7 @@
323328
isa = PBXSourcesBuildPhase;
324329
buildActionMask = 2147483647;
325330
files = (
331+
9A1119282C4D1156005C31F4 /* MoviesMiddleware.swift in Sources */,
326332
340AF8252514034700D0E6B7 /* ImageLoader.swift in Sources */,
327333
34111D5E250FFE8C009064B8 /* Store.swift in Sources */,
328334
343CB8BC25193AF4008E9A7B /* View+Extensions.swift in Sources */,
@@ -376,6 +382,7 @@
376382
CLANG_WARN_UNREACHABLE_CODE = YES;
377383
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
378384
COPY_PHASE_STRIP = NO;
385+
DEAD_CODE_STRIPPING = YES;
379386
DEBUG_INFORMATION_FORMAT = dwarf;
380387
ENABLE_STRICT_OBJC_MSGSEND = YES;
381388
ENABLE_TESTABILITY = YES;
@@ -435,6 +442,7 @@
435442
CLANG_WARN_UNREACHABLE_CODE = YES;
436443
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
437444
COPY_PHASE_STRIP = NO;
445+
DEAD_CODE_STRIPPING = YES;
438446
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
439447
ENABLE_NS_ASSERTIONS = NO;
440448
ENABLE_STRICT_OBJC_MSGSEND = YES;
@@ -504,8 +512,10 @@
504512
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
505513
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
506514
CODE_SIGN_ENTITLEMENTS = macOS/macOS.entitlements;
515+
CODE_SIGN_IDENTITY = "-";
507516
CODE_SIGN_STYLE = Automatic;
508517
COMBINE_HIDPI_IMAGES = YES;
518+
DEAD_CODE_STRIPPING = YES;
509519
DEVELOPMENT_TEAM = B2Q8EGNCQA;
510520
ENABLE_HARDENED_RUNTIME = YES;
511521
ENABLE_PREVIEWS = YES;
@@ -528,8 +538,10 @@
528538
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
529539
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
530540
CODE_SIGN_ENTITLEMENTS = macOS/macOS.entitlements;
541+
CODE_SIGN_IDENTITY = "-";
531542
CODE_SIGN_STYLE = Automatic;
532543
COMBINE_HIDPI_IMAGES = YES;
544+
DEAD_CODE_STRIPPING = YES;
533545
DEVELOPMENT_TEAM = B2Q8EGNCQA;
534546
ENABLE_HARDENED_RUNTIME = YES;
535547
ENABLE_PREVIEWS = YES;
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
//
2+
// MoviesMiddleware.swift
3+
// ReduxAsync
4+
//
5+
// Created by chenyilong on 2024/7/21.
6+
//
7+
8+
import Foundation
9+
10+
// Middlewares
11+
func moviesMiddleware() -> Middleware<AppState> {
12+
13+
return { state, action, dispatch in
14+
15+
switch action {
16+
case let action as FetchMoviesAction:
17+
Webservice().getMoviesBySearch(search: action.search.urlEncode()) { result in
18+
switch result {
19+
case .success(let movies):
20+
if let movies = movies {
21+
print(movies)
22+
dispatch(SetMoviesAction(movies: movies))
23+
}
24+
25+
case .failure(let error):
26+
print(error.localizedDescription)
27+
}
28+
}
29+
default:
30+
break
31+
}
32+
33+
}
34+
35+
}

SwiftUI/SwiftUIRedux_MovieApp/Shared/Store/Store.swift

Lines changed: 1 addition & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -12,32 +12,6 @@ typealias Dispatcher = (Action) -> Void
1212
typealias Reducer<State: ReduxState> = (_ state: State, _ action: Action) -> State
1313
typealias Middleware<StoreState: ReduxState> = (StoreState, Action, @escaping Dispatcher) -> Void
1414

15-
// Middlewares
16-
func moviesMiddleware() -> Middleware<AppState> {
17-
18-
return { state, action, dispatch in
19-
20-
switch action {
21-
case _ as FetchMoviesAction:
22-
Webservice().getAllMovies(url: Constants.Url.moviesURL) { result in
23-
24-
switch result {
25-
case .success(let movies):
26-
print(movies)
27-
dispatch(SetMoviesAction(movies: movies))
28-
case .failure(let error):
29-
print(error.localizedDescription)
30-
}
31-
}
32-
default:
33-
break
34-
}
35-
36-
}
37-
38-
}
39-
40-
4115
protocol ReduxState { }
4216

4317
struct AppState: ReduxState {
@@ -51,6 +25,7 @@ struct MoviesState: ReduxState {
5125
protocol Action { }
5226

5327
struct FetchMoviesAction: Action {
28+
let search: String
5429
}
5530

5631
struct SetMoviesAction: Action {

SwiftUI/SwiftUIRedux_MovieApp/Shared/Views/ContentView.swift

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ struct ContentView: View {
1313

1414
struct Props {
1515
let movies: [Movie]
16-
let onMoviesFetch: () -> Void
16+
let onSearch: (String) -> Void
1717
}
1818

1919
func map(state: AppState, dispatch: @escaping Dispatcher) -> Props {
20-
Props(movies: state.moviesState.movies, onMoviesFetch: {
21-
dispatch(FetchMoviesAction())
20+
Props(movies: state.moviesState.movies, onSearch: { search in
21+
dispatch(FetchMoviesAction(search: search))
2222
})
2323
}
2424

@@ -28,15 +28,11 @@ struct ContentView: View {
2828

2929
VStack {
3030
List(props.movies, id: \.imdbId) { movie in
31-
HStack {
32-
URLImage(url: movie.poster)
33-
.frame(width: 100, height: 100)
34-
Text(movie.title)
35-
}
31+
MovieCell(movie: movie)
3632
}
3733

3834
.onAppear(perform: {
39-
props.onMoviesFetch()
35+
props.onSearch("Batman")
4036
})
4137

4238
}.navigationTitle("Movies").embedInNavigationView()
@@ -53,3 +49,15 @@ struct ContentView_Previews: PreviewProvider {
5349
return ContentView().environmentObject(store)
5450
}
5551
}
52+
53+
struct MovieCell: View {
54+
let movie: Movie
55+
var body: some View {
56+
HStack {
57+
URLImage(url: movie.poster)
58+
.frame(width: 100, height: 100)
59+
.cornerRadius(10)
60+
Text(movie.title)
61+
}
62+
}
63+
}

0 commit comments

Comments
 (0)