Skip to content

Commit

Permalink
[Feat] #95 - MemberProfileView 의 Feed 내용을 불러오기 위한 로직 추가 및 View 수정
Browse files Browse the repository at this point in the history
  • Loading branch information
Genesis2010 committed Aug 6, 2024
1 parent 00c9366 commit 1dd42dc
Show file tree
Hide file tree
Showing 5 changed files with 177 additions and 79 deletions.
64 changes: 60 additions & 4 deletions Treehouse/Treehouse/Global/ViewModel/MemberProfileViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,25 +15,81 @@ final class MemberProfileViewModel: BaseViewModel {
// MARK: - UseCase Property

@ObservationIgnored
private let readMemberInfoUseCase: GetReadMemberInfoUseCaseProtocol
private let readMemberInfoUseCase: GetReadMemberInfoUseCaseProtocol

@ObservationIgnored
private let readMemberFeedUseCase: GetReadMemberFeedUseCaseProtocol

var memberProfileData: ReadMemberInfoResponseEntity?
var errorMessage: String = ""

@ObservationIgnored
private var treehouseId: Int

@ObservationIgnored
private var memberId: Int

var memberFeedData: ReadMemberFeedResponseEntity?
var title = ""
var isLoading = true

// MARK: - init

init(readMemberInfoUseCase: GetReadMemberInfoUseCaseProtocol) {
init(readMemberInfoUseCase: GetReadMemberInfoUseCaseProtocol,
readMemberFeedUseCase: GetReadMemberFeedUseCaseProtocol,
treehouseId: Int,
memberId: Int
) {
self.readMemberInfoUseCase = readMemberInfoUseCase
self.readMemberFeedUseCase = readMemberFeedUseCase
self.treehouseId = treehouseId
self.memberId = memberId
}

func performAsyncTasks() async {
async let memberInfo = readMemberInfo(treehouseId: treehouseId, memberId: memberId)
async let memberFeed = readMemberFeed(treehouseId: treehouseId, memberId: memberId)

let (memberInfoResult, memberFeedResult) = await (memberInfo, memberFeed)

if memberInfoResult && memberFeedResult {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
self.isLoading = false
}
}
}
}

extension MemberProfileViewModel {
private extension MemberProfileViewModel {
func readMemberInfo(treehouseId: Int, memberId: Int) async -> Bool {
let result = await readMemberInfoUseCase.execute(treehouseId: treehouseId, memberId: memberId)

switch result {
case .success(let response):
memberProfileData = response
await MainActor.run {
memberProfileData = response
title = response.memberName
}
return true
case .failure(let error):
await MainActor.run {
self.errorMessage = error.localizedDescription
print(errorMessage)
}
return false
}
}

func readMemberFeed(treehouseId: Int, memberId: Int) async -> Bool {
let result = await readMemberFeedUseCase.execute(treehouseId: treehouseId, memberId: memberId)

switch result {
case .success(let response):

await MainActor.run {
memberFeedData = response
}

return true
case .failure(let error):
await MainActor.run {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,14 @@ struct FeedHomeView: View {
.navigationDestination(for: FeedRouter.self) { router in
viewRouter.buildScene(inputRouter: router, viewModel: feedViewModel)
}
.navigationDestination(for: ProfileRouter.self) { router in
switch router {
case .editProfileView:
viewRouter.buildScene(inputRouter: router, viewModel: userInfoViewModel)
case .memberProfileView:
viewRouter.buildScene(inputRouter: router, viewModel: feedViewModel)
}
}
.onAppear {
feedViewModel.currentTreehouseId = currentTreehouseInfoViewModel.currentTreehouseId
feedViewModel.userId = currentTreehouseInfoViewModel.userId
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,11 @@ struct FeedView: View {
VStack(spacing: 0) {
postTextField

feedRowView
if postViewModel.feedListData.isEmpty {
emptyFeedView
} else {
feedRowView
}
}
.popup(isPresented: $feedViewModel.isSelectEmojiView) {
if let postId = feedViewModel.currentPostId {
Expand Down Expand Up @@ -215,7 +219,7 @@ extension FeedView {
Image(.imgFeedempty)

Text("아직 올라온 게시글이 없어요")
.font(.fontGuide(.heading4))
.fontWithLineHeight(fontLevel: .heading4)
.foregroundStyle(.gray5)
}
.frame(height: 482)
Expand All @@ -224,7 +228,7 @@ extension FeedView {
@ViewBuilder
var feedRowView: some View {
ForEach(postViewModel.feedListData) { data in
VStack(spacing: 0) {
LazyVStack(spacing: 0) {
SinglePostView(postId: data.postId,
sentTime: data.postedAt,
postContent: data.context,
Expand All @@ -233,14 +237,12 @@ extension FeedView {
postType: .feedView)

VStack(alignment: .leading, spacing: 0) {
// if !(data.reactionList.reactionList.isEmpty) {
EmojiListView(emojiType: .feedView, postId: data.postId, feedEmojiData: data.reactionList)
.padding(.top, 10)
.onAppear {
postViewModel.feedEmojiData = data.reactionList
feedViewModel.currentPostId = data.postId
}
// }
EmojiListView(emojiType: .feedView, postId: data.postId, feedEmojiData: data.reactionList)
.padding(.top, 10)
.onAppear {
postViewModel.feedEmojiData = data.reactionList
feedViewModel.currentPostId = data.postId
}

CommentCountView(commentCount: data.commentCount)
.padding(.top, 10)
Expand All @@ -252,6 +254,10 @@ extension FeedView {
}
.padding(.leading, 62)
.padding(.bottom, 16)

Rectangle()
.frame(maxWidth: .infinity, maxHeight: 1)
.foregroundColor(.gray3)
}
.background(
Color.clear
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ struct PostDetailView: View {
@FocusState private var isKeyboardShowing: Bool

@State var isloading = true
// @GestureState private var dragOffset = CGSize.zero

// MARK: - View

Expand Down Expand Up @@ -90,31 +91,16 @@ struct PostDetailView: View {

}
}
.background(.grayscaleWhite)
.redacted(reason: isloading ? .placeholder : [])
}
.onTapGesture {
commentViewModel.commentState = .createComment
commentViewModel.createCommentMemberName = postDetailViewModel.detailFeedListData?.memberProfile.memberName ?? ""
hideKeyboard()
}
.navigationBarBackButtonHidden()
.navigationTitle("게시글")
.navigationBarTitleDisplayMode(.inline)
.toolbar {
ToolbarItem(placement: .topBarLeading) {
Button(action: {
viewRouter.pop()
}) {
Image(systemName: "chevron.left")
.foregroundColor(.treeBlack)
}
}

ToolbarItem(placement: .principal) {
Text("게시글")
.fontWithLineHeight(fontLevel: .body2)
.foregroundStyle(.treeBlack)
}
}
.popup(isPresented: $emojiViewModel.isSelectFeedEmojiView) {
if let postId = feedViewModel.currentPostId {
EmojiGridView(emojiType: .feedView, postId: postId)
Expand Down
136 changes: 89 additions & 47 deletions Treehouse/Treehouse/Presentation/Profile/Views/MemberProfileView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,66 +9,101 @@ import SwiftUI

struct MemberProfileView: View {

// MARK: - Property

var treehouseId: Int
var memberId: Int

// MARK: - State Property
@Environment(ViewRouter.self) var viewRouter: ViewRouter
@State var memberProfileViewModel = MemberProfileViewModel(readMemberInfoUseCase: ReadMemberInfoUseCase(repository: MemberRepositoryImpl()))
@Environment (FeedViewModel.self) var feedViewModel

@State var memberProfileViewModel: MemberProfileViewModel
@State var emojiViewModel: EmojiViewModel = EmojiViewModel(createReactionToPostUseCase: CreateReactionToPostUseCase(repository: FeedRepositoryImpl()))
@State var postViewModel = PostViewModel(readFeedPostUseCase: ReadFeedPostUseCase(repository: FeedRepositoryImpl()), createFeedPostsUseCase: CreateFeedPostsUseCase(repository: FeedRepositoryImpl()))

@State var isPresent = false
@State private var userName: String = "username"
@State private var userId: String = "userid"
@State private var bio: String = "바이오입니다."
@State private var branchCount: Int = 0
@State private var treeHouseCount: Int = 0
@State private var root: String = "Root"
@State private var selectedGroupId: UUID?
@State var isLoading = true

// MARK: - View

var body: some View {
ScrollView(.vertical) {
VStack(spacing: 0) {
if let data = memberProfileViewModel.memberProfileData {
UserInfoView(infoType: .memberProfile,
treememberName: data.memberName,
userName: data.userName,
profileImageUrl: data.profileImageUrl,
bio: data.bio,
branchCount: data.closestMemberCount,
treeHouseCount: data.treehouseCount,
root: "\(data.fromMe)",
inviteAction: nil,
branchAction: nil,
profileAction: nil)
.padding(.top, 15)
ZStack {
ScrollView(.vertical) {
VStack(spacing: 0) {
if let data = memberProfileViewModel.memberProfileData {
UserInfoView(infoType: .memberProfile,
treememberName: data.memberName,
userName: data.userName,
profileImageUrl: data.profileImageUrl,
bio: data.bio,
branchCount: data.closestMemberCount,
treeHouseCount: data.treehouseCount,
root: "\(data.fromMe)",
inviteAction: nil,
branchAction: nil,
profileAction: nil)
.padding(.top, 15)
}

if let data = memberProfileViewModel.memberFeedData {
ForEach(data.postList) { feed in
VStack(spacing: 0) {
SinglePostView(postId: feed.postId,
sentTime: feed.postedAt,
postContent: feed.context,
postImageURLs: feed.pictureUrlList,
memberProfile: data.memberProfile,
postType: .feedView)

VStack(alignment: .leading, spacing: 0) {
EmojiListView(emojiType: .feedView, postId: feed.postId, feedEmojiData: feed.reactionList)
.environment(emojiViewModel)
.environment(postViewModel)
.padding(.top, 10)
.onAppear {
feedViewModel.currentPostId = feed.postId
}

CommentCountView(commentCount: feed.commentCount)
.padding(.top, 10)
.padding(.trailing, 16)
.onTapGesture {
feedViewModel.currentPostId = feed.postId
viewRouter.push(FeedRouter.postDetailView)
}
}
.padding(.leading, 62)
.padding(.bottom, 16)
}
.background(
Color.clear
.contentShape(Rectangle())
.onTapGesture {
feedViewModel.currentPostId = feed.postId
viewRouter.push(FeedRouter.postDetailView)
}
)
}
}
}
}
}
.navigationBarBackButtonHidden()
.navigationBarTitleDisplayMode(.inline)
.toolbar {
ToolbarItem(placement: .topBarLeading) {
Button(action: {
viewRouter.pop()
}) {
Image(systemName: "chevron.left")
.foregroundColor(.treeBlack)
}
.padding(.top, 5)
.refreshable {
await memberProfileViewModel.performAsyncTasks()
}

ToolbarItem(placement: .principal) {
Text(memberProfileViewModel.memberProfileData?.memberName ?? "")
.fontWithLineHeight(fontLevel: .body2)
.foregroundStyle(.treeBlack)
if memberProfileViewModel.isLoading == true {
VStack {
Spacer()

LottieView(lottieFile: "treehouse_loading", speed: 1)
.frame(width: 100, height: 100)

Spacer()
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(.grayscaleWhite)
}
}
.navigationTitle(memberProfileViewModel.title)
.navigationBarTitleDisplayMode(.inline)
.task {
_ = await memberProfileViewModel.readMemberInfo(treehouseId: treehouseId, memberId: memberId)
await memberProfileViewModel.performAsyncTasks()
}
}
}
Expand All @@ -77,8 +112,15 @@ struct MemberProfileView: View {

#Preview {
NavigationStack {
MemberProfileView(treehouseId: 0, memberId: 0)
.environment(ViewRouter())
MemberProfileView(
memberProfileViewModel: MemberProfileViewModel(
readMemberInfoUseCase: ReadMemberInfoUseCase(repository: MemberRepositoryImpl()),
readMemberFeedUseCase: ReadMemberFeedUseCase(repository: MemberRepositoryImpl()),
treehouseId: 0,
memberId: 0
)
)
.environment(ViewRouter())
}
}

0 comments on commit 1dd42dc

Please sign in to comment.