Skip to content

Commit 04100a5

Browse files
committed
refactor: 리뷰 홈 탭별 파일 분리
1 parent 41aac05 commit 04100a5

File tree

5 files changed

+164
-123
lines changed

5 files changed

+164
-123
lines changed

PyeonHae/PyeonHae.xcodeproj/project.pbxproj

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
5418328A29B21FBB002DA931 /* SignUpSuccessView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5418328929B21FBB002DA931 /* SignUpSuccessView.swift */; };
3030
5419E1D42BBFC501000D6CA3 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5419E1D32BBFC501000D6CA3 /* Assets.xcassets */; };
3131
5419E1D62BBFC9FC000D6CA3 /* Security.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 5419E1D52BBFC9FC000D6CA3 /* Security.xcconfig */; };
32+
541CB8EC2BC65A9300D9931E /* AllReviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 541CB8EB2BC65A9300D9931E /* AllReviewView.swift */; };
33+
541CB8EE2BC65ABA00D9931E /* FollowingReviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 541CB8ED2BC65ABA00D9931E /* FollowingReviewView.swift */; };
3234
5420D1BA29F02AB200A78000 /* SearchBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5420D1B929F02AB200A78000 /* SearchBar.swift */; };
3335
5420D1BD29F02AD000A78000 /* SearchStartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5420D1BC29F02AD000A78000 /* SearchStartView.swift */; };
3436
5420D1C029F02AEF00A78000 /* SearchHomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5420D1BF29F02AEF00A78000 /* SearchHomeView.swift */; };
@@ -172,6 +174,8 @@
172174
5418328929B21FBB002DA931 /* SignUpSuccessView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignUpSuccessView.swift; sourceTree = "<group>"; };
173175
5419E1D32BBFC501000D6CA3 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
174176
5419E1D52BBFC9FC000D6CA3 /* Security.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Security.xcconfig; sourceTree = "<group>"; };
177+
541CB8EB2BC65A9300D9931E /* AllReviewView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AllReviewView.swift; sourceTree = "<group>"; };
178+
541CB8ED2BC65ABA00D9931E /* FollowingReviewView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowingReviewView.swift; sourceTree = "<group>"; };
175179
5420D1B929F02AB200A78000 /* SearchBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchBar.swift; sourceTree = "<group>"; };
176180
5420D1BC29F02AD000A78000 /* SearchStartView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchStartView.swift; sourceTree = "<group>"; };
177181
5420D1BF29F02AEF00A78000 /* SearchHomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchHomeView.swift; sourceTree = "<group>"; };
@@ -663,6 +667,8 @@
663667
54F3C3E7298C025200C10FF5 /* ReviewHome.swift */,
664668
D5409FE12994FA4F0034B250 /* EditReview */,
665669
D5D1BCAD29938B6D00F25941 /* UserDetailView */,
670+
541CB8EB2BC65A9300D9931E /* AllReviewView.swift */,
671+
541CB8ED2BC65ABA00D9931E /* FollowingReviewView.swift */,
666672
);
667673
path = Review;
668674
sourceTree = "<group>";
@@ -929,6 +935,7 @@
929935
543CEAC329CF2A5900CDB0C8 /* ProductsAPI.swift in Sources */,
930936
54C50C6E296984A60092AF39 /* SignupCheckPasswordView.swift in Sources */,
931937
542F03A62997893A00DBF9C8 /* TopTabBar.swift in Sources */,
938+
541CB8EC2BC65A9300D9931E /* AllReviewView.swift in Sources */,
932939
54CC11E629571E52007DAD20 /* PyeonHaeApp.swift in Sources */,
933940
D5D1BCAF29938B8C00F25941 /* UserPageView.swift in Sources */,
934941
D506C06129AF3A1900B9EA96 /* ReviewTextCell.swift in Sources */,
@@ -972,6 +979,7 @@
972979
54AFA1F129ACFFB50058DB39 /* TagsModel.swift in Sources */,
973980
54AFA1EE29ACF9840058DB39 /* APIManager.swift in Sources */,
974981
54DCA7E62B4E71F700ABE546 /* UIApplicationExtension.swift in Sources */,
982+
541CB8EE2BC65ABA00D9931E /* FollowingReviewView.swift in Sources */,
975983
54F406D02B4D141400ED281C /* NavigationBar.swift in Sources */,
976984
549CBA832A2F1BF20074AFA5 /* ReviewViewModel.swift in Sources */,
977985
D53658BF2A236A3400B484F9 /* reviewStarButton.swift in Sources */,

PyeonHae/PyeonHae.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
//
2+
// AllReviewView.swift
3+
// PyeonHae
4+
//
5+
// Created by 정건호 on 4/10/24.
6+
//
7+
8+
import SwiftUI
9+
10+
struct AllReviewView: View {
11+
@ObservedObject var reviewViewModel: ReviewViewModel
12+
@Binding var showFilter: Bool
13+
@Binding var filterOrSortClicked: Bool
14+
@Binding var showUserPage: Bool
15+
@Binding var selectedReviewerId: Int
16+
17+
var body: some View {
18+
ReviewFilterView(
19+
showFilter: $showFilter,
20+
filterClicked: $filterOrSortClicked,
21+
categoryIds: $reviewViewModel.categoryIds,
22+
tagIds: $reviewViewModel.tagIds,
23+
ratings: $reviewViewModel.ratings
24+
)
25+
.padding(.top, 10)
26+
SortView(
27+
type: .review,
28+
elementCount: reviewViewModel.latestReviewCount,
29+
sortBy: $reviewViewModel.sortBy,
30+
sortClicked: $filterOrSortClicked,
31+
content: {
32+
GeometryReader { geometry in
33+
if reviewViewModel.isLoading {
34+
LoadingView()
35+
.frame(width: geometry.size.width)
36+
.frame(minHeight: geometry.size.height)
37+
} else {
38+
if reviewViewModel.reviewList.isEmpty {
39+
VStack {
40+
Spacer().frame(height: 53)
41+
Image(name: .emptyReviewImage)
42+
Spacer().frame(height: 12)
43+
Text("앗! 등록된 리뷰가 없어요")
44+
.font(.pretendard(.semiBold, 16))
45+
.foregroundColor(.grayscale85)
46+
Spacer().frame(height: 2)
47+
Text("첫 번째로 리뷰를 등록해보세요.")
48+
.font(.pretendard(.light, 14))
49+
.foregroundColor(.grayscale70)
50+
Spacer().frame(height: 53)
51+
}
52+
.frame(width: geometry.size.width)
53+
.frame(minHeight: geometry.size.height)
54+
}
55+
}
56+
}
57+
DefaultList {
58+
ForEach(reviewViewModel.reviewList.enumeratedArray(), id: \.element) { index, review in
59+
VStack {
60+
ReviewUserInfo(
61+
reviewType: .normal,
62+
profileUrl: review.reviewerProfileImageUrl,
63+
nickname: review.reviewerNickname,
64+
tags: review.reviewerTags,
65+
isMe: review.reviewerId == UserShared.userId,
66+
isFollowing: review.isFollowing,
67+
followAction: {
68+
reviewViewModel.requestFollow(userId: review.reviewerId)
69+
},
70+
unfollowAction: {
71+
reviewViewModel.requestUnfollow(userId: review.reviewerId)
72+
},
73+
reviewerId: review.reviewerId,
74+
showUserPage: $showUserPage,
75+
selectedReviewerId: $selectedReviewerId
76+
)
77+
HStack(spacing: 0) {
78+
ReviewContents(
79+
reviewerId: review.reviewerId,
80+
rating: review.reviewRating,
81+
imageUrls: review.reviewImageUrls,
82+
content: review.reviewContent,
83+
isReviewLiked: review.isReviewLiked,
84+
likeCount: review.reviewLikeCount,
85+
likeAction: {
86+
reviewViewModel.requestLikeReview(id: review.reviewId)
87+
},
88+
unlikeAction: {
89+
reviewViewModel.requestUnlikeReview(id: review.reviewId)
90+
}
91+
)
92+
}
93+
ReviewProduct(
94+
imageUrl: review.productImageUrl,
95+
manufacturer: review.productManufacturer,
96+
name: review.productName,
97+
isBookmarked: review.isProductBookmarked,
98+
bookmarkAction: {
99+
reviewViewModel.requestProductBookmark(productID: review.productId)
100+
},
101+
unBookmarkAction: {
102+
reviewViewModel.requestProductUnBookmark(productID: review.productId)
103+
}
104+
)
105+
Color.grayscale30.opacity(0.5).frame(height: 1)
106+
.padding(.bottom, 16)
107+
}
108+
.onAppear {
109+
if reviewViewModel.reviewList.count - 3 == index,
110+
!reviewViewModel.last {
111+
reviewViewModel.page += 1
112+
reviewViewModel.requestMoreReviews()
113+
}
114+
}
115+
}
116+
}
117+
.simultaneousGesture(DragGesture().onChanged { _ in
118+
withAnimation(.easeInOut(duration: 0.3)) {
119+
self.showFilter = false
120+
}
121+
})
122+
},
123+
searchAction: {
124+
reviewViewModel.requestReviews()
125+
}
126+
)
127+
}
128+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//
2+
// FollowingReviewView.swift
3+
// PyeonHae
4+
//
5+
// Created by 정건호 on 4/10/24.
6+
//
7+
8+
import SwiftUI
9+
10+
struct FollowingReviewView: View {
11+
var body: some View {
12+
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
13+
}
14+
}
15+
16+
#Preview {
17+
FollowingReviewView()
18+
}

PyeonHae/PyeonHae/Views/Review/ReviewHome.swift

Lines changed: 8 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,14 @@ struct ReviewHome: View {
2929
TopTabBar(
3030
tabItems: tabItems,
3131
contents: [
32-
AnyView(allReviewTab()),
33-
AnyView(followReviewTab())
32+
AnyView(AllReviewView(
33+
reviewViewModel: reviewViewModel,
34+
showFilter: $showFilter,
35+
filterOrSortClicked: $filterOrSortClicked,
36+
showUserPage: $showUserPage,
37+
selectedReviewerId: $selectedReviewerId)
38+
),
39+
AnyView(FollowingReviewView())
3440
],
3541
type: .review
3642
)
@@ -82,124 +88,4 @@ struct ReviewHome: View {
8288
}
8389
.frame(height: 44)
8490
}
85-
86-
@ViewBuilder
87-
private func allReviewTab() -> some View {
88-
ReviewFilterView(
89-
showFilter: $showFilter,
90-
filterClicked: $filterOrSortClicked,
91-
categoryIds: $reviewViewModel.categoryIds,
92-
tagIds: $reviewViewModel.tagIds,
93-
ratings: $reviewViewModel.ratings
94-
)
95-
.padding(.top, 10)
96-
SortView(
97-
type: .review,
98-
elementCount: reviewViewModel.latestReviewCount,
99-
sortBy: $reviewViewModel.sortBy,
100-
sortClicked: $filterOrSortClicked,
101-
content: {
102-
GeometryReader { geometry in
103-
if reviewViewModel.isLoading {
104-
LoadingView()
105-
.frame(width: geometry.size.width)
106-
.frame(minHeight: geometry.size.height)
107-
} else {
108-
if reviewViewModel.reviewList.isEmpty {
109-
VStack {
110-
Spacer().frame(height: 53)
111-
Image(name: .emptyReviewImage)
112-
Spacer().frame(height: 12)
113-
Text("앗! 등록된 리뷰가 없어요")
114-
.font(.pretendard(.semiBold, 16))
115-
.foregroundColor(.grayscale85)
116-
Spacer().frame(height: 2)
117-
Text("첫 번째로 리뷰를 등록해보세요.")
118-
.font(.pretendard(.light, 14))
119-
.foregroundColor(.grayscale70)
120-
Spacer().frame(height: 53)
121-
}
122-
.frame(width: geometry.size.width)
123-
.frame(minHeight: geometry.size.height)
124-
}
125-
}
126-
}
127-
DefaultList {
128-
ForEach(reviewViewModel.reviewList.enumeratedArray(), id: \.element) { index, review in
129-
VStack {
130-
ReviewUserInfo(
131-
reviewType: .normal,
132-
profileUrl: review.reviewerProfileImageUrl,
133-
nickname: review.reviewerNickname,
134-
tags: review.reviewerTags,
135-
isMe: review.reviewerId == UserShared.userId,
136-
isFollowing: review.isFollowing,
137-
followAction: {
138-
reviewViewModel.requestFollow(userId: review.reviewerId)
139-
},
140-
unfollowAction: {
141-
reviewViewModel.requestUnfollow(userId: review.reviewerId)
142-
},
143-
reviewerId: review.reviewerId,
144-
showUserPage: $showUserPage,
145-
selectedReviewerId: $selectedReviewerId
146-
)
147-
HStack(spacing: 0) {
148-
ReviewContents(
149-
reviewerId: review.reviewerId,
150-
rating: review.reviewRating,
151-
imageUrls: review.reviewImageUrls,
152-
content: review.reviewContent,
153-
isReviewLiked: review.isReviewLiked,
154-
likeCount: review.reviewLikeCount,
155-
likeAction: {
156-
reviewViewModel.requestLikeReview(id: review.reviewId)
157-
},
158-
unlikeAction: {
159-
reviewViewModel.requestUnlikeReview(id: review.reviewId)
160-
}
161-
)
162-
}
163-
ReviewProduct(
164-
imageUrl: review.productImageUrl,
165-
manufacturer: review.productManufacturer,
166-
name: review.productName,
167-
isBookmarked: review.isProductBookmarked,
168-
bookmarkAction: {
169-
reviewViewModel.requestProductBookmark(productID: review.productId)
170-
},
171-
unBookmarkAction: {
172-
reviewViewModel.requestProductUnBookmark(productID: review.productId)
173-
}
174-
)
175-
Color.grayscale30.opacity(0.5).frame(height: 1)
176-
.padding(.bottom, 16)
177-
}
178-
.onAppear {
179-
if reviewViewModel.reviewList.count - 3 == index,
180-
!reviewViewModel.last {
181-
reviewViewModel.page += 1
182-
reviewViewModel.requestMoreReviews()
183-
}
184-
}
185-
}
186-
}
187-
.simultaneousGesture(DragGesture().onChanged { _ in
188-
withAnimation(.easeInOut(duration: 0.3)) {
189-
self.showFilter = false
190-
}
191-
})
192-
},
193-
searchAction: {
194-
reviewViewModel.requestReviews()
195-
}
196-
)
197-
}
198-
}
199-
200-
private func followReviewTab() -> some View {
201-
VStack {
202-
Text("팔로우 탭")
203-
Spacer()
204-
}
20591
}

0 commit comments

Comments
 (0)