Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Network [#100] 답글 좋아요 및 답글 좋아요 삭제 API 연결 및 UI 세부사항 수정 #103

Merged
merged 10 commits into from
Jan 18, 2024
Merged
4 changes: 4 additions & 0 deletions DontBe-iOS/DontBe-iOS.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
2A5220EC2B507F2A001510B7 /* UITableViewCellRegisterable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5220EB2B507F2A001510B7 /* UITableViewCellRegisterable.swift */; };
2A5220EF2B507F97001510B7 /* NotificationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5220EE2B507F97001510B7 /* NotificationViewModel.swift */; };
2A5220F22B507FAE001510B7 /* NotificationTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5220F12B507FAE001510B7 /* NotificationTableViewCell.swift */; };
2A5D68F82B58E9C0000AE1B7 /* CommentLikeRequestDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5D68F72B58E9C0000AE1B7 /* CommentLikeRequestDTO.swift */; };
2A6D54C12B479B4300F9891E /* adjusted+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A6D54C02B479B4300F9891E /* adjusted+.swift */; };
2A6D54C32B493A8400F9891E /* UIFont+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A6D54C22B493A8400F9891E /* UIFont+.swift */; };
2A6D54C62B493E3F00F9891E /* Pretendard-SemiBold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2A6D54C42B493E3F00F9891E /* Pretendard-SemiBold.otf */; };
Expand Down Expand Up @@ -173,6 +174,7 @@
2A5220EB2B507F2A001510B7 /* UITableViewCellRegisterable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITableViewCellRegisterable.swift; sourceTree = "<group>"; };
2A5220EE2B507F97001510B7 /* NotificationViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationViewModel.swift; sourceTree = "<group>"; };
2A5220F12B507FAE001510B7 /* NotificationTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationTableViewCell.swift; sourceTree = "<group>"; };
2A5D68F72B58E9C0000AE1B7 /* CommentLikeRequestDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommentLikeRequestDTO.swift; sourceTree = "<group>"; };
2A6D54C02B479B4300F9891E /* adjusted+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "adjusted+.swift"; sourceTree = "<group>"; };
2A6D54C22B493A8400F9891E /* UIFont+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIFont+.swift"; sourceTree = "<group>"; };
2A6D54C42B493E3F00F9891E /* Pretendard-SemiBold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-SemiBold.otf"; sourceTree = "<group>"; };
Expand Down Expand Up @@ -641,6 +643,7 @@
isa = PBXGroup;
children = (
2F05B1B62B57F1FD00AC368D /* WriteReplyRequestDTO.swift */,
2A5D68F72B58E9C0000AE1B7 /* CommentLikeRequestDTO.swift */,
);
path = RequestDTO;
sourceTree = "<group>";
Expand Down Expand Up @@ -1228,6 +1231,7 @@
3CF184D12B4EFF9900816D5F /* MyPageProfileView.swift in Sources */,
2A51831A2B571CC400B43BA8 /* NotificationList.swift in Sources */,
3C61931B2B3A7AD000220CEB /* NetworkError.swift in Sources */,
2A5D68F82B58E9C0000AE1B7 /* CommentLikeRequestDTO.swift in Sources */,
2F05B1B72B57F1FD00AC368D /* WriteReplyRequestDTO.swift in Sources */,
3CBF99272B549C7D0015FE4B /* WriteViewModel.swift in Sources */,
3C70BE332B53EF92001AA5A6 /* MyPageViewModel.swift in Sources */,

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 코드 패치에서는 특정 파일에 대한 변경 내용이 포함되어 있습니다. 변경 내용은 빌드 파일 및 파일 참조 목록에 새로운 항목을 추가하는 것입니다.

버그의 위험성과 개선 제안은 코드 패치 자체만으로는 파악하기 어렵습니다. 빌드 설정 또는 다른 파일들에 대한 정보가 없어서 전반적인 시스템 상황을 알 수 없기 때문입니다.

코드 패치의 단편적인 내용만으로는 구체적인 버그나 개선 사항을 진단하기가 어렵습니다. 코드 전체와 해당 코드를 사용하는 다른 부분을 고려해야 하며, 실행 환경, 의존성, 요구 사항 등을 고려해야합니다.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 코드 패치는 다음과 같은 변경 사항을 포함하고 있습니다:

  1. 새 파일 CommentLikeRequestDTO.swift가 프로젝트에 추가되었습니다.

리뷰 및 개선 제안:

  1. 보여진 부분에서는 큰 문제나 버그 위험이 보이지 않습니다.
  2. 단순히 파일을 추가한 것으로 보입니다. 실제 파일의 내용은 보여지지 않으므로 세부적인 검토는 어렵습니다.
  3. 코드베이스 전체를 고려하여 추가된 파일이 올바른 위치에 있는지 확인해야 합니다.
  4. 변경 내용의 커밋 메시지에서 목적과 이유를 명확하게 설명하는 것이 좋습니다.

추가적인 정보가 제공되지 않아서 더 자세한 리뷰는 어렵습니다.

Expand Down
4 changes: 2 additions & 2 deletions DontBe-iOS/DontBe-iOS/Global/Extension/String+.swift
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,10 @@ extension String {
} else if let minute = components.minute, minute == 0 {
return "지금"
} else {
return "시간을 불러올 수 없습니다."
return "알 수 없음"
}
} else {
return "날짜 변환 실패"
return "알 수 없음"
}
}
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 코드 패치에 대해 간단한 코드 리뷰를 도와드리겠습니다.

  1. 코드 변경:

    • "시간을 불러올 수 없습니다." 메시지 대신 "알 수 없음" 메시지가 반환됩니다. 이 변경은 에러 조건을 더 범용적으로 처리하기 위한 것으로 보입니다.
  2. 개선 제안:

    • 주석이나 코드 자체에 언어 정보가 없으므로, 코드 작성자의 의도와 사용되는 컨텍스트를 명확하게 표시하는 것이 좋습니다.
    • 코드 스타일 및 가독성을 개선하기 위해 적절한 들여쓰기와 공백 사용을 확인하십시오.
    • 함수 또는 해당 코드 조각의 동작을 설명하는 주석을 추가하는 것이 도움이 될 수 있습니다.

위의 내용은 코드 리뷰와 개선 제안입니다. 실제 버그나 오류 위험 요소가 있는지는 코드 조각만으로는 판단하기 어렵습니다. 전체 코드의 맥락과 다른 부분과의 상호작용을 고려하여 코드를 평가하는 것이 더 바람직합니다.

17 changes: 17 additions & 0 deletions DontBe-iOS/DontBe-iOS/Global/Extension/UIViewController+.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,21 @@ extension UIViewController {
var statusBarHeight: CGFloat {
return UIApplication.shared.windows.filter({$0.isKeyWindow}).first?.windowScene?.statusBarManager?.statusBarFrame.height ?? 20
}

func applyTabBarAttributes(to tabBarItem: UITabBarItem, isSelected: Bool) {
let attributes: [NSAttributedString.Key: Any]

if isSelected {
attributes = [
.font: UIFont.font(.caption3),
.foregroundColor: UIColor.donSecondary
] // title이 선택되었을 때 폰트, 색상 설정
} else {
attributes = [
.font: UIFont.font(.caption4),
.foregroundColor: UIColor.donGray7
] // title이 선택되지 않았을 때 폰트, 색상 설정
}
tabBarItem.setTitleTextAttributes(attributes, for: .normal)
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3
탭바 커스텀 좋네요~!

}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아래는 코드 패치입니다. 이에 대한 간단한 코드 리뷰를 도와드리겠습니다. 버그 위험 또는 개선 제안이 있다면 환영합니다.

  • statusBarHeight 함수: 코드는 잘 작동하는 것 같습니다. 그러나 상수 20을 직접 사용하는 대신 UIApplication.shared.windows 배열의 첫 번째 요소가 키 윈도우인지 확인하고 이에 해당하는 statusBarManager에서 statusBarFrame.height를 가져오는 방식은 안전하지 않을 수 있습니다. iOS 15부터는 다중 윈도우를 지원하기 때문에 첫 번째 요소가 항상 기준 창이 아닐 수 있습니다. 대신 UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame.height를 사용하는 것이 좋습니다.
  • applyTabBarAttributes 함수: 선택 여부에 따라 UITabBarItem의 속성을 설정하는 함수로 보입니다. 변수 attributes를 선언하고 선택된 경우와 그렇지 않은 경우에 대해 다른 값을 할당합니다. 이 코드도 작동할 것 같습니다. 개선할 사항은 없어 보입니다.

전반적으로, 코드에는 큰 문제가 보이지 않습니다. 하지만 첫 번째 함수에서 기준 창을 올바르게 가져오기 위해 약간의 수정이 필요합니다.

1 change: 1 addition & 0 deletions DontBe-iOS/DontBe-iOS/Global/Literals/ImageLiterals.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ enum ImageLiterals {
static var btnBack: UIImage { .load(name: "btn_back") }
static var logoSymbol: UIImage { .load(name: "logo_symbol") }
static var imgProfile: UIImage { .load(name: "img_profile") }
static var btnBackGray: UIImage { .load(name: "btn_back_gray") }
}

enum TabBar {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 코드 패치의 문제점 및 개선 제안은 다음과 같습니다:

  1. 새로 추가된 btnBackGray 이미지 리터럴에 대한 코드가 잘못된 위치에 있습니다. ImageLiterals 열거형 내부에서 해당 이미지를 선언하는 것이 좋습니다.

수정 예시:

enum ImageLiterals {
     static var btnBack: UIImage { .load(name: "btn_back") }
     static var logoSymbol: UIImage { .load(name: "logo_symbol") }
     static var imgProfile: UIImage { .load(name: "img_profile") }
}

// 새로 추가된 이미지 리터럴 추가
extension ImageLiterals {
    static var btnBackGray: UIImage { .load(name: "btn_back_gray") }
}

변경 후, btnBackGray 이미지는 ImageLiterals.btnBackGray로 접근할 수 있습니다.

이외에는 패치 코드에 큰 문제는 보이지 않습니다. 이 코드는 이미지 리소스를 로드하는 간단한 기능을 제공하는 것으로 보입니다. 리뷰가 끝나면 전체 코드와 함께 더 자세한 피드백을 제공할 수도 있습니다.

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "btn_back.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "[email protected]",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "[email protected]",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

위의 코드 패치를 간단하게 코드 리뷰해 드리겠습니다. 가능한 버그 위험과 개선 제안 사항을 알려드리겠습니다.

이 코드는 JSON 형식으로 되어 있습니다. 주어진 코드 조각은 이미지 파일의 정보와 작성자 및 버전 정보를 포함하고 있습니다. 주된 목적은 이미지 파일에 대한 정보를 나열하는 것으로 보입니다.

버그 위험 및 개선 제안:

  1. 주어진 코드 조각은 크게 문제가 없어 보입니다. 하지만 파일 이름 확장자가 이미지 파일 유형을 나타내도록 표준화하는 것이 도움이 될 수 있습니다. 예를 들어, ".png" 대신에 "@1x.png", "@2x.png", "@3x.png" 와 같은 네이밍 규칙을 사용할 수 있습니다. 이렇게 하면 파일 이름만으로도 각 이미지의 배율을 알 수 있어 유지 관리가 더 쉬워집니다.

간략한 코드 리뷰를 마치겠습니다! 추가 질문이 있거나 도움이 필요하시면 언제든지 말씀해주세요.

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
//
// CommentLikeRequestDTO.swift
// DontBe-iOS
//
// Created by 변희주 on 1/18/24.
//

import Foundation

struct CommentLikeRequestDTO: Encodable {
let notificationTriggerType: String
let notificationText: String
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코드 리뷰를 해드리겠습니다.

  1. 주석: 좋은 시작입니다. 코드에 대한 설명과 파일 정보를 알려줄 수 있습니다.

  2. import Foundation: 필요한 라이브러리를 정확하게 임포트하고 있습니다.

  3. struct CommentLikeRequestDTO: Encodable: 이 구조체는 Encodable 프로토콜을 준수하고 있습니다. 데이터를 인코딩할 수 있는 형태로 만들기 위해 사용됩니다.

  4. let notificationTriggerType: String, let notificationText: String: 두 가지 속성을 가진 구조체입니다. 문자열 형식의 notificationTriggerType과 notificationText를 나타냅니다.

개선 제안:

  1. 구조체 이름: CommentLikeRequestDTO라는 이름은 순전히 목적을 설명하기보다는 데이터 전송 객체(Data Transfer Object)를 나타내는 DTO에 의존하는 네이밍입니다. 객체의 역할과 책임을 보다 명확하게 전달할 수 있는 이름으로 변경하는 것도 고려해 볼만합니다.

  2. 변수 이름: 변수 이름이 설명적이며 목적을 쉽게 이해할 수 있습니다. 현재의 변수 이름은 어떤 유형의 알림을 나타내는지 자세히 설명하지 않으므로, 변수 이름에 더 많은 정보를 포함할 수 있도록 개선하는 것이 좋습니다.

  3. 주석: 코드의 목적에 대한 설명으로 좋은 시작을 했지만, 코드 일부에 대한 설명이 부족한 것 같습니다. 특히, 이 DTO가 어떤 용도로 사용되는지와 관련된 정보를 추가하는 것이 유용할 수 있습니다.

  4. 현재 코드에서 오류나 버그의 위험이 크게 보이지 않습니다. 다만, 나중에 사용하는 곳에서 해당 구조체에 필수인 속성값이 누락될 수 있는지 확인해보시고, 필요에 따라 옵셔널 속성으로 정의하는 것도 고려해 볼 수 있습니다.

요약하자면, 코드가 간결하고 보완할 사항이 그리 많지 않아 보입니다. 단지 구조체 및 변수 이름, 코드에 대한 주석의 개선을 통해 가독성을 향상시킬 수 있을 것입니다.

Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ final class HomeCollectionViewCell: UICollectionViewCell, UICollectionViewRegist
var KebabButtonAction: (() -> Void) = {}
var LikeButtonAction: (() -> Void) = {}
var TransparentButtonAction: (() -> Void) = {}
var ProfileButtonAction: (() -> Void) = {}
var isLiked: Bool = false
var alarmTriggerType: String = ""
var targetMemberId: Int = 0
Expand Down Expand Up @@ -44,8 +45,9 @@ final class HomeCollectionViewCell: UICollectionViewCell, UICollectionViewRegist
image.clipsToBounds = true
image.layer.borderWidth = 1.adjusted
image.layer.borderColor = UIColor.clear.cgColor
image.image = UIImage.checkmark
image.image = ImageLiterals.Common.imgProfile
image.layer.cornerRadius = 22.adjusted
image.isUserInteractionEnabled = true
return image
}()

Expand Down Expand Up @@ -276,6 +278,7 @@ extension HomeCollectionViewCell {
kebabButton.addTarget(self, action: #selector(showButtons), for: .touchUpInside)
likeButton.addTarget(self, action: #selector(likeToggleButton), for: .touchUpInside)
ghostButton.addTarget(self, action: #selector(transparentShowPopupButton), for: .touchUpInside)
profileImageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(profileButton)))
}

@objc
Expand All @@ -291,4 +294,9 @@ extension HomeCollectionViewCell {
func transparentShowPopupButton() {
TransparentButtonAction()
}

@objc
func profileButton() {
ProfileButtonAction()
}
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 코드 패치에는 몇 가지 개선점과 버그 위험이 있습니다:

  1. 변수 및 메서드 이름은 케밥 표기법 대신 카멜 표기법을 사용하는 것이 좋습니다. 예를 들어, KebabButtonActionkebabButtonAction으로 변경하세요.
  2. ProfileButtonAction은 옵셔널로 선언되지 않았으며, 기본값이 제공되지 않았으므로 나중에 액션을 할당하기 전에 nil 체크를 해야 합니다. 이 문제를 해결하려면 해당 프로퍼티를 옵셔널로 선언하고 초기화할 때 기본값을 지정하세요.
  3. image.isUserInteractionEnabled = true를 추가한 것은 이미지 뷰에 탭 동작을 추가하기 위한 것입니다. 그러나 해당 이미지 뷰를 탭할 때 profileButton 메서드가 호출되도록 설정되었는지 확인해야 합니다.
  4. HomeCollectionViewCellshowButtons, likeToggleButton, transparentShowPopupButtonprofileButton 메서드 내에서 해당 액션 클로저를 호출하기 전에 nil 체크를 수행하는 것이 안전합니다. 이렇게 하면 해당 액션이 할당되지 않았거나 nil일 경우 충돌 없이 처리됩니다.

이 외에는 주요한 버그 리스크가 보이지 않습니다.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 코드 패치를 간단히 검토해보겠습니다.

  1. 코드 변경 사항:

    • 새로운 ProfileButtonAction 변수가 추가되었습니다.
    • image의 기본 이미지로 UIImage.checkmark 대신 ImageLiterals.Common.imgProfile이 사용됩니다.
    • imageisUserInteractionEnabled 속성이 추가되었습니다.
    • profileImageViewUITapGestureRecognizer가 추가되었습니다.
  2. 버그 리스크와 개선 제안:

    • 코드 패치에서는 명확한 버그 리스크는 드러나지 않습니다.
    • 개선 제안으로는 다음 사항을 고려할 수 있습니다:
      • HomeCollectionViewCell 클래스가 많은 액션과 상태를 가지고 있으므로, 해당 클래스를 조금 더 작고 단순하게 유지하는 것이 좋습니다. 가능하다면 기능을 분리하고 관련성이 있는 작은 클래스나 구조체로 나누는 것이 좋습니다.

코드 패치는 주어진 목적에는 문제가 없어 보이며, 추가 개선 사항이 필요하다고 생각되지 않습니다. 하지만 전반적인 코드 베이스와 프로젝트 요구 사항에 따라 개선 여지가 있을 수 있습니다.

Original file line number Diff line number Diff line change
Expand Up @@ -83,12 +83,13 @@ final class HomeViewController: UIViewController {

override func viewWillAppear(_ animated: Bool) {
self.navigationController?.navigationBar.isHidden = true
self.tabBarController?.tabBar.isHidden = false
bindViewModel()
}

override func viewWillDisappear(_ animated: Bool) {
self.navigationController?.navigationBar.isHidden = false

self.navigationController?.navigationBar.backgroundColor = .clear
refreshPost()
}
}
Expand Down Expand Up @@ -287,7 +288,7 @@ extension HomeViewController {

private func postLikeButtonAPI(isClicked: Bool, contentId: Int) {
// 최초 한 번만 publisher 생성
var likeButtonTapped: AnyPublisher<(Bool, Int), Never>? = Just(())
let likeButtonTapped: AnyPublisher<(Bool, Int), Never>? = Just(())
.map { _ in return (!isClicked, contentId) }
.throttle(for: .seconds(2), scheduler: DispatchQueue.main, latest: false)
.eraseToAnyPublisher()
Expand All @@ -297,9 +298,7 @@ extension HomeViewController {
let output = self.viewModel.transform(from: input, cancelBag: self.cancelBag)

output.toggleLikeButton
.sink { value in
print(value)
}
.sink { _ in }
.store(in: self.cancelBag)
}
}
Expand Down Expand Up @@ -355,13 +354,37 @@ extension HomeViewController: UICollectionViewDataSource, UICollectionViewDelega
cell.likeButton.setImage(cell.isLiked ? ImageLiterals.Posting.btnFavoriteActive : ImageLiterals.Posting.btnFavoriteInActive, for: .normal)
self.postLikeButtonAPI(isClicked: cell.isLiked, contentId: self.viewModel.postData[indexPath.row].contentId)
}

cell.ProfileButtonAction = {
let memberId = self.viewModel.postData[indexPath.row].memberId

if memberId == loadUserData()?.memberId ?? 0 {
self.tabBarController?.selectedIndex = 3
if let selectedViewController = self.tabBarController?.selectedViewController {
self.applyTabBarAttributes(to: selectedViewController.tabBarItem, isSelected: true)
}
let myViewController = self.tabBarController?.viewControllers ?? [UIViewController()]
for (index, controller) in myViewController.enumerated() {
if let tabBarItem = controller.tabBarItem {
if index != self.tabBarController?.selectedIndex {
self.applyTabBarAttributes(to: tabBarItem, isSelected: false)
}
}
}
} else {
let viewController = MyPageViewController(viewModel: MyPageViewModel(networkProvider: NetworkService()))
viewController.memberId = memberId
self.navigationController?.pushViewController(viewController, animated: true)
}
}

cell.TransparentButtonAction = {
self.alarmTriggerType = cell.alarmTriggerType
self.targetMemberId = cell.targetMemberId
self.alarmTriggerdId = cell.alarmTriggerdId
self.present(self.transparentPopupVC, animated: false, completion: nil)
}
cell.profileImageView.load(url: viewModel.postData[indexPath.row].memberProfileUrl)
cell.nicknameLabel.text = viewModel.postData[indexPath.row].memberNickname
cell.transparentLabel.text = "투명도 \(viewModel.postData[indexPath.row].memberGhost)%"
cell.contentTextLabel.text = viewModel.postData[indexPath.row].contentText

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코드 리뷰를 해드리겠습니다:

  1. viewWillDisappear(_:) 메서드에서 self.navigationController?.navigationBar.backgroundColor = .clear 코드를 추가하는 것은 좋은 개선 사항입니다. 이전 뷰 컨트롤러에서 숨겨진 네비게이션 바를 보여줄 때 배경색을 클리어로 설정하여 일관성을 유지하는 데 도움이 됩니다.

  2. postLikeButtonAPI(isClicked:contentId:) 메서드에서 변수 likeButtonTapped의 타입을 AnyPublisher<(Bool, Int), Never>?에서 let으로 수정한 것은 좋은 개선입니다. 변수의 값이 한 번 설정되면 변경되지 않으므로 let으로 선언하는 것이 적절합니다.

  3. output.toggleLikeButton.sink 클로저에서 값을 받는 대신 _를 사용하도록 수정한 것은 앞으로 어떤 값을 출력할 지 신경 쓰지 않을 경우 불필요한 출력을 피하기 위한 개선 사항입니다.

  4. collectionView(_:cellForItemAt:) 메서드에서 ProfileButtonAction 클로저와 해당 closure 내부에 있는 코드는 읽기 어렵고 축약적이기 때문에 개선할 수 있습니다. 클로저 내부의 로직을 개별 메서드로 추출하고 해당 메서드를 호출하는 방식으로 변경하는 것이 가독성과 유지보수를 향상시킬 수 있습니다.

  5. cell.profileImageView.load(url:) 코드는 화면에 표시할 프로필 이미지를 로드하는 것입니다. 이 부분은 정상적으로 작동할 수 있는지, 예외 처리가 필요한지 확인해야 합니다. 이 부분과 관련하여 성능 문제나 UI의 지연이 발생할 수 있는지도 주의해야 합니다.

  6. 다른 부분에서 큰 문제점이 보이지 않습니다. 코드 리뷰 후에 소스 코드를 완전히 이해한 후 실제로 실행하는 것이 좋습니다.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

제시된 코드 패치에 대한 간단한 코드 리뷰를 도와드리겠습니다.

  1. viewWillDisappear(_ animated: Bool) 메서드에서 self.navigationController?.navigationBar.backgroundColor = .clear 코드를 사용하여 네비게이션 바의 배경색을 투명하게 설정하는 것은 좋은 접근입니다. 그러나 같은 기능을 하는 코드가 해당 뷰 컨트롤러 밖 다른 위치에서 사용되는지 확인해야 합니다. 중복된 코드가 없다면, 이 코드를 제거하는 것도 고려할 수 있습니다.

  2. postLikeButtonAPI(isClicked: Bool, contentId: Int) 메서드에서 likeButtonTapped 변수를 최초 한 번만 생성하고 있다는 주석을 확인했습니다. 그러나 실제로는 let likeButtonTapped: AnyPublisher<(Bool, Int), Never>? = Just(())으로 항상 새로운 인스턴스를 생성하고 있습니다. 이 상수를 최초에 한 번만 생성하도록 수정하는 것이 더 나을 수 있습니다.

  3. toggleLikeButton closure에서 출력문을 삭제하고 있습니다. 출력이 필요하지 않다면 단순히 { _ in }으로 변경할 수 있습니다.

  4. ProfileButtonAction 클로저와 TransparentButtonAction 클로저 내의 코드는 말할 것이 없어 보입니다. 현재 로직에 따라 올바르게 작동한다면 문제 없을 것입니다.

  5. profileImageView.load(url: viewModel.postData[indexPath.row].memberProfileUrl) 구문에서, load 메서드는 어떻게 정의되어 있는지 확인해야 합니다. 필요한 경우 해당 메서드에서 예외 처리를 포함하는지 확인해야 합니다.

이외에는 제시된 코드 패치에서 큰 문제점을 발견하지 못했습니다. 위의 내용들을 고려하여 코드를 개선하시면 될 것입니다.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ extension HomeViewModel {
body: requestDTO,
pathVariables: ["":""]
)
print ("👻👻👻👻👻게시글 좋아요 버튼 클릭👻👻👻👻👻")
print ("👻👻👻👻👻게시물 좋아요 버튼 클릭👻👻👻👻👻")
return data
} catch {
return nil
Expand All @@ -141,7 +141,7 @@ extension HomeViewModel {
body: EmptyBody(),
pathVariables: ["":""]
)
print ("👻👻👻👻👻게시글 좋아요 취소 버튼 클릭👻👻👻👻👻")
print ("👻👻👻👻👻게시물 좋아요 취소 버튼 클릭👻👻👻👻👻")
return data
}
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

다음은 아래의 코드 패치에 대한 간략한 코드 리뷰입니다. 버그 위험 및 개선 제안을 언급해드리겠습니다.

  • 주석 부분을 보면 "게시글"이라는 용어를 "게시물"로 수정한 것으로 보입니다. 이 텍스트 변경은 화면 일관성을 위해 적합한 개선입니다.
  • 코드 변경과 관련하여 어떤 버그 위험이나 오작동의 가능성은 보이지 않습니다.
  • 모델에서 발생하는 예외 처리에 대한 추가적인 개선을 검토할 수 있습니다. 현재 코드에서는 예외가 발생할 경우 nil을 반환하고 있습니다. 이 예외 처리를 좀 더 구체화하거나, 실패 시 추적 정보 등을 로깅하는 방법을 고려해볼 수도 있습니다.

이상이 코드 리뷰입니다. 혹시 추가로 궁금한 사항이 있으시면 언제든지 물어보십시오!

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,8 @@ extension MyPageAccountInfoViewController {
}

private func bindViewModel() {
let input = MyPageViewModel.Input(viewUpdate: Just((0)).eraseToAnyPublisher())
let memberId = loadUserData()?.memberId ?? 0
let input = MyPageViewModel.Input(viewUpdate: Just((0, memberId )).eraseToAnyPublisher())

let output = viewModel.transform(from: input, cancelBag: cancelBag)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아래는 코드 패치입니다. 코드 리뷰를 간단하게 도와드리겠습니다. 버그 위험과/또는 개선 제안이 있을 경우 환영합니다:

  • 두 번째 줄에서 "loadUserData()" 함수를 호출하여 사용자 데이터를 로드하고 "memberId" 변수에 저장하고 있습니다. null 값이 반환되거나 "memberId"가 0일 경우를 다루지 않고 있습니다. 필요에 따라 이를 처리하도록 고려해야 합니다.
  • 세 번째 줄의 "Just((0, memberId))"에서 (0, memberId) 튜플을 생성하여 입력으로 사용하고 있습니다. 이 때 memberId가 0일 경우에 대한 예외 처리가 필요합니다.
  • 그 외에는 전체적으로 코드 리뷰하기에 충분한 정보가 주어지지 않으므로 해당 부분은 확인할 수 없습니다.

추가적인 정보를 제공하시면 보다 자세한 리뷰를 할 수 있습니다.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ final class MyPageViewController: UIViewController {

private var cancelBag = CancelBag()
var viewModel: MyPageViewModel
var memberId: Int = loadUserData()?.memberId ?? 0

var currentPage: Int = 0 {
didSet {
Expand All @@ -43,8 +44,14 @@ final class MyPageViewController: UIViewController {
// MARK: - UI Components

let rootView = MyPageView()

// MARK: - Life Cycles
let statusBarView = UIView(frame: UIApplication.shared.statusBarFrame)
private var navigationBackButton: UIButton = {
let button = UIButton()
button.setImage(ImageLiterals.Common.btnBackGray, for: .normal)
return button
}()

// MARK: - Life Cycles

override func loadView() {
super.loadView()
Expand Down Expand Up @@ -75,15 +82,35 @@ final class MyPageViewController: UIViewController {
super.viewWillAppear(true)

bindViewModel()
let image = ImageLiterals.MyPage.icnMenu
let renderedImage = image.withRenderingMode(.alwaysOriginal)
let hambergerButton = UIBarButtonItem(image: renderedImage,
style: .plain,
target: self,
action: #selector(hambergerButtonTapped))
navigationItem.rightBarButtonItem = hambergerButton

self.navigationItem.title = StringLiterals.MyPage.MyPageNavigationTitle
if memberId == loadUserData()?.memberId ?? 0 {
self.navigationItem.title = StringLiterals.MyPage.MyPageNavigationTitle
self.tabBarController?.tabBar.isHidden = false
hambergerButton.isHidden = false
navigationBackButton.isHidden = true
} else {
self.navigationItem.title = ""
self.tabBarController?.tabBar.isHidden = true
hambergerButton.isHidden = true
navigationBackButton.isHidden = false
}
Comment on lines +93 to +103
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3
나중에 시간 되면 따로 함수로 빼줘도 좋을 거 같아요!

self.navigationController?.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.donWhite]
self.navigationItem.hidesBackButton = true
}

override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(true)

self.navigationController?.navigationBar.backgroundColor = .clear
statusBarView.removeFromSuperview()
navigationBackButton.removeFromSuperview()
}

override func viewDidLayoutSubviews() {
Expand Down Expand Up @@ -111,18 +138,14 @@ extension MyPageViewController {
self.tabBarController?.tabBar.isTranslucent = true
self.navigationController?.navigationBar.backgroundColor = .donBlack
self.navigationController?.navigationBar.barTintColor = .donBlack

let image = ImageLiterals.MyPage.icnMenu
let renderedImage = image.withRenderingMode(.alwaysOriginal)
let hambergerButton = UIBarButtonItem(image: renderedImage,
style: .plain,
target: self,
action: #selector(hambergerButtonTapped))

navigationItem.rightBarButtonItem = hambergerButton
}

private func setLayout() {
self.navigationController?.navigationBar.addSubviews(navigationBackButton)
navigationBackButton.snp.makeConstraints {
$0.centerY.equalToSuperview()
$0.leading.equalToSuperview().inset(23.adjusted)
}
rootView.pageViewController.view.snp.makeConstraints {
$0.top.equalTo(rootView.segmentedControl.snp.bottom).offset(2.adjusted)
$0.leading.trailing.equalToSuperview()
Expand All @@ -140,6 +163,7 @@ extension MyPageViewController {
}

private func setAddTarget() {
navigationBackButton.addTarget(self, action: #selector(backButtonPressed), for: .touchUpInside)
rootView.segmentedControl.addTarget(self, action: #selector(changeValue(control:)), for: .valueChanged)
rootView.myPageBottomsheet.profileEditButton.addTarget(self, action: #selector(profileEditButtonTapped), for: .touchUpInside)
rootView.myPageBottomsheet.accountInfoButton.addTarget(self, action: #selector(accountInfoButtonTapped), for: .touchUpInside)
Expand All @@ -148,7 +172,7 @@ extension MyPageViewController {
}

private func bindViewModel() {
let input = MyPageViewModel.Input(viewUpdate: Just((1)).eraseToAnyPublisher())
let input = MyPageViewModel.Input(viewUpdate: Just((1, self.memberId)).eraseToAnyPublisher())

let output = viewModel.transform(from: input, cancelBag: cancelBag)

Expand Down Expand Up @@ -258,6 +282,11 @@ extension MyPageViewController {
let navigationBarHeight = self.navigationController?.navigationBar.frame.height ?? 0
rootView.myPageScrollView.setContentOffset(CGPoint(x: 0, y: -rootView.myPageScrollView.contentInset.top - navigationBarHeight - statusBarHeight), animated: true)
}

@objc
private func backButtonPressed() {
self.navigationController?.popViewController(animated: true)
}
}

// MARK: - Network

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 코드 패치의 간단한 코드 리뷰를 도와드리겠습니다.

  1. memberId 변수는 loadUserData()?.memberId ?? 0로 초기화됩니다. 이 코드에서 loadUserData() 함수가 어디에 정의되어 있는지 확인해야 합니다.

  2. hambergerButton은 왜 액션 없이 생성되었는지 확인해야 합니다. 사용되지 않을 경우 제거할 수도 있습니다.

  3. viewWillAppear(_:) 메서드에서 self.tabBarController?.tabBar.isHidden을 설정하는 부분은 두 번 사용되었는데, 한 번으로 축약하여 사용할 수 있습니다.

  4. viewWillDisappear(_:) 메서드에서 statusBarViewnavigationBackButtonremoveFromSuperview()가 호출됩니다. 이 두 요소가 필요하지 않다면 제거하는 것이 좋습니다.

  5. setLayout() 메서드에서 navigationController?.navigationBar.addSubviews(navigationBackButton)와 관련된 코드가 있지만, addSubviews(_:) 메서드가 정의되어 있지 않아 추가적인 정보가 필요합니다.

  6. setAddTarget() 메서드에서 navigationBackButton에 대한 타깃 액션(뒤로 가기)이 설정되어 있지만, 해당 액션 메서드가 구현되지 않았습니다. 필요하다면 구현해야 합니다.

  7. bindViewModel() 메서드에서 MyPageViewModel.InputviewUpdate 입력값으로 (1, self.memberId)이 전달되는데, viewUpdate 입력값의 타입 및 기능을 확인해야 합니다.

  8. backButtonPressed() 메서드에서 뒤로 가기 버튼을 눌렀을 때의 동작이 구현되어 있습니다.

이외에도 코드에서 해당하지 않거나 알 수 없는 부분이 있습니다. 필요한 경우 해당 내용에 대한 추가 정보를 제공하면 더욱 정확한 리뷰를 제공할 수 있습니다.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아래는 코드 패치입니다. 이에 대한 간단한 코드 리뷰를 도와드리겠습니다. 버그 위험 및 개선 제안 등을 환영합니다:

@@ -20,6 +20,7 @@ final class MyPageViewController: UIViewController {

private var cancelBag = CancelBag()

변수 viewModel은 어디에서 초기화되는지 확인해야 합니다. 즉, 해당 뷰 컨트롤러의 인스턴스를 생성할 때 어떻게 초기화되는지 확인해야 합니다.

var viewModel: MyPageViewModel
+var memberId: Int = loadUserData()?.memberId ?? 0
코드 전체에서 선언된 함수나 변수가 없기 때문에, loadUserData() 함수에 대한 정의 또는 사용 방법을 알고 있는지 확인해야 합니다.

let statusBarView = UIView(frame: UIApplication.shared.statusBarFrame)
statusBarView.removeFromSuperview()가 viewWillDisappear(_:) 메서드에서 호출되면서 이를 제거하므로, 추가적인 오브젝트 생성이 필요한지 확인해야 합니다.

생성자에서 사용하는 ImageLiterals.Common.btnBackGray 및 ImageLiterals.MyPage.icnMenu 이미지가 현재 정의되어 있는지 확인해야 합니다.

viewWillAppear(:) 및 viewWillDisappear(:) 메서드에서 self.navigationItem.title과 tabBarController?.tabBar.isHidden 속성, hambergerButton 및 navigationBackButton의 숨김 여부 처리에 대해 확인해야 합니다.

setLayout() 메서드 내에서 self.navigationController?.navigationBar.addSubviews(navigationBackButton)와 navigationBackButton.snp.makeConstraints 등의 레이아웃 작업은 해당 코드에서 제공되지 않았으므로, 추가적인 정보가 필요합니다.

bindViewModel() 메서드에서 MyPageViewModel.Input() 생성자를 통해 viewUpdate 값을 전달하는데, viewUpdate의 타입 및 형식에 대한 정의가 필요합니다.

backButtonPressed() 메서드는 이전 뷰 컨트롤러로 돌아가는 popViewController(animated:) 메서드를 호출하므로, 내비게이션 스택에 이전 뷰 컨트롤러가 있는지 확인해야 합니다.

Expand Down
Loading