-
Notifications
You must be signed in to change notification settings - Fork 0
Feature/#170 #177
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
Feature/#170 #177
Conversation
|
@CodeRabbit review |
โ Actions performedReview triggered.
|
๐ WalkthroughSummary by CodeRabbit
Summary by CodeRabbit
Walkthrough๋๋กญ๋ค์ด๊ณผ ์ผ๋ถ ํ์ดํ/์ปฌ๋ ์ ๋ทฐ ๋ ์ด์์ ๋ฐ ์๊ฐ ์คํ์ผ์ด ๋ณ๊ฒฝ๋๊ณ , Title*View์ ์ปฌ๋ฌ ์ค์ API๊ฐ ์ถ๊ฐ๋์์ผ๋ฉฐ EntireReviewViewController์ vintage ํ๋ ๋ฐ API ํธ์ถ ํ์ด๋ฐ(โviewDidAppear)๊ณผ ๋ค๋ก๊ฐ๊ธฐ ์ก์ ์ด ๋์ ๋์์ต๋๋ค. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
actor User as ์ฌ์ฉ์
participant VC as EntireReviewViewController
participant API as ReviewService
Note over VC: ํ๋ฉด ํ์ (viewDidAppear)
VC->>VC: showBlockingView()
VC->>API: callEntireReviewAPI(wineId, sortType, page, vintage?)
alt ์ฑ๊ณต
API-->>VC: reviews
VC->>VC: update UI (collectionView reload ๋ฑ)
VC->>VC: hideBlockingView()
else ์คํจ
API-->>VC: error
VC->>VC: hideBlockingView()
VC->>VC: errorHandler.report(error)
end
Note over VC,User: ๋ค๋ก๊ฐ๊ธฐ ์ฒ๋ฆฌ
User->>VC: back ๋ฒํผ ํญ
VC->>VC: prevVC() โ navigationController.popViewController(animated:)
Estimated code review effort๐ฏ 4 (Complex) | โฑ๏ธ ~45 minutes Assessment against linked issues
Assessment against linked issues: Out-of-scope changes
Possibly related PRs
Suggested reviewers
Poem
โจ Finishing Touches
๐งช Generate unit tests
๐ชง TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. CodeRabbit Commands (Invoked using PR/Issue comments)Type Other keywords and placeholders
CodeRabbit Configuration File (
|
|
@CodeRabbit review plz |
|
@doyeonk429 ๋ค, PR #177์ ๋ํ ๋ฆฌ๋ทฐ๋ฅผ ์งํํ๊ฒ ์ต๋๋ค. ์ ์ฒด ๋ฆฌ๋ทฐ ํ๋ฉด ๋ฆฌ๋์์ธ ๋ฐ ๋นํฐ์ง ๋ฐ์ดํฐ ์ถ๊ฐ ์์ ์ ๊ฒํ ํด๋๋ฆฌ๊ฒ ์ต๋๋ค. ๐ง Learnings usedโ Actions performedReview triggered.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 3
Caution
Some comments are outside the diff and canโt be posted inline due to platform limitations.
โ ๏ธ Outside diff range comments (1)
DE/DE/Sources/Features/Search/ViewControllers/EntireReviewViewController.swift (1)
121-127: vintage ํ๋ผ๋ฏธํฐ ๋๋ฝ + UI ๋ฉ์ธ ์ค๋ ๋ ๋ณด์ฅ(์ต์ ์ ํ ์)API ํธ์ถ์๋ vintage ์ ๋ฌ์ด ๋น ์ ธ ์์ต๋๋ค. UI ๋ณ๊ฒฝ์ MainActor์์ ์ฒ๋ฆฌํ์ธ์.
์์ diff:
- try await self.callEntireReviewAPI(wineId: self.wineId, sortType: self.currentType, page: 0) + try await self.callEntireReviewAPI(wineId: self.wineId, sortType: self.currentType, page: 0, vintage: self.vintage) DispatchQueue.main.async { self.entireReviewView.reviewCollectionView.setContentOffset(.zero, animated: true) } - self.view.hideBlockingView() + await MainActor.run { self.view.hideBlockingView() }
๐งน Nitpick comments (13)
DE/DE/Sources/Core/CommonUI/View/TitleWithBarView.swift (1)
59-66: ๋ค์ด๋ฐ ์ผ๊ด์ฑ(nit): SubTitle โ Subtitleํ ๋ด ์ปจ๋ฒค์ ์ด ์๋ค๋ฉด subtitle์ ํ ๋จ์ด๋ก ํต์ผํ๋ ๊ฑธ ์ถ์ฒํฉ๋๋ค. ํ์ฌ ํ์ผ๊ณผ TitleWithoutBarView ๋ชจ๋ ๋์ผํ๊ฒ ๋ฐ์ ํ์.
DE/DE/Sources/Core/CommonUI/View/CustomDropdownView.swift (3)
76-80: ๋๋กญ๋ค์ด ๋ฉ๋ด์ ํญ/๋์ด ์ ์ฝ ๋ณด๊ฐ ํ์ํ์ฌ trailing๋ง ๊ณ ์ ๋๊ณ ํญ ์ ์ฝ์ด ์์ด ์ฝํ ์ธ ๊ธธ์ด์ ๋ฐ๋ผ ๋ฉ๋ด ํญ์ด ๋ค์ญ๋ ์ญํ๊ฑฐ๋ ํ๋ฉด์ ๋์ด๊ฐ ์ ์์ต๋๋ค. ์ต์ ์ด ๋ง์ ๋ ๊ณ ์ ๋์ด(35*count)๋ก ํ๋ฉด์ ์ด๊ณผํ ์๋ ์์ด์. ๋ฒํผ ํญ ์ด์, ํ๋ฉด ๋น์จ ์ดํ๋ก ์ ํํด ์ฃผ์ธ์.
์์ diff:
dropdownMenu.snp.makeConstraints { $0.top.equalTo(dropdownButton.snp.bottom).offset(8) $0.trailing.equalTo(dropdownButton.snp.trailing).inset(16) - $0.height.equalTo(35 * options.count) + $0.width.greaterThanOrEqualTo(dropdownButton.snp.width) + $0.height.equalTo(35 * options.count) + $0.height.lessThanOrEqualTo(UIScreen.main.bounds.height * 0.4) } // ๊ฐ ์ต์ ๋ผ๋ฒจ ์ ์ฝ์ ๊ทธ๋๋ก ์ฌ์ฉํด๋ ๋ฉ๋๋คAlso applies to: 97-99
67-71: ๋์์ธ ํ ํฐ ์ฌ์ฉ ๊ถ์ฅ(nit): shadowColor ํ๋์ฝ๋ฉ
UIColor(hex: "111111")๋์ DesignSystem์ ์ปฌ๋ฌ ํ ํฐ(AppColor ํน์ shadow ์ ์ฉ ํ ํฐ)์ด ์๋ค๋ฉด ๊ทธ๊ฑธ๋ก ํต์ผํ๋ ๊ฒ ์ ์ง๋ณด์์ ์ ๋ฆฌํฉ๋๋ค. hex ํ์ฑ ์คํจ ์ ๊ทธ๋ฆผ์๊ฐ ์ ์ฉ๋์ง ์๋ ์ ๋ ๊ฐ์.
110-125: ์ธ๋ถ ํฐ์น๋ก ๋ซ๊ธฐ UX(์ต์ )ํ์ฌ๋ ๋ฒํผ์ ๋ค์ ๋๋ฌ์ผ ๋ซํ๋๋ค. ๋ฐ๊นฅ ์์ญ ํญ ์ ๋ซํ๋๋ก ์ค๋ฒ๋ ์ด(ํฌ๋ช ๋ทฐ)๋ window ๋ ๋ฒจ ์ปจํ ์ด๋ ์ฌ์ฉ์ ๊ณ ๋ คํด ๋ณด์ธ์. ๋ถ๋ชจ๊ฐ
clipsToBounds = true์ธ ๊ฒฝ์ฐ๋ ๋๋น๋ฉ๋๋ค.DE/DE/Sources/Core/CommonUI/View/TitleWithoutBarView.swift (1)
41-48: ๋ค์ด๋ฐ ์ผ๊ด์ฑ(nit): SubTitle โ Subtitle๋์ผํ๊ฒ subtitle๋ก ํต์ผ ๊ถ์ฅ๋๋ฆฝ๋๋ค.
DE/DE/Sources/Features/Search/ViewControllers/EntireReviewViewController.swift (8)
17-18: ๋ถํ์ํ nil ์ด๊ธฐํ ์ ๊ฑฐ(nit)์ต์ ๋์ ๊ธฐ๋ณธ๊ฐ์ด nil์ด๋ผ
= nil์ ์๋ตํด๋ ๋ฉ๋๋ค.์ ์ฉ diff:
-var vintage: Int? = nil +var vintage: Int?
106-114: ๋๋กญ๋ค์ด ํญ ๋ก๊น ์์น ์กฐ์ (nit)
setupDropdownAction()์ง์ ์์ ์ ๋ก๊น ๋์ด ์ค์ ํญ ์ด๋ฒคํธ์ ์์ ์ด ์ด๊ธ๋ฉ๋๋ค. ์ต์ ์ด ์ ํ๋ ๋(ํน์ ๋ฒํผ ํ ๊ธ ์) ๋ก๊น ํ์ธ์.์์ diff:
- logButtonClick(screenName: screenName, buttonName: Tracking.ButtonEvent.dropdownBtnTapped, fileName: #file) entireReviewView.dropdownView.onOptionSelected = { [weak self] selectedOption in guard let self = self else { return } + self.logButtonClick(screenName: self.screenName, buttonName: Tracking.ButtonEvent.dropdownBtnTapped, fileName: #file) if selectedOption == "์ต์ ์" {
100-102: safeArea ์ ๋ ฌ ๊ถ์ฅ(์ต์ )๊ฐ๋ก ์์ง ์ ์ฝ์ safeArea ๊ธฐ์ค์ด ๋ ์์ ํฉ๋๋ค(ํนํ iPad, ๊ฐ๋ก๋ชจ๋).
- $0.horizontalEdges.equalToSuperview() + $0.horizontalEdges.equalTo(view.safeAreaLayoutGuide)
81-91: ํ์ดํ ์ค๋ฐ๊ฟ ๋ฐฉ์(nit)ํ๊ธ์
byWordWrapping์ด ๋ ์์ฐ์ค๋ฌ์ด ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๋์์ธ์ ๋ง๋์ง ํ์ธํด ๋ณด์ธ์.- largeTitleLabel.lineBreakMode = .byCharWrapping + largeTitleLabel.lineBreakMode = .byWordWrapping
234-246: ๋ฌดํ ์คํฌ๋กค Task์ self ์บก์ฒ์ UI ์ค๋ ๋ ๋ณด์ฅํ๋ฉด ์ดํ ์์๋ Task๊ฐ self๋ฅผ ๊ฐํ๊ฒ ์ก์๋ ์ ์์ต๋๋ค. [weak self]๋ก ์บก์ฒํ๊ณ UI๋ MainActor์์ ์ฒ๋ฆฌํ์ธ์. ์ค๋ณต reload๋ ์ ๊ฑฐ ๊ฐ๋ฅํฉ๋๋ค(์๋ ๋ณ๋ ์ฝ๋ฉํธ ์ฐธ๊ณ ).
์์ diff:
- Task { + Task { [weak self] in - do { - try await callEntireReviewAPI(wineId: self.wineId, sortType: currentType, page: currentPage + 1) - self.view.hideBlockingView() + guard let self = self else { return } + do { + try await self.callEntireReviewAPI(wineId: self.wineId, sortType: self.currentType, page: self.currentPage + 1, vintage: self.vintage) + await MainActor.run { self.view.hideBlockingView() } } catch { - self.view.hideBlockingView() + await MainActor.run { self.view.hideBlockingView() } errorHandler.handleNetworkError(error, in: self) } - DispatchQueue.main.async { - self.entireReviewView.reviewCollectionView.reloadData() - } isLoading = false }
242-244: reloadData ์ค๋ณต ํธ์ถ ์ ๊ฑฐ
callEntireReviewAPI๋ด๋ถ์์ ์ด๋ฏธ reload๋ฅผ ์ํํ๊ณ ์์ต๋๋ค(๋ผ์ธ 166-167). ์ฌ๊ธฐ์ ํ ๋ฒ ๋ ํธ์ถํ ํ์๊ฐ ์์ด ๋ ์ด์์ ์ฝ์คํธ๋ง ๋์ด๋ฉ๋๋ค.-DispatchQueue.main.async { - self.entireReviewView.reviewCollectionView.reloadData() -}
106-118: ํ๋์ฝ๋ฉ๋ ์ ๋ ฌ ๋ฌธ์์ด ๋งคํ ๊ฐ์ (์ต์ )๋ฌธ์์ด ๋น๊ต ์ฒด์ธ ๋์ enum ๋๋ ๋งคํ ๋์ ๋๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์คํ/๋ก์ผ์ผ ๋ณ๊ฒฝ์ ๊ฒฌ๊ณ ํฉ๋๋ค.
์ํ๋ค๋ฉด enum ๊ธฐ๋ฐ์ผ๋ก ์นํ ์ฝ๋ ์์ฑํด ๋๋ฆด๊ฒ์.
41-44: indicator ๊ด๋ฆฌ ์์น ์ผ๊ดํ(์ต์ )
viewWillAppear์์ ๋งค๋ฒview.addSubview(indicator)ํธ์ถ ์ ์ค๋ณต ์ถ๊ฐ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. indicator ์ถ๊ฐ/์ ๊ฑฐ๋ฅผshowBlockingView/hideBlockingView๋ด๋ถ๋ก ์บก์ํํ๋ ํธ์ด ์์ ํฉ๋๋ค.
๐ Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
๐ก Knowledge Base configuration:
- MCP integration is disabled by default for public repositories
- Jira integration is disabled by default for public repositories
- Linear integration is disabled by default for public repositories
You can enable these sources in your CodeRabbit configuration.
๐ Files selected for processing (5)
DE/DE/Sources/Core/CommonUI/View/CustomDropdownView.swift(2 hunks)DE/DE/Sources/Core/CommonUI/View/EntireReviewView.swift(3 hunks)DE/DE/Sources/Core/CommonUI/View/TitleWithBarView.swift(1 hunks)DE/DE/Sources/Core/CommonUI/View/TitleWithoutBarView.swift(1 hunks)DE/DE/Sources/Features/Search/ViewControllers/EntireReviewViewController.swift(3 hunks)
๐งฐ Additional context used
๐ง Learnings (1)
๐ Common learnings
Learnt from: doyeonk429
PR: Drink-Easy/DE_iOS#0
File: :0-0
Timestamp: 2025-08-30T13:14:55.580Z
Learning: ์ฌ์ฉ์ doyeonk429๋ ํ๊ตญ์ด๋ก ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ๊ธฐ๋ฅผ ์ ํธํฉ๋๋ค.
๐งฌ Code graph analysis (4)
DE/DE/Sources/Core/CommonUI/View/TitleWithBarView.swift (1)
DE/DE/Sources/Core/CommonUI/View/TitleWithoutBarView.swift (2)
setTitleColor(42-44)setSubTitleColor(46-48)
DE/DE/Sources/Core/CommonUI/View/TitleWithoutBarView.swift (1)
DE/DE/Sources/Core/CommonUI/View/TitleWithBarView.swift (2)
setTitleColor(60-62)setSubTitleColor(64-66)
DE/DE/Sources/Core/CommonUI/View/EntireReviewView.swift (1)
DE/DE/Sources/Core/Extensions/UIView+Extensions.swift (1)
addSubviews(78-80)
DE/DE/Sources/Features/Search/ViewControllers/EntireReviewViewController.swift (2)
DE/DE/Sources/Core/Extensions/UIView+Extensions.swift (3)
showColorBlockingView(24-39)hideBlockingView(41-53)addSubviews(78-80)DE/DE/Sources/DesignSystem/Font/TextStyle.swift (1)
apply(68-70)
๐ช SwiftLint (0.57.0)
DE/DE/Sources/Features/Search/ViewControllers/EntireReviewViewController.swift
[Warning] 17-17: Initializing an optional variable with nil is redundant
(redundant_optional_initialization)
๐ Additional comments (6)
DE/DE/Sources/Core/CommonUI/View/TitleWithBarView.swift (1)
59-66: ํ์ดํ/์๋ธํ์ดํ ์์ ์ธํฐ ์ถ๊ฐ ์ข์ต๋๋ค๊ฐ๋จํ๊ณ ๋ช ํํ API๋ก ์ฌ์ฌ์ฉ์ฑ์ด ์ฌ๋ผ๊ฐ๋๋ค.
DE/DE/Sources/Core/CommonUI/View/TitleWithoutBarView.swift (1)
41-48: ์์ ์ธํฐ ์ถ๊ฐ LGTMTitleWithBarView์ API ํํ๊ฐ ๋ง์ถฐ์ ธ์ ์ฌ์ฉ์ฑ์ด ์ข์์ก์ต๋๋ค.
DE/DE/Sources/Core/CommonUI/View/EntireReviewView.swift (2)
24-26: ์คํฌ๋กค ์ธ๋์ผ์ดํฐ ๋นํ์ ๋ณ๊ฒฝ OK๋ฆฌ์คํธ ์ง์ค๋๋ฅผ ๋์ด๋ ๋ฐฉํฅ์ผ๋ก ์ ์ ํฉ๋๋ค.
57-58: ์๋จ ๊ฐ๊ฒฉ 16 ๋ณ๊ฒฝ OK๊ธฐ์กด ๋์ ํจ๋ฉ์์ ๊ณ ์ ๊ฐ์ผ๋ก ๋จ์ํ. ์คํฌ๋ฆฐ์ท ์ ๋์์ธ๊ณผ ๋ง๋ค๋ฉด ๋ฌธ์ ์์ต๋๋ค.
DE/DE/Sources/Features/Search/ViewControllers/EntireReviewViewController.swift (2)
136-143: API ๊ฒฐ๊ณผ ํ์ฑ ๊ฐ๋๋ฌธ OK, ํ์ง๋ง ๋น ์๋ต ์ ์ํ ๋ฆฌ์ ๊ณ ๋ ค(์ต์ )
response == nil๋๋content == nil์ผ ๋ UI ์ํ/ํ๋๊ทธ(isLoading ๋ฑ) ๋ฆฌ์ ๋ก์ง์ด ํธ์ถ ๊ฒฝ๋ก์ ๋ฐ๋ผ ๋๋ฝ๋ ์ ์์ต๋๋ค. ์คํฌ๋กค ๋ก๋ฉ ๊ฒฝ๋ก์์ ๋น ๊ฒฐ๊ณผ์ผ ๋๋ isLoading์ด false๋ก ๋์๊ฐ๋์ง ์ฌํ์ธ ๋ถํ๋๋ฆฝ๋๋ค.
119-131: showBlockingView ๊ตฌํ ํ์ธ๋จ
UIView+Extensions.swift์showBlockingView()๊ฐ ์ ์ ๊ตฌํ๋์ด ์์ด ์ปดํ์ผ ์ค๋ฅ๋ ๋ฐํ์ ๋ฏธ๋์ ์ด์๊ฐ ์์ต๋๋ค.
DE/DE/Sources/Features/Search/ViewControllers/EntireReviewViewController.swift
Show resolved
Hide resolved
DE/DE/Sources/Features/Search/ViewControllers/EntireReviewViewController.swift
Show resolved
Hide resolved
โฆ into design/issue-170
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
Caution
Some comments are outside the diff and canโt be posted inline due to platform limitations.
โ ๏ธ Outside diff range comments (1)
DE/DE/Sources/Core/CommonUI/Cells/ReviewCollectionViewCell.swift (1)
105-113: โ๋๋ณด๊ธฐโ ๋ ธ์ถ ํ๋จ ๋ก์ง์ด ์ค์ ๋ ๋๋ง ํฐํธ/ํญ๊ณผ ์ด๊ธ๋ ์ ์์ต๋๋ค.
AppTextStyle.apply๋ attributedText๋ฅผ ์ธํ ํ๋ฏ๋กreview.font๊ฐ ์ค์ ํฐํธ์ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค.contentView.frame.width๋ layout ์ ์ 0์ด์ด์ ๊ณ์ฐ์ด ๋น๋๊ฐ๋๋ค.๋ ์ด๋ธ์ ์ค์ bounds ํญ๊ณผ attributedText์ ํฐํธ/paragraphStyle์ ์ฌ์ฉํ๋๋ก ๋ณด์ ํ์ธ์.
- private func isReviewTextTruncated() -> Bool { - guard let text = review.text else { return false } - - let labelWidth = contentView.frame.width - 30 - let labelFont = review.font ?? UIFont.systemFont(ofSize: 16) - let lineSpacing = review.font.pointSize * 0.3 - let numberOfLines = text.numberOfLines(width: labelWidth, font: labelFont, lineSpacing: lineSpacing) - return numberOfLines > 2 - } + private func isReviewTextTruncated() -> Bool { + contentView.layoutIfNeeded() + guard let plain = review.text, !plain.isEmpty else { return false } + let width = review.bounds.width > 0 + ? review.bounds.width + : max(contentView.bounds.width - 32, 0) // review ์ข์ฐ inset 16*2 + guard width > 0 else { return false } + + var font = review.font ?? UIFont.systemFont(ofSize: 16) + var lineSpacing: CGFloat = 0 + if let attr = review.attributedText { + if let f = attr.attribute(.font, at: 0, effectiveRange: nil) as? UIFont { + font = f + } + if let ps = attr.attribute(.paragraphStyle, at: 0, effectiveRange: nil) as? NSParagraphStyle { + lineSpacing = ps.lineSpacing + } + } + let lines = plain.numberOfLines(width: width, font: font, lineSpacing: lineSpacing) + return lines > 2 + }
๐งน Nitpick comments (4)
DE/DE/Sources/Core/CommonUI/Cells/ReviewCollectionViewCell.swift (4)
91-92: ํ์ ํ๊ธฐ ํฌ๋งท ๊ณ ์ ๋ฐ ๋ก์ผ์ผ ๋์ ์ ์.
String(model.rating)์ 4.0/4.500000 ๋ฑ ๋ ธ์ถ์ด ๋ค์ญ๋ ์ญํ ์ ์์ต๋๋ค. NumberFormatter๋ก ์ต๋ ์์ 1์๋ฆฌ, ๋ก์ผ์ผ ๋ฐ์ํ์ธ์.์๋์ฒ๋ผ ์ ์ฉํ๋ฉด ๋ฉ๋๋ค:
- AppTextStyle.KR.body2 - .apply(to: score, text: "โ \(String(model.rating))", color: AppColor.purple100) + let ratingFormatter = NumberFormatter().then { + $0.numberStyle = .decimal + $0.minimumFractionDigits = 0 + $0.maximumFractionDigits = 1 + } + let ratingText = ratingFormatter.string(from: NSNumber(value: model.rating)) ?? "\(model.rating)" + AppTextStyle.KR.body2 + .apply(to: score, text: "โ \(ratingText)", color: AppColor.purple100)
62-71: ๊ธด ๋๋ค์/์ ์/๋ ์ง๊ฐ ํ ์ค์์ ์ถฉ๋ํ ์ ์์ต๋๋ค โ ์ฐ์ ์์ ์กฐ์ .๋๋ค์์ด ๊ธธ๋ฉด score๊ฐ ์ค๋ฅธ์ชฝ date์ ๊ฒน์น๊ฑฐ๋ ์ค๋ฐ๊ฟ๋ ์ฌ์ง๊ฐ ์์ต๋๋ค. Hugging/Compression ์ฐ์ ์์๋ฅผ ์กฐ์ ํด ์์ ํ๊ฒ ๋ฐฐ์นํ์ธ์.
// ์: init ๋๋ constraints() ๋ง๋ฏธ์ ์ถ๊ฐ nickname.setContentCompressionResistancePriority(.defaultLow, for: .horizontal) score.setContentCompressionResistancePriority(.defaultLow, for: .horizontal) date.setContentCompressionResistancePriority(.required, for: .horizontal) score.setContentHuggingPriority(.defaultLow, for: .horizontal) date.setContentHuggingPriority(.required, for: .horizontal)Also applies to: 78-81
29-35: โ๋๋ณด๊ธฐ/์ ๊ธฐโ ๋ฌธ์์ด ๋ก์ปฌ๋ผ์ด์ฆ + ์ ๊ทผ์ฑ ๋ผ๋ฒจ ๋ณด๊ฐ ์ ์.ํ๋์ฝ๋ฉ๋ ํ ์คํธ๋ ๋ค๊ตญ์ด ๋์์ด ์ด๋ ต์ต๋๋ค. Localizable.strings๋ก ๋ถ๋ฆฌํ๊ณ , ํ ๊ธ ์ VoiceOver๊ฐ ์ํ๋ฅผ ์ธ์งํ ์ ์๊ฒ ์ ๊ทผ์ฑ ๋ผ๋ฒจ/ํํธ๋ ์ค์ ํ์ธ์.
// ํ์ดํ ์ธํ toggleButton.setTitle(NSLocalizedString("review.more", comment: "๋๋ณด๊ธฐ"), for: .normal) // ํ ๊ธ ์ toggleButton.setTitle(isExpanded ? NSLocalizedString("review.collapse", comment: "์ ๊ธฐ") : NSLocalizedString("review.more", comment: "๋๋ณด๊ธฐ"), for: .normal) // ์ ๊ทผ์ฑ toggleButton.accessibilityLabel = NSLocalizedString("review.toggle", comment: "๋ฆฌ๋ทฐ ํผ์น๊ธฐ/์ ๊ธฐ") toggleButton.accessibilityValue = isExpanded ? NSLocalizedString("expanded", comment: "ํผ์ณ์ง") : NSLocalizedString("collapsed", comment: "์ ํ")์ถ๊ฐ๋ก score์๋ ์:
score.accessibilityLabel = "ํ์ \(ratingText)์ ".Also applies to: 47-52
36-45: ์ฌ์ฌ์ฉ ์ ์์ฌ attributedText๋ก ์ธํ ๊น๋นก์ ๋ฐฉ์ง.์ ์ฌ์ฌ์ฉ์์ ์ด์ ๋ด์ฉ์ด ์๊ฐ ๋ณด์๋ค๊ฐ ๋ฐ๋๋ ํ์์ ์ค์ด๋ ค๋ฉด
prepareForReuse()์์ label์ ์ด๊ธฐํํ์ธ์.public override func prepareForReuse() { super.prepareForReuse() nickname.text = nil nickname.attributedText = nil score.text = nil score.attributedText = nil review.text = nil review.attributedText = nil date.text = nil isExpanded = false }
๐ Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
๐ก Knowledge Base configuration:
- MCP integration is disabled by default for public repositories
- Jira integration is disabled by default for public repositories
- Linear integration is disabled by default for public repositories
You can enable these sources in your CodeRabbit configuration.
๐ Files selected for processing (1)
DE/DE/Sources/Core/CommonUI/Cells/ReviewCollectionViewCell.swift(2 hunks)
๐งฐ Additional context used
๐ง Learnings (1)
๐ Common learnings
Learnt from: doyeonk429
PR: Drink-Easy/DE_iOS#0
File: :0-0
Timestamp: 2025-08-30T13:14:55.580Z
Learning: ์ฌ์ฉ์ doyeonk429๋ ํ๊ตญ์ด๋ก ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ๊ธฐ๋ฅผ ์ ํธํฉ๋๋ค.
๐งฌ Code graph analysis (1)
DE/DE/Sources/Core/CommonUI/Cells/ReviewCollectionViewCell.swift (1)
DE/DE/Sources/DesignSystem/Font/TextStyle.swift (1)
apply(68-70)
๐ Additional comments (1)
DE/DE/Sources/Core/CommonUI/Cells/ReviewCollectionViewCell.swift (1)
20-20: ์คํ์ผ ๋ถ๋ฆฌ ๋ฐฉํฅ ์ข์ต๋๋ค.score๋ ์ด๊ธฐํ ์ ๊ธฐ๋ณธ UILabel๋ก ๋๊ณ , configure์์ AppTextStyle๋ก๋ง ์คํ์ผ๋งํ๋ ํ๋ฆ์ด ๋ช ํํด์ก์ต๋๋ค. ์ฌ์ฌ์ฉ ์ ์คํ์ผ ์ผ๊ด์ฑ์ด ์ข์์ง๋๋ค.
๐ PR ๊ฐ์
๐ก PR ์ ํ
โ๏ธ ๋ณ๊ฒฝ ์ฌํญ ์์ฝ
๐ ๊ด๋ จ ์ด์
๐งช ํ ์คํธ ๋ด์ญ
๐จ ์คํฌ๋ฆฐ์ท ๋๋ ์์ฐ ์์ (์ ํ)
โ PR ์ฒดํฌ๋ฆฌ์คํธ
develop์ ๋๋ค๐ฌ ์ถ๊ฐ ์ค๋ช or ๋ฆฌ๋ทฐ ํฌ์ธํธ (์ ํ)