Skip to content

Commit

Permalink
refactor: #146 신고하기 MVI로 refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
juri123123 committed Jan 23, 2025
1 parent 83f5bb3 commit 2a0343e
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 24 deletions.
43 changes: 23 additions & 20 deletions Spoony-iOS/Spoony-iOS/Source/Feature/Report/Report.swift
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,6 @@ struct Report: View {
@EnvironmentObject private var navigationManager: NavigationManager
@StateObject private var store: ReportStore = ReportStore()

@State private var text: String = ""

@State private var isError: Bool = true
@State private var isDisabled: Bool = true

var body: some View {
VStack(spacing: 0) {
CustomNavigationBar(
Expand All @@ -77,16 +72,18 @@ struct Report: View {
style: .secondary,
size: .xlarge,
title: "신고하기",
disabled: $isDisabled
disabled: Binding(get: {
store.state.isDisabled
}, set: { newValue in
store.dispatch(.isDisabledChanged(newValue))
})
) {
Task {
try await store.postReport(postId: 1, description: text)
navigationManager.popup = .reportSuccess(action: {
navigationManager.pop(2)
})
}
store.dispatch(.reportPostButtonTapped(1))
navigationManager.popup = .reportSuccess(action: {
navigationManager.pop(2)
})
}
.padding(.top, !isError ? 12 : 20)
.padding(.top, !store.state.isError ? 12 : 20)
.padding(.bottom, 20)
}
.scrollIndicators(.hidden)
Expand All @@ -96,9 +93,6 @@ struct Report: View {
.onTapGesture {
hideKeyboard()
}
.onChange(of: isError) {
isDisabled = isError
}
}
}

Expand All @@ -113,10 +107,11 @@ extension Report {
ForEach(ReportType.allCases, id: \.self) { report in
radioButton(
report: report,
isSelected: store.selectedReport == report
isSelected: store.state.selectedReport == report
)
.onTapGesture {
store.changeReportType(report: report)
store.dispatch(.reportReasonButtonTapped(report))
// 이것도 intent로 바꿀 방법 생각해보기
hideKeyboard()
}
}
Expand All @@ -133,10 +128,18 @@ extension Report {
.padding(.bottom, 12.adjustedH)

SpoonyTextEditor(
text: $text,
text: Binding(get: {
store.state.description
}, set: { newValue in
store.dispatch(.descriptionChanged(newValue))
}),
style: .report,
placeholder: "내용을 자세히 적어주시면 신고에 도움이 돼요",
isError: $isError
isError: Binding(get: {
store.state.isError
}, set: { newValue in
store.dispatch(.isErrorChanged(newValue))
})
)

HStack(alignment: .top, spacing: 10) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
//
// ReportIntent.swift
// Spoony-iOS
//
// Created by 최주리 on 1/23/25.
//

import Foundation

enum ReportIntent {
case reportReasonButtonTapped(ReportType)
case reportPostButtonTapped(Int)
case backgroundTapped

case descriptionChanged(String)
case isErrorChanged(Bool)
case isDisabledChanged(Bool)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//
// ReportState.swift
// Spoony-iOS
//
// Created by 최주리 on 1/23/25.
//

import Foundation

struct ReportState {
var selectedReport: ReportType = .advertisement
var description: String = ""

var isError: Bool = true
var isDisabled: Bool = true
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,38 @@ import Foundation
final class ReportStore: ObservableObject {
private let network: ReportProtocol = DefaultReportService()

@Published private(set) var selectedReport: ReportType = .advertisement
@Published private(set) var state: ReportState = ReportState()

func changeReportType(report: ReportType) {
selectedReport = report
func dispatch(_ intent: ReportIntent) {
switch intent {
case .reportReasonButtonTapped(let report):
changeReportType(report: report)
case .reportPostButtonTapped(let postId):
sendReport(postId: postId, description: state.description)
case .descriptionChanged(let newValue):
state.description = newValue
// 여기서 hideKeyboard() 로직이 들어가야하는데 view의 extension이라 어떻게해야할지...
case .backgroundTapped: break
case .isErrorChanged(let newValue):
state.isError = newValue
state.isDisabled = state.isError
case .isDisabledChanged(let newValue):
state.isDisabled = newValue
}
}


}

extension ReportStore {
private func changeReportType(report: ReportType) {
state.selectedReport = report
}

private func sendReport(postId: Int, description: String) {
Task {
try await postReport(postId: postId, description: description)
}
}

// MARK: - Network
Expand All @@ -23,7 +51,7 @@ final class ReportStore: ObservableObject {
) async throws {
try await network.reportPost(
postId: postId,
report: selectedReport,
report: state.selectedReport,
description: description
)
}
Expand Down

0 comments on commit 2a0343e

Please sign in to comment.