diff --git a/TeamIntroduce/TeamIntroduce/Sources/DesignSytstem/Componet/Navigation/CustomNavigationBackBar.swift b/TeamIntroduce/TeamIntroduce/Sources/DesignSytstem/Componet/Navigation/CustomNavigationBackBar.swift index 42f7c2a..5c1ff72 100644 --- a/TeamIntroduce/TeamIntroduce/Sources/DesignSytstem/Componet/Navigation/CustomNavigationBackBar.swift +++ b/TeamIntroduce/TeamIntroduce/Sources/DesignSytstem/Componet/Navigation/CustomNavigationBackBar.swift @@ -14,7 +14,7 @@ import SwiftUI init( text: String = "", - buttonAction: @escaping () -> Void, + buttonAction: @escaping () -> Void ) { self.buttonAction = buttonAction self.text = text diff --git a/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/MemberDetailView.swift b/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/MemberDetailView.swift deleted file mode 100644 index dbe15dd..0000000 --- a/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/MemberDetailView.swift +++ /dev/null @@ -1,56 +0,0 @@ -// -// MemberDetailView.swift -// TeamIntroduce -// -// Created by 김민희 on 8/11/25. -// - -import SwiftUI - -struct MemberProfile { - var image: String = "person.crop.circle" - var name: String = "김철수" - var role: String = "프론트엔드개발자" - var mbti: String = "ENFP" - var introduction: String = "사용자경험을최우선으로생각하는프론트엔드개발자입니다.새로운기술을배우는것을좋아하고,팀원들과아이디어를 공유하며함께성장하는것을즐깁니다." - var strengths: [String] = ["창의적인문제해결능력", "새로운기술에대한빠른학습력", "사용자중심적사고", "긍정적이고적극적인커뮤니케이션"] - var collabStyle: String = "아이디어를 자유롭게공유하고,다양한관점에서문제를바라보는것을 선호합니다.팀원들의의견을경청하고,함께더나은해결책을찾아가는협업을추구합니다." - var blogURL: String = "https: //chulsoo.dev" -} - -struct MemberDetailView: View { - private let profile = MemberProfile() - @ObservedObject var coordinator: IntroduceCoordinator - - var body: some View { - ScrollView { - Spacer() - .frame(height: 14) - - CustomNavigationBackBar { - coordinator.goBack() - } - - VStack(spacing: 20) { - MemberProfileView(profile: profile) - - IntroductionView(profile: profile) - - StrengthsView(profile: profile) - - CollabStyleView(profile: profile) - - BlogView(profile: profile) - - EditButton() - } - .padding(.horizontal, 14) - } - } -} - -#Preview { - @Previewable @StateObject var coordinator: IntroduceCoordinator = IntroduceCoordinator() - - MemberDetailView(coordinator: coordinator) -} diff --git a/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/BlogView.swift b/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/Components/DisplayView/BlogDisplayView.swift similarity index 72% rename from TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/BlogView.swift rename to TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/Components/DisplayView/BlogDisplayView.swift index 5d82632..24102e8 100644 --- a/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/BlogView.swift +++ b/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/Components/DisplayView/BlogDisplayView.swift @@ -1,23 +1,22 @@ // -// BlogView.swift +// BlogDisplayView.swift // TeamIntroduce // // Created by 김민희 on 8/12/25. // import SwiftUI -struct BlogView: View { - let profile: MemberProfile - +struct BlogDisplayView: View { + var blogURL: String + var body: some View { VStack(alignment: .leading, spacing: 14) { Text("블로그") .pretendardFont(family: .semiBold, size: 14) - - Text(profile.blogURL) + + Text(blogURL) .pretendardFont(family: .regular, size: 13) .cardStyle() - } } } diff --git a/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/CollabStyleView.swift b/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/Components/DisplayView/CollabStyleDisplayView.swift similarity index 76% rename from TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/CollabStyleView.swift rename to TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/Components/DisplayView/CollabStyleDisplayView.swift index f22bca0..fb72b72 100644 --- a/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/CollabStyleView.swift +++ b/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/Components/DisplayView/CollabStyleDisplayView.swift @@ -1,19 +1,21 @@ // -// CollabStyleView.swift +// CollabStyleDisplayView.swift // TeamIntroduce // // Created by 김민희 on 8/12/25. // import SwiftUI -struct CollabStyleView: View { - let profile: MemberProfile +struct CollabStyleDisplayView: View { + var collabStyle: String + var body: some View { VStack(alignment: .leading, spacing: 14) { Text("협업스타일") .pretendardFont(family: .semiBold, size: 14) - Text(profile.collabStyle) + + Text(collabStyle) .pretendardFont(family: .regular, size: 13) .foregroundStyle(.textSecondary100) .lineSpacing(5) diff --git a/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/IntroductionView.swift b/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/Components/DisplayView/IntroductionDisplayView.swift similarity index 75% rename from TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/IntroductionView.swift rename to TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/Components/DisplayView/IntroductionDisplayView.swift index b499cc2..3350b7a 100644 --- a/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/IntroductionView.swift +++ b/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/Components/DisplayView/IntroductionDisplayView.swift @@ -1,19 +1,20 @@ // -// IntroductionView.swift +// IntroductionDisplayView.swift // TeamIntroduce // // Created by 김민희 on 8/12/25. // import SwiftUI -struct IntroductionView: View { - let profile: MemberProfile - +struct IntroductionDisplayView: View { + var introduction: String + var body: some View { VStack(alignment: .leading, spacing: 14) { Text("자기소개") .pretendardFont(family: .semiBold, size: 14) - Text(profile.introduction) + + Text(introduction) .pretendardFont(family: .regular, size: 13) .foregroundStyle(.textSecondary100) .lineSpacing(5) diff --git a/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/StrengthsView.swift b/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/Components/DisplayView/StrengthsDisplayView.swift similarity index 82% rename from TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/StrengthsView.swift rename to TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/Components/DisplayView/StrengthsDisplayView.swift index 16de036..cae130a 100644 --- a/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/StrengthsView.swift +++ b/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/Components/DisplayView/StrengthsDisplayView.swift @@ -1,20 +1,21 @@ // -// StrengthsView.swift +// StrengthsDisplayView.swift // TeamIntroduce // // Created by 김민희 on 8/12/25. // import SwiftUI -struct StrengthsView: View { - let profile: MemberProfile - +struct StrengthsDisplayView: View { + var strengths: [String] + var body: some View { VStack(alignment: .leading, spacing: 14) { Text("주요장점") .pretendardFont(family: .semiBold, size: 14) + VStack { - ForEach(profile.strengths, id: \.self) { item in + ForEach(strengths, id: \.self) { item in HStack(alignment: .firstTextBaseline, spacing: 8) { Circle().frame(width: 5, height: 5) Text(item) diff --git a/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/EditButton.swift b/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/Components/EditButton.swift similarity index 63% rename from TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/EditButton.swift rename to TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/Components/EditButton.swift index 763dda9..2e38ab6 100644 --- a/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/EditButton.swift +++ b/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/Components/EditButton.swift @@ -7,14 +7,19 @@ import SwiftUI struct EditButton: View { - var body: some View { - Button(action: {}) { - Text("수정") - .foregroundColor(.white) - } + var text: String + var action: () -> Void + + var body: some View { + Button { + action() + } label: { + Text(text) + .foregroundColor(.white) .frame(maxWidth: .infinity) .frame(height: 48) .background(.backGroundPrimary) .clipShape(RoundedRectangle(cornerRadius: 16)) } + } } diff --git a/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/Components/EditView/BlogEditView.swift b/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/Components/EditView/BlogEditView.swift new file mode 100644 index 0000000..863c3dd --- /dev/null +++ b/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/Components/EditView/BlogEditView.swift @@ -0,0 +1,22 @@ +// +// BlogEditView.swift +// TeamIntroduce +// +// Created by 김민희 on 8/14/25. +// +import SwiftUI + +struct BlogEditView: View { + @Binding var blogURL: String + + var body: some View { + VStack(alignment: .leading, spacing: 14) { + Text("블로그") + .pretendardFont(family: .semiBold, size: 14) + + TextField("블로그 URL", text: $blogURL) + .pretendardFont(family: .regular, size: 13) + .cardStyle() + } + } +} diff --git a/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/Components/EditView/CollabStyleEditView.swift b/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/Components/EditView/CollabStyleEditView.swift new file mode 100644 index 0000000..dc01618 --- /dev/null +++ b/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/Components/EditView/CollabStyleEditView.swift @@ -0,0 +1,26 @@ +// +// CollabStyleEditView.swift +// TeamIntroduce +// +// Created by 김민희 on 8/14/25. +// +import SwiftUI + +struct CollabStyleEditView: View { + @Binding var collabStyle: String + + + var body: some View { + VStack(alignment: .leading, spacing: 14) { + Text("협업스타일") + .pretendardFont(family: .semiBold, size: 14) + + TextField("협업스타일", text: $collabStyle, axis: .vertical) + .pretendardFont(family: .regular, size: 13) + .foregroundStyle(.textSecondary100) + .lineSpacing(5) + .lineLimit(1...10) + .cardStyle() + } + } +} diff --git a/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/Components/EditView/IntroductionEditView.swift b/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/Components/EditView/IntroductionEditView.swift new file mode 100644 index 0000000..8f12d06 --- /dev/null +++ b/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/Components/EditView/IntroductionEditView.swift @@ -0,0 +1,25 @@ +// +// IntroductionEditView.swift +// TeamIntroduce +// +// Created by 김민희 on 8/14/25. +// +import SwiftUI + +struct IntroductionEditView: View { + @Binding var introduction: String + + var body: some View { + VStack(alignment: .leading, spacing: 14) { + Text("자기소개") + .pretendardFont(family: .semiBold, size: 14) + + TextField("", text: $introduction, axis: .vertical) + .pretendardFont(family: .regular, size: 13) + .foregroundStyle(.textSecondary100) + .lineSpacing(5) + .lineLimit(1...10) + .cardStyle() + } + } +} diff --git a/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/Components/EditView/StrengthsEditView.swift b/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/Components/EditView/StrengthsEditView.swift new file mode 100644 index 0000000..e93cb75 --- /dev/null +++ b/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/Components/EditView/StrengthsEditView.swift @@ -0,0 +1,48 @@ +// +// StrengthsEditView.swift +// TeamIntroduce +// +// Created by 김민희 on 8/14/25. +// +import SwiftUI + +struct StrengthsEditView: View { + @Binding var strengths: [String] + + var body: some View { + VStack(alignment: .leading, spacing: 14) { + Text("주요장점") + .pretendardFont(family: .semiBold, size: 14) + + VStack { + ForEach(strengths.indices, id: \.self) { index in + HStack { + Button { + strengths.remove(at: index) + } label: { + Image(systemName: "minus.circle.fill") + .foregroundStyle(.red) + } + + TextField("", text: $strengths[index]) + .pretendardFont(family: .regular, size: 13) + .foregroundStyle(.textSecondary100) + .lineLimit(1...5) + } + } + + Button { + strengths.append("") + } label: { + HStack { + Image(systemName: "plus.circle.fill") + Text("장점 추가하기") + .pretendardFont(family: .regular, size: 13) + } + } + .padding(.top, 10) + } + .cardStyle() + } + } +} diff --git a/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/MemberProfileView.swift b/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/Components/MemberProfileView.swift similarity index 100% rename from TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/MemberProfileView.swift rename to TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/Components/MemberProfileView.swift diff --git a/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/MemberDetailView.swift b/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/MemberDetailView.swift new file mode 100644 index 0000000..c6a879e --- /dev/null +++ b/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/View/MemberDetailView.swift @@ -0,0 +1,85 @@ +// +// MemberDetailView.swift +// TeamIntroduce +// +// Created by 김민희 on 8/11/25. +// + +import SwiftUI + +struct MemberProfile { + var image: String = "person.crop.circle" + var name: String = "김철수" + var role: String = "프론트엔드개발자" + var mbti: String = "ENFP" + var introduction: String = "사용자경험을최우선으로생각하는프론트엔드개발자입니다.새로운기술을배우는것을좋아하고,팀원들과아이디어를 공유하며함께성장하는것을즐깁니다." + var strengths: [String] = ["창의적인문제해결능력", "새로운기술에대한빠른학습력", "사용자중심적사고", "긍정적이고적극적인커뮤니케이션"] + var collabStyle: String = "아이디어를 자유롭게공유하고,다양한관점에서문제를바라보는것을 선호합니다.팀원들의의견을경청하고,함께더나은해결책을찾아가는협업을추구합니다." + var blogURL: String = "https: //chulsoo.dev" +} + +struct MemberDetailView: View { + @ObservedObject var coordinator: IntroduceCoordinator + @StateObject var viewModel = MemberDetailViewModel() + + var body: some View { + ZStack { + ScrollView { + Spacer() + .frame(height: 14) + + CustomNavigationBackBar { + coordinator.goBack() + } + + Spacer().frame(height: 20) + + VStack(spacing: 20) { + MemberProfileView(profile: viewModel.profile) + + if viewModel.isEditing { + IntroductionEditView(introduction: $viewModel.editingProfile.introduction) + + StrengthsEditView(strengths: $viewModel.editingProfile.strengths) + + CollabStyleEditView(collabStyle: $viewModel.editingProfile.collabStyle) + + BlogEditView(blogURL: $viewModel.editingProfile.blogURL) + } else { + IntroductionDisplayView(introduction: viewModel.profile.introduction) + + StrengthsDisplayView(strengths: viewModel.profile.strengths) + + CollabStyleDisplayView(collabStyle: viewModel.profile.collabStyle) + + BlogDisplayView(blogURL: viewModel.profile.blogURL) + } + } + .padding(.horizontal, 16) + .padding(.bottom, 80) + } + .scrollIndicators(.hidden) + + VStack { + Spacer() + + if viewModel.isEditing { + EditButton(text: "저장") { + viewModel.saveEditing() + } + } else { + EditButton(text: "수정") { + viewModel.startEditing() + } + } + } + .padding(.horizontal, 16) + } + } +} + +#Preview { + @Previewable @StateObject var coordinator: IntroduceCoordinator = IntroduceCoordinator() + + MemberDetailView(coordinator: coordinator) +} diff --git a/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/ViewModel/MemberDetailViewModel.swift b/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/ViewModel/MemberDetailViewModel.swift new file mode 100644 index 0000000..f0d65a4 --- /dev/null +++ b/TeamIntroduce/TeamIntroduce/Sources/Presnetaion/MemberDetail/ViewModel/MemberDetailViewModel.swift @@ -0,0 +1,33 @@ +// +// MemberDetailViewModel.swift +// TeamIntroduce +// +// Created by 김민희 on 8/13/25. +// + +import SwiftUI + +class MemberDetailViewModel: ObservableObject { + @Published var isEditing: Bool = false + @Published var profile: MemberProfile + @Published var editingProfile: MemberProfile + + init() { + self.profile = MemberProfile() + self.editingProfile = MemberProfile() + } + + func startEditing() { + isEditing = true + } + + func cancelEditing() { + isEditing = false + } + + func saveEditing() { + profile = editingProfile + isEditing = false + } + +}