Skip to content

Commit

Permalink
Merge pull request #393 from School-of-Company/391-input-school-api-c…
Browse files Browse the repository at this point in the history
…onnect

🔀 :: [#391] 학교 정보 입력 기능 추가
  • Loading branch information
uuuunseo authored Aug 8, 2024
2 parents da814a7 + 5310f4f commit 7ce03ab
Show file tree
Hide file tree
Showing 21 changed files with 234 additions and 70 deletions.
26 changes: 18 additions & 8 deletions App/Sources/Application/NeedleGenerated.swift
Original file line number Diff line number Diff line change
Expand Up @@ -536,15 +536,23 @@ private func factory4d07a7e30330c03d5d63f47b58f8f304c97af4d5(_ component: Needle
return WithdrawUserListDependencyc576fefb2eff9e703c66Provider(appComponent: parent1(component) as! AppComponent)
}
private class InputSchoolDependencye8d4bffe76e2533005e2Provider: InputSchoolDependency {


init() {

var createdSchoolUseCase: any CreatedSchoolUseCase {
return appComponent.createdSchoolUseCase
}
var modifySchoolUseCase: any ModifySchoolUseCase {
return appComponent.modifySchoolUseCase
}
var deleteSchoolUseCase: any DeleteSchoolUseCase {
return appComponent.deleteSchoolUseCase
}
private let appComponent: AppComponent
init(appComponent: AppComponent) {
self.appComponent = appComponent
}
}
/// ^->AppComponent->InputSchoolComponent
private func factorya02470c933733e398aeee3b0c44298fc1c149afb(_ component: NeedleFoundation.Scope) -> AnyObject {
return InputSchoolDependencye8d4bffe76e2533005e2Provider()
private func factorya02470c933733e398aeef47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
return InputSchoolDependencye8d4bffe76e2533005e2Provider(appComponent: parent1(component) as! AppComponent)
}
private class FindPasswordDependency542eacce769b9dc25904Provider: FindPasswordDependency {
var sendEmailCertificationLinkUseCase: any SendEmailCertificationLinkUseCase {
Expand Down Expand Up @@ -1165,7 +1173,9 @@ extension WithdrawUserListComponent: Registration {
}
extension InputSchoolComponent: Registration {
public func registerItems() {

keyPathToName[\InputSchoolDependency.createdSchoolUseCase] = "createdSchoolUseCase-any CreatedSchoolUseCase"
keyPathToName[\InputSchoolDependency.modifySchoolUseCase] = "modifySchoolUseCase-any ModifySchoolUseCase"
keyPathToName[\InputSchoolDependency.deleteSchoolUseCase] = "deleteSchoolUseCase-any DeleteSchoolUseCase"
}
}
extension FindPasswordComponent: Registration {
Expand Down Expand Up @@ -1531,7 +1541,7 @@ private func registerProviderFactory(_ componentPath: String, _ factory: @escapi
registerProviderFactory("^->AppComponent->ClubDetailComponent", factory1559652f8e80cfa88d06f47b58f8f304c97af4d5)
registerProviderFactory("^->AppComponent->SuccessSignUpComponent", factorybf219b153b668170161de3b0c44298fc1c149afb)
registerProviderFactory("^->AppComponent->WithdrawUserListComponent", factory4d07a7e30330c03d5d63f47b58f8f304c97af4d5)
registerProviderFactory("^->AppComponent->InputSchoolComponent", factorya02470c933733e398aeee3b0c44298fc1c149afb)
registerProviderFactory("^->AppComponent->InputSchoolComponent", factorya02470c933733e398aeef47b58f8f304c97af4d5)
registerProviderFactory("^->AppComponent->FindPasswordComponent", factory15775d8436b06b9741d1f47b58f8f304c97af4d5)
registerProviderFactory("^->AppComponent->LectureApplicantListComponent", factory78a87c10d14f7bbaaa9df47b58f8f304c97af4d5)
registerProviderFactory("^->AppComponent->UserListComponent", factorycf08383b935d2e18f4c7f47b58f8f304c97af4d5)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import SwiftUI

struct CreatedSchoolSuccessView: View {
var body: some View {
VStack {
BitgouelAsset.Icons.check.swiftUIImage
.padding(.top, 233)

Text("학교 등록 완료")
.bitgouelFont(.title2)
.padding(.top, 24)

Text("새 학교를 등록했습니다.")
.bitgouelFont(.text3, color: .greyscale(.g4))

Spacer()

BitgouelButton(
text: "돌아가기"
) {

}
.cornerRadius(8)
.padding(.horizontal, 28)
}
.navigationBarBackButtonHidden(true)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,20 @@ public struct SchoolLineBottomSheet: View {
text: line.display(),
font: .text2
)

.foregroundColor(.black)

Spacer()

BitgouelRadioButton(
isSelected: Binding(
get: { line == selectedLine },
set: { _ in selectLine(line) }
)
)
}
.buttonWrapper {
selectLine(line)
}
.padding(.vertical, 24)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,25 @@
import NeedleFoundation
import SwiftUI
import Service

public protocol InputSchoolDependency: Dependency {}
public protocol InputSchoolDependency: Dependency {
var createdSchoolUseCase: any CreatedSchoolUseCase { get }
var modifySchoolUseCase: any ModifySchoolUseCase { get }
var deleteSchoolUseCase: any DeleteSchoolUseCase { get }
}

public final class InputSchoolComponent: Component<InputSchoolDependency>, InputSchoolFactory {
public func makeView(state: String, schoolInfo: SchoolDetailInfoModel) -> some View {
public func makeView(
state: String,
schoolInfo: SchoolDetailInfoModel
) -> some View {
InputSchoolView(
viewModel: .init(
state: state,
schoolInfo: schoolInfo
schoolInfo: schoolInfo,
createdSchoolUseCase: dependency.createdSchoolUseCase,
modifySchoolUseCase: dependency.modifySchoolUseCase,
deleteSchoolUseCase: dependency.deleteSchoolUseCase
)
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,20 @@ struct InputSchoolView: View {
Button {
viewModel.updateIsShowingImagePicker(isShowing: true)
} label: {
LazyImage(source: viewModel.schoolInfo.logoImageURL) { state in
LazyImage(source: viewModel.logoImageURL) { state in
if let image = state.image {
image
.resizingMode(.aspectFit)
ZStack {
image
.resizingMode(.aspectFit)
.cornerRadius(8, corners: .allCorners)
.blur(radius: 1)

BitgouelAsset.Icons.add.swiftUIImage
.resizable()
.renderingMode(.template)
.foregroundColor(.white)
.frame(width: 24, height: 24)
}
} else {
schoolLogoImage()
}
Expand Down Expand Up @@ -85,6 +95,8 @@ struct InputSchoolView: View {
}
}
}

Spacer(minLength: 50)
}
.overlay(alignment: .bottom) {
renderFormButton()
Expand Down Expand Up @@ -132,6 +144,17 @@ struct InputSchoolView: View {
)
]
)
.bitgouelToast(
text: viewModel.errorMessage,
isShowing: $viewModel.isErrorOccurred
)
.navigate(
to: CreatedSchoolSuccessView(),
when: $viewModel.isPresentedSuccessView
)
.onChange(of: viewModel.image) { _ in
viewModel.logoImageURL = nil
}
}

@ViewBuilder
Expand All @@ -151,6 +174,7 @@ struct InputSchoolView: View {
) {
viewModel.modifySchool {
dismiss()
viewModel.updateIsShowingLineBottomSheet(isShowing: false)
}
}
}
Expand All @@ -169,7 +193,6 @@ struct InputSchoolView: View {
ZStack {
image
.resizable()
.frame(width: 80, height: 80)
.cornerRadius(8, corners: .allCorners)
.blur(radius: 1)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,27 @@ final class InputSchoolViewModel: BaseViewModel {
@Published var image: Image?
@Published var schoolName: String = ""
@Published var selectedLine: LineType?
@Published var logoImageURL: String?
@Published var departmentList: [String] = []
let state: String
let schoolInfo: SchoolDetailInfoModel

private let createdSchoolUseCase: any CreatedSchoolUseCase
private let modifySchoolUseCase: any ModifySchoolUseCase
private let deleteSchoolUseCase: any DeleteSchoolUseCase

init(
state: String,
schoolInfo: SchoolDetailInfoModel
schoolInfo: SchoolDetailInfoModel,
createdSchoolUseCase: any CreatedSchoolUseCase,
modifySchoolUseCase: any ModifySchoolUseCase,
deleteSchoolUseCase: any DeleteSchoolUseCase
) {
self.state = state
self.schoolInfo = schoolInfo
self.createdSchoolUseCase = createdSchoolUseCase
self.modifySchoolUseCase = modifySchoolUseCase
self.deleteSchoolUseCase = deleteSchoolUseCase
}

func loadImage() {
Expand Down Expand Up @@ -66,23 +77,67 @@ final class InputSchoolViewModel: BaseViewModel {
schoolName = schoolInfo.name
selectedLine = schoolInfo.line
departmentList = schoolInfo.departmentList
logoImageURL = schoolInfo.logoImageURL
}

@MainActor
func createdSchool(_ success: @escaping () -> Void) {
#warning("학교 생성 기능 추가")
success()
guard let line = selectedLine else { return }

Task {
do {
try await createdSchoolUseCase(
logoImage: selectedUIImage?.jpegData(compressionQuality: 0.2) ?? .init(),
req: InputSchoolInfoRequestDTO(
schoolName: schoolName,
line: line.rawValue,
departments: departmentList
)
)

success()
} catch {
errorMessage = error.schoolDomainErrorMessage()
isErrorOccurred = true
}
}
}

@MainActor
func deleteSchool(_ success: @escaping () -> Void) {
#warning("학교 삭제 기능 추가")
success()
Task {
do {
try await deleteSchoolUseCase(schoolID: schoolInfo.schoolID)

success()
} catch {
errorMessage = error.schoolDomainErrorMessage()
isErrorOccurred = true
}
}
}

@MainActor
func modifySchool(_ success: @escaping () -> Void) {
#warning("학교 수정 기능 추가")
success()
}
func modifySchool(_ success: @escaping () -> Void) {
guard let line = selectedLine else { return }

Task {
do {
try await modifySchoolUseCase(
schoolID: schoolInfo.schoolID,
logoImage: selectedUIImage?.jpegData(compressionQuality: 0.2) ?? .init(),
req: InputSchoolInfoRequestDTO(
schoolName: schoolName,
line: line.rawValue,
departments: departmentList
)
)

success()
} catch {
errorMessage = error.schoolDomainErrorMessage()
isErrorOccurred = true
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ struct SchoolListView: View {
text: "새로운 학교 등록",
buttonType: .add
) {
viewModel.updateIsShowingSchoolDetailBottomSheet(isShowing: false)
viewModel.updateIsPresentedInputSchoolInfoView(isPresented: true, state: "등록")
}
}
Expand All @@ -82,6 +83,7 @@ struct SchoolListView: View {
SchoolDetailBottomSheet(
schoolInfo: viewModel.schoolInfo
) {
viewModel.updateIsShowingSchoolDetailBottomSheet(isShowing: false)
viewModel.updateIsPresentedInputSchoolInfoView(isPresented: true, state: "수정")
} cancel: { cancel in
viewModel.updateIsShowingSchoolDetailBottomSheet(isShowing: cancel)
Expand All @@ -98,7 +100,10 @@ struct SchoolListView: View {
}
}
.navigate(
to: inputSchoolFactory.makeView(state: viewModel.state, schoolInfo: viewModel.schoolInfo).eraseToAnyView(),
to: inputSchoolFactory.makeView(
state: viewModel.state,
schoolInfo: viewModel.schoolInfo
).eraseToAnyView(),
when: $viewModel.isPresentedInputSchoolInfoView
)
}
Expand Down
6 changes: 6 additions & 0 deletions App/Sources/Utils/Extensions/Error+DomainErrorMessage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -89,4 +89,10 @@ extension Error {
return universityDomainError.errorDescription ?? unknownErrorMessage
} else { return unknownErrorMessage }
}

func schoolDomainErrorMessage() -> String {
if let schoolDomainError = self as? SchoolDomainError {
return schoolDomainError.errorDescription ?? unknownErrorMessage
} else { return unknownErrorMessage }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@ public final class RemoteSchoolDataSourceImpl: BaseRemoteDataSource<SchoolAPI>,
try await request(.fetchAllSchoolName, dto: FetchSchoolNameResponseDTO.self).toDomain()
}

public func createdSchool(req: CreatedSchoolRequestDTO) async throws {
try await request(.createdSchool(req: req))
public func createdSchool(logoImage: Data, req: InputSchoolInfoRequestDTO) async throws {
try await request(.createdSchool(logoImage: logoImage, req: req))
}

public func modifySchool(schoolID: Int, req: ModifySchoolRequestDTO) async throws {
try await request(.modifySchool(schoolID: schoolID, req: req))
public func modifySchool(schoolID: Int, logoImage: Data, req: InputSchoolInfoRequestDTO) async throws {
try await request(.modifySchool(schoolID: schoolID, logoImage: logoImage, req: req))
}

public func deleteSchool(schoolID: Int) async throws {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@ public struct SchoolRepositoryImpl: SchoolRepository {
try await remoteSchoolDataSource.fetchAllSchoolName()
}

public func createdSchool(req: CreatedSchoolRequestDTO) async throws {
try await remoteSchoolDataSource.createdSchool(req: req)
public func createdSchool(logoImage: Data, req: InputSchoolInfoRequestDTO) async throws {
try await remoteSchoolDataSource.createdSchool(logoImage: logoImage, req: req)
}

public func modifySchool(schoolID: Int, req: ModifySchoolRequestDTO) async throws {
try await remoteSchoolDataSource.modifySchool(schoolID: schoolID, req: req)
public func modifySchool(schoolID: Int, logoImage: Data, req: InputSchoolInfoRequestDTO) async throws {
try await remoteSchoolDataSource.modifySchool(schoolID: schoolID, logoImage: logoImage, req: req)
}

public func deleteSchool(schoolID: Int) async throws {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ public struct CreatedSchoolUseCaseImpl: CreatedSchoolUseCase {
self.schoolRepository = schoolRepository
}

public func callAsFunction(req: CreatedSchoolRequestDTO) async throws {
try await schoolRepository.createdSchool(req: req)
public func callAsFunction(logoImage: Data, req: InputSchoolInfoRequestDTO) async throws {
try await schoolRepository.createdSchool(logoImage: logoImage, req: req)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ public struct ModifySchoolUseCaseImpl: ModifySchoolUseCase {
self.schoolRepository = schoolRepository
}

public func callAsFunction(schoolID: Int, req: ModifySchoolRequestDTO) async throws {
try await schoolRepository.modifySchool(schoolID: schoolID, req: req)
public func callAsFunction(schoolID: Int, logoImage: Data, req: InputSchoolInfoRequestDTO) async throws {
try await schoolRepository.modifySchool(schoolID: schoolID, logoImage: logoImage, req: req)
}
}
Loading

0 comments on commit 7ce03ab

Please sign in to comment.