Skip to content

Commit 0d51142

Browse files
committed
feat #47: 투두 API 연동
+ UI/UX 일부 수정, 온보딩 화면에서 isJoining 임시로 추가
1 parent f944863 commit 0d51142

18 files changed

+168
-102
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
//
2+
// GetMyTodosResponse.swift
3+
// dogether
4+
//
5+
// Created by seungyooooong on 2/19/25.
6+
//
7+
8+
import Foundation
9+
10+
struct GetMyTodosResponse: Decodable {
11+
let todos: [TodoInfo]
12+
}

dogether/Data/Network/Router/TodosRouter.swift

+8-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import Foundation
1010
enum TodosRouter: NetworkEndpoint {
1111
case createTodos(createTodosRequest: CreateTodosRequest)
1212
case certifyTodo(todoId: String, certifyTodoRequest: CertifyTodoRequest)
13+
case getMyTodos(date: String, status: TodoStatus?)
1314
case getMyYesterdayTodos
1415

1516
var path: String {
@@ -18,14 +19,16 @@ enum TodosRouter: NetworkEndpoint {
1819
return Path.api + Path.todos
1920
case .certifyTodo(let todoId, _):
2021
return Path.api + Path.todos + "/\(todoId)/certify"
22+
case .getMyTodos:
23+
return Path.api + Path.todos + "/my"
2124
case .getMyYesterdayTodos:
2225
return Path.api + Path.todos + "/my/yesterday"
2326
}
2427
}
2528

2629
var method: NetworkMethod {
2730
switch self {
28-
case .getMyYesterdayTodos:
31+
case .getMyTodos, .getMyYesterdayTodos:
2932
return .get
3033
case .createTodos, .certifyTodo:
3134
return .post
@@ -34,6 +37,10 @@ enum TodosRouter: NetworkEndpoint {
3437

3538
var parameters: [URLQueryItem]? {
3639
switch self {
40+
case .getMyTodos(let date, let status):
41+
var parameters: [URLQueryItem] = [.init(name: "date", value: date)]
42+
if let status { parameters.append(.init(name: "status", value: status.rawValue)) }
43+
return parameters
3744
default:
3845
return nil
3946
}

dogether/Domain/Entity/TodoInfo.swift

+14-7
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,27 @@
77

88
import Foundation
99

10-
struct TodoInfo {
10+
struct TodoInfo: Decodable {
1111
let id: Int
1212
let content: String
13-
var status: TodoStatus
14-
var mediaUrl: String?
15-
var todoContent: String?
13+
var status: String
14+
var certificationContent: String?
15+
var certificationMediaUrl: String?
1616
var rejectReason: String?
1717

18-
init(id: Int, content: String, status: TodoStatus, mediaUrl: String? = nil, todoContent: String? = nil, rejectReason: String? = nil) {
18+
init(
19+
id: Int,
20+
content: String,
21+
status: String,
22+
certificationContent: String? = nil,
23+
certificationMediaUrl: String? = nil,
24+
rejectReason: String? = nil
25+
) {
1926
self.id = id
2027
self.content = content
2128
self.status = status
22-
self.mediaUrl = mediaUrl
23-
self.todoContent = todoContent
29+
self.certificationContent = certificationContent
30+
self.certificationMediaUrl = certificationMediaUrl
2431
self.rejectReason = rejectReason
2532
}
2633
}

dogether/Domain/Entity/TodoStatus.swift

+18-5
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,24 @@
88
import Foundation
99
import UIKit
1010

11-
enum TodoStatus {
12-
case waitCertificattion
13-
case waitExamination
14-
case reject
15-
case approve
11+
enum TodoStatus: String, CaseIterable {
12+
case waitCertificattion = "CERTIFY_PENDING"
13+
case waitExamination = "REVIEW_PENDING"
14+
case reject = "REJECT"
15+
case approve = "APPROVE"
16+
17+
var tag: Int {
18+
switch self {
19+
case .waitCertificattion:
20+
return 0
21+
case .waitExamination:
22+
return 1
23+
case .reject:
24+
return 2
25+
case .approve:
26+
return 3
27+
}
28+
}
1629

1730
var image: UIImage? {
1831
switch self {

dogether/Presentation/Common/CertificationImageView.swift

+7-7
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ import Foundation
99
import UIKit
1010

1111
final class CertificationImageView: UIImageView {
12-
private(set) var todoContent: String
12+
private(set) var certificationContent: String
1313
private(set) var certificator: String
1414

15-
init(image: UIImage?, todoContent: String = "", certificator: String = "") {
16-
self.todoContent = todoContent
15+
init(image: UIImage?, certificationContent: String = "", certificator: String = "") {
16+
self.certificationContent = certificationContent
1717
self.certificator = certificator
1818

1919
super.init(image: image)
@@ -39,7 +39,7 @@ final class CertificationImageView: UIImageView {
3939
return view
4040
}()
4141

42-
private let todoContentLabel = {
42+
private let certificationContentLabel = {
4343
let label = UILabel()
4444
label.textColor = .grey100
4545
label.font = Fonts.body1R
@@ -63,16 +63,16 @@ final class CertificationImageView: UIImageView {
6363
layer.cornerRadius = 12
6464
contentMode = .scaleAspectFit
6565

66-
todoContentLabel.text = todoContent
66+
certificationContentLabel.text = certificationContent
6767
certificatorLabel.text = certificator
6868

69-
[gradientView, todoContentLabel, certificatorLabel].forEach { addSubview($0) }
69+
[gradientView, certificationContentLabel, certificatorLabel].forEach { addSubview($0) }
7070

7171
gradientView.snp.makeConstraints {
7272
$0.edges.equalToSuperview()
7373
}
7474

75-
todoContentLabel.snp.makeConstraints {
75+
certificationContentLabel.snp.makeConstraints {
7676
$0.centerX.equalToSuperview()
7777
$0.bottom.equalTo(certificatorLabel.snp.top).inset(4)
7878
$0.height.equalTo(25)

dogether/Presentation/Common/CertificationInfoPopupView.swift

+4-5
Original file line numberDiff line numberDiff line change
@@ -78,14 +78,13 @@ final class CertificationInfoPopupView: UIView {
7878
// TODO: 추후 수정
7979
imageView = CertificationImageView(
8080
image: .logo,
81-
todoContent: todoInfo.todoContent ?? "",
81+
certificationContent: todoInfo.certificationContent ?? "",
8282
certificator: UserDefaultsManager.shared.userFullName ?? ""
8383
)
8484

85-
statusView = FilterButton(
86-
action: { _ in },
87-
type: todoInfo.status == .waitExamination ? .wait : todoInfo.status == .reject ? .reject : .approve
88-
)
85+
guard let status = TodoStatus(rawValue: todoInfo.status),
86+
let filterType = FilterTypes.allCases.first(where: { $0.tag == status.tag }) else { return }
87+
statusView = FilterButton(action: { _ in }, type: filterType)
8988

9089
contentLabel.attributedText = NSAttributedString(
9190
string: todoInfo.content,

dogether/Presentation/Common/CertificationPopupView.swift

+4-2
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@ final class CertificationPopupView: UIView {
1616
private let certificationMaxLength = 20
1717

1818
// TODO: 추후 수정
19+
private var todoInfo: TodoInfo
1920
private var completeAction: (String) -> Void
2021

21-
init(completeAction: @escaping (String) -> Void) {
22+
init(todoInfo: TodoInfo, completeAction: @escaping (String) -> Void) {
23+
self.todoInfo = todoInfo
2224
self.completeAction = completeAction
2325
super.init(frame: .zero)
2426
setUI()
@@ -188,7 +190,7 @@ final class CertificationPopupView: UIView {
188190

189191
closeButton.addTarget(self, action: #selector(didTapCloseButton), for: .touchUpInside)
190192
todoContentLabel.attributedText = NSAttributedString(
191-
string: "일이삼사오육칠팔구십일이삼사오육칠팔구십",
193+
string: todoInfo.content,
192194
attributes: Fonts.getAttributes(for: Fonts.head1B, textAlignment: .center)
193195
)
194196

dogether/Presentation/Common/DogetherGroupInfo.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ final class DogetherGroupInfo: UIView {
8787

8888
groupNameLabel.text = groupName
8989

90-
durationDescriptionLabel.text = "회차"
90+
durationDescriptionLabel.text = "기간"
9191
memberCountDescriptionLabel.text = "그룹원"
9292
startDayDescriptionLabel.text = "시작일"
9393
endDayDescriptionLabel.text = "종료일"

dogether/Presentation/Common/DogetherTodoItem.swift

+14-12
Original file line numberDiff line numberDiff line change
@@ -57,20 +57,21 @@ final class DogetherTodoItem: UIButton {
5757
$0.height.equalTo(64)
5858
}
5959

60-
if todo.status != .waitCertificattion {
60+
if todo.status != TodoStatus.waitCertificattion.rawValue {
61+
let imageSize = todo.status == TodoStatus.waitExamination.rawValue ? 22 : todo.status == TodoStatus.reject.rawValue ? 26 : 28 // MARK: 임의로 사이즈 조정
6162
todoImageView.snp.makeConstraints {
6263
$0.centerY.equalToSuperview()
6364
$0.left.equalToSuperview().offset(16)
64-
$0.width.height.equalTo(todo.status == .waitExamination ? 22 : todo.status == .reject ? 26 : 28) // MARK: 임의로 사이즈 조정
65+
$0.width.height.equalTo(imageSize)
6566
}
6667
}
6768

6869
contentLabel.snp.makeConstraints {
6970
$0.centerY.equalToSuperview()
7071
$0.left.equalTo(
71-
todo.status == .waitCertificattion ? dogetherTodoItem : todoImageView.snp.right
72+
todo.status == TodoStatus.waitCertificattion.rawValue ? dogetherTodoItem : todoImageView.snp.right
7273
).offset(
73-
todo.status == .waitCertificattion ? 16 : 8
74+
todo.status == TodoStatus.waitCertificattion.rawValue ? 16 : 8
7475
)
7576
}
7677

@@ -83,25 +84,26 @@ final class DogetherTodoItem: UIButton {
8384
}
8485

8586
func updateTodoStatus(_ status: TodoStatus) {
86-
self.todo.status = status
87+
self.todo.status = status.rawValue
8788
updateUI()
8889
}
8990

9091
private func updateUI() {
91-
todoImageView.image = todo.status.image
92-
if todo.status == .waitCertificattion {
92+
guard let status = TodoStatus(rawValue: todo.status) else { return }
93+
todoImageView.image = status.image
94+
if status == .waitCertificattion {
9395
contentLabel.text = todo.content
9496
} else {
9597
let attributes: [NSAttributedString.Key: Any] = [
9698
.strikethroughStyle: NSUnderlineStyle.single.rawValue,
97-
.strikethroughColor: todo.status.contentColor
99+
.strikethroughColor: status.contentColor
98100
]
99101
contentLabel.attributedText = NSAttributedString(string: todo.content, attributes: attributes)
100102
}
101-
contentLabel.textColor = todo.status.contentColor
102-
buttonLabel.text = todo.status.buttonText
103-
buttonLabel.textColor = todo.status.buttonTextColor
104-
buttonLabel.backgroundColor = todo.status.buttonColor
103+
contentLabel.textColor = status.contentColor
104+
buttonLabel.text = status.buttonText
105+
buttonLabel.textColor = status.buttonTextColor
106+
buttonLabel.backgroundColor = status.buttonColor
105107
}
106108

107109
@objc private func didTapTodoItem() {

dogether/Presentation/Common/ExaminationModalityView.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ final class ExaminationModalityView: UIView {
8181
// TODO: 추후 수정
8282
imageView = CertificationImageView(
8383
image: .logo,
84-
todoContent: todoInfo.todoContent ?? "",
84+
certificationContent: todoInfo.certificationContent ?? "",
8585
certificator: UserDefaultsManager.shared.userFullName ?? ""
8686
)
8787

dogether/Presentation/View/CompleteViewController.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,6 @@ final class CompleteViewController: BaseViewController {
152152

153153
@objc private func didTapJoinCodeShareButton() {
154154
// TODO: 추후 수정
155-
present(UIActivityViewController(activityItems: ["123456"], applicationActivities: nil), animated: true)
155+
present(UIActivityViewController(activityItems: [viewModel.joinCode], applicationActivities: nil), animated: true)
156156
}
157157
}

0 commit comments

Comments
 (0)