- 
                Notifications
    
You must be signed in to change notification settings  - Fork 0
 
๐ :: (#468) ๋ฉด์ ํ๊ธฐ ๊ธฐ๋ฅ ๋ฆฌํฉํ ๋ง #473
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
base: develop
Are you sure you want to change the base?
The head ref may contain hidden characters: "feature/468-\uBA74\uC811\uD6C4\uAE30-\uAE30\uB2A5-\uB9AC\uD329\uD1A0\uB9C1"
Conversation
          
๐ Walkthrough๐ฐ ์ฝ๋ ๋ฆฌ๋ทฐ ์์ฝ์ํฌ์ค๋ฃจpost-review ๊ธฐ๋ฅ ๋ชจ๋์ ์๋ก ์ถ๊ฐํ๊ณ ๋ฆฌ๋ทฐ ์์คํ ์ ์ ๋ฐ์ ์ผ๋ก ๋ฆฌํฉํ ๋งํ์ต๋๋ค. ๊ธฐ์กด์ ๋ฆฌ๋ทฐ ์์ธ ์กฐํ ๋ฐ ์์ฑ ๊ธฐ๋ฅ์ ์ฌ๋ฌ ํ๋ฉด์ผ๋ก ๋ถ๋ฆฌํ์ผ๋ฉฐ, ์ธํฐ๋ทฐ ํ์ ๊ณผ ์์น ๋ฑ ์๋ก์ด ํํฐ๋ง ์ต์ ์ ์ถ๊ฐํ๊ณ ๋ค๋น๊ฒ์ด์  ๊ตฌ์กฐ๋ฅผ ๊ฐํธํ์ต๋๋ค. ๋ณ๊ฒฝ ์ฌํญ
 ์ํ์ค ๋ค์ด์ด๊ทธ๋จsequenceDiagram
    actor User
    participant App as App Layer
    participant Nav as Navigation
    participant PostReview as Post-Review Feature
    participant Domain as Domain Layer
    participant Network as Network Layer
    User->>App: ๋ฆฌ๋ทฐ ์์ฑ ์์
    App->>Nav: navigateToPostReview(companyName, companyId)
    Nav->>PostReview: PostReview ํ๋ฉด ํ์
    
    User->>PostReview: ์ธํฐ๋ทฐ ํ์
 ์ ํ
    PostReview->>PostReview: onNextClick()
    
    User->>PostReview: ์์น/๊ธฐ์ /๊ฐ์ ์
๋ ฅ
    PostReview->>PostReview: ์ ํ์ฌํญ ์์ง
    
    User->>PostReview: ์ง๋ฌธ/๋ต๋ณ ์
๋ ฅ
    PostReview->>PostReview: ์ต์ข
 ๋ฐ์ดํฐ ์์ง
    
    User->>PostReview: ์ ์ถ ๋ฒํผ ํด๋ฆญ
    PostReview->>Domain: PostReviewUseCase ํธ์ถ
    Domain->>Network: POST /reviews
    Network-->>Domain: Success/BadRequest
    
    alt ์ฑ๊ณต
        Domain-->>PostReview: Success
        PostReview->>Nav: navigateToPostReviewComplete()
        Nav->>PostReview: ์๋ฃ ํ๋ฉด ํ์ (1.5์ด ํ)
        PostReview->>Nav: navigateToPostReview()
    else ์คํจ
        Domain-->>PostReview: BadRequest
        PostReview->>User: ์๋ฌ ํ ์คํธ ํ์
    end
    ์์ ์ฝ๋ ๋ฆฌ๋ทฐ ์์ ์๊ฐ๐ฏ 4 (๋ณต์กํจ) | โฑ๏ธ ~60๋ถ ์ถ๊ฐ ๊ฒํ ํ์ ์์ญ:
 ๊ด๋ จ PR
 ์ถ์ฒ ๋ฆฌ๋ทฐ์ด
 ์
 Pre-merge checks and finishing touchesโ Failed checks (2 warnings)
 โ Passed checks (1 passed)
 โจ Finishing touches
 ๐งช Generate unit tests (beta)
 Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment   | 
    
| 
           Note Docstrings generation - SKIPPED  | 
    
| 
          
 Note Unit test generation is an Early Access feature. Expect some limitations and changes as we gather feedback and continue to improve it. Generating unit tests... This may take up to 20 minutes.  | 
    
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: 29
Caution
Some comments are outside the diff and canโt be posted inline due to platform limitations.
โ ๏ธ  Outside diff range comments (2)
feature/review/src/main/java/team/retum/review/viewmodel/ReviewDetailsViewModel.kt (1)
22-24: reviewId ํ์ ๋ถ์ผ์น(Long vs String) ๋ช ํํ ํด์ผ ํจ๋ด๋น๊ฒ์ด์ /UI ๊ณ์ธต์์๋ Long ์ฌ์ฉ(ReviewItems, ReviewDetailsNavigation), ViewModel๊ณผ ๋คํธ์ํฌ ๊ณ์ธต์์๋ String ์ฌ์ฉํฉ๋๋ค. ReviewDetailsScreen 62์ค์์
.toString()๋ณํ์ด ๋ฐ์ํ๋ฉฐ, ํ๋ณํ ์ค๋ฅ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.๋๋ฉ์ธ ์ ์ญ์ผ๋ก Long์ผ๋ก ํต์ผํ๊ฑฐ๋, ๊ฒฝ๊ณ ๋ณํ ๋ก์ง์ ๋ช ํํ ์ ์ํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
Also applies to: 39-61, feature/review/src/main/java/team/retum/review/ui/ReviewDetailsScreen.kt:62
app/src/main/java/team/retum/jobisandroidv2/root/RootNavigation.kt (1)
37-41: navArgument ์ค์  ์คํ๋ก ์ธํ ๋ฐํ์ ํฌ๋์ ์์ง(ํ์ ์์ )
navArgument(APPLICATION_ID) { NavType.StringType }๋type = ...์ด ๋๋ฝ๋์์ต๋๋ค. ๋ํ ์ค์ ๋ก Long์ผ๋ก ์ฌ์ฉํ๋ฏ๋ก LongType์ผ๋ก ์ผ์น์ํค๋ ํธ์ด ์์ ํฉ๋๋ค.- arguments = listOf(navArgument(APPLICATION_ID) { NavType.StringType }), + arguments = listOf(navArgument(APPLICATION_ID) { type = NavType.LongType }), @@ - applicationId = it.arguments?.getString(APPLICATION_ID)?.toLong(), + applicationId = it.arguments?.getLong(APPLICATION_ID),
๐งน Nitpick comments (55)
core/network/src/main/java/team/retum/network/api/InterestsApi.kt (1)
1-3: ๋น ์ธํฐํ์ด์ค์ ์ฉ๋๋ฅผ ๋ช ํํ ํด์ฃผ์ธ์.์ด ์ธํฐํ์ด์ค๊ฐ ํ์ฌ ๋น์ด์์ด ์ค์  ๊ธฐ๋ฅ์ด ์์ต๋๋ค. PR์ ๋ชฉ์ ์ด ๋ฉด์  ํ๊ธฐ ๊ธฐ๋ฅ ๋ฆฌํฉํ ๋ง์ธ๋ฐ,
InterestsApi๋ผ๋ ๋ค์ด๋ฐ๊ณผ์ ์ฐ๊ด์ฑ๋ ๋ถ๋ถ๋ช ํฉ๋๋ค.๋ค์ ์ฌํญ์ ํ์ธํด์ฃผ์ธ์:
- ์ด๊ฒ์ด ์๋์ ์ธ ํ๋ ์ด์คํ๋ ์ฝ๋์ธ์ง ํ์ธ
 - ์ถํ ๊ตฌํ ์์ ์ด๋ผ๋ฉด TODO ์ฃผ์์ด๋ ๋ฌธ์ํ ์ถ๊ฐ
 - ์ด API๊ฐ PR์ ๋ฆฌ๋ทฐ ๊ธฐ๋ฅ๊ณผ ์ด๋ป๊ฒ ์ฐ๊ด๋๋์ง ์ค๋ช
 ํฅํ ๊ตฌํํ API ์๋ํฌ์ธํธ๋ฅผ ์ ์ํ๋ ๋ฐ ๋์์ด ํ์ํ์๋ฉด ๋ง์ํด์ฃผ์ธ์.
core/network/src/main/java/team/retum/network/model/response/FetchReviewDetailResponse.kt (1)
18-18: ๋ฆฌ์คํธ ํ๋กํผํฐ ๋ค์ด๋ฐ ๊ฐ๋ ์ฑ ๊ฐ์ ์ ์List ํ์ ์ด๋ฏ๋ก qnaResponse โ qnaResponses(๋๋ qnas)๋ก์ ๋ณต์ํ ๋ค์ด๋ฐ์ ๊ถ์ฅํฉ๋๋ค. ์ธ๋ถ ํ๊ธ์ด ํฌ๋ฉด ๋ณด๋ฅํด๋ ๋ฉ๋๋ค.
์ ํธ ์ ์ต์ ๋ณ๊ฒฝ diff:
- @Json(name = "qn_as") val qnaResponse: List<QnAs>, + @Json(name = "qn_as") val qnaResponses: List<QnAs>,feature/post-review/.gitignore (1)
1-1: ๋ชจ๋ .gitignore์/build๊ท์น์ ๋ฃจํธ์์ ์ด๋ฏธ ๋ฌด์๋๊ณ ์์ต๋๋ค๊ฒ์ฆ ๊ฒฐ๊ณผ, ๋ฃจํธ
.gitignore(3์ค)์build/๊ท์น์ด ๋ชจ๋ ์์ค์ build ๋๋ ํ ๋ฆฌ๋ฅผ ์ด๋ฏธ ๋ฌด์ํ๊ณ ์์ผ๋ฏ๋ก, ๋ชจ๋ ๋จ์/build๊ท์น 21๊ฐ ๋ชจ๋ ์ค๋ณต์ ๋๋ค. ์ด ํ์ผ์/build์ถ๊ฐ๋ ๊ธฐ์ ์ ์ผ๋ก๋ ๋ฌธ์ ์์ง๋ง ๋ถํ์ํฉ๋๋ค. ์ ํ์ ์ผ๋ก ์ ๊ฑฐํ๊ฑฐ๋, ๋ชจ๋๋ณ ๋ช ์์ฑ์ด ํ์ํ๋ค๋ฉด ์ ์งํด๋ ๋ฌด๋ฐฉํฉ๋๋ค.core/network/src/main/java/team/retum/network/model/response/FetchMyReviewResponse.kt (1)
6-14: reviewId ํ์ ํฉ์น๊ธฐ (Long vs String) ๊ถ์ฅ๋คํธ์ํฌ ๋ชจ๋ธ์ Long(reviewId)์ธ๋ฐ, feature/review์ ViewModel ์ํ๋ String(reviewId)์ ๋๋ค. ๊ฒฝ๊ณ์์ ๋ณํ์ ๊ฐ์ ํ๊ฑฐ๋, ์ ์ญ์ ์ผ๋ก Long์ผ๋ก ํต์ผํ๋ ์ชฝ์ด ์์ ํฉ๋๋ค. ํ์ ํผ์ฌ๋ ๋ด๋น๊ฒ์ด์ /UseCase ํ๋ผ๋ฏธํฐ์์ ๋ฐํ์ ์ด์๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค.
๋ํ Moshi codegen์ด core:network ๋ชจ๋์์ KSP/kapt๋ก ํ์ฑํ๋ผ ์๋์ง ํ์ธ ๋ถํ๋๋ฆฝ๋๋ค(๋ฆฌํ๋ ์  ํํผ ์ฑ๋ฅ ์ด์ ).
์ต์ : ๋คํธ์ํฌ ์ผ์ ํ๋ ๋๋ฝ์ ๊ฒฌ๊ณ ํ๊ฒ ํ๋ ค๋ฉด ๊ธฐ๋ณธ๊ฐ์ ๋ถ์ฌํ๋ ๊ฒ๋ ๊ณ ๋ ค ๊ฐ๋ฅํฉ๋๋ค.
core/design-system/src/main/res/drawable/ic_success.xml (1)
6-8: ์์ด์ฝ ์์ ํ๋์ฝ๋ฉ ์ง์ (ํดํธ ๊ธฐ๋ฐ ์ ์ด ๊ถ์ฅ)๋์์ธ์์คํ ์์ ์ผ๊ด๋ ํ ๋ง ํดํธ๋ฅผ ์ฐ๋ ค๋ฉด path์ fillColor๋ฅผ ๋ฌด์ฑ์(์: #000000)์ผ๋ก ๋๊ณ ์ฌ์ฉ์ฒ(Icon/Image)์์ tint๋ฅผ ์ ์ฉํ๋ ํธ์ด ์ข์ต๋๋ค.
์์ ๋ณ๊ฒฝ:
- android:fillColor="#2F53FF"/> + android:fillColor="#000000"/>core/design-system/src/main/java/team/retum/jobisdesignsystemv2/review/ReviewContent.kt (1)
48-51: ์์ด์ฝ ์ ๊ทผ์ฑ: contentDescription ์ฒ๋ฆฌํด๋น ํ์ดํ๊ฐ ์ฅ์ ๋ชฉ์ ์ด๋ฉด contentDescription = null ๊ถ์ฅ. ์๋ฏธ๊ฐ ์๋ค๋ฉด stringResource๋ก ์ง์ญํ๋ ๋ฌธ์์ด์ ์ฌ์ฉํ์ธ์.
์์:
- contentDescription = "long arrow", + contentDescription = null,feature/review/src/main/java/team/retum/review/viewmodel/ReviewDetailsViewModel.kt (1)
26-32: ์คํจ/๋ก๋ฉ ์ํ ์ฒ๋ฆฌ ์ถ๊ฐ ๊ถ์ฅonFailure ์ฒ๋ฆฌ์ ๋ก๋ฉ ํ๋๊ทธ๋ฅผ ์ํ์ ํฌํจํด UI๊ฐ ์ ์ ํ ๋์ํ๋๋ก ํด์ฃผ์ธ์(์ค๋ต๋ฐ, ์๋ฌ ๋ทฐ ๋ฑ).
๊ฐ๋จ ์์:
internal fun fetchReviewDetails() { viewModelScope.launch(Dispatchers.IO) { - fetchReviewDetailsUseCase(state.value.reviewId).onSuccess { - setState { state.value.copy(reviewDetail = it) } - } + fetchReviewDetailsUseCase(state.value.reviewId) + .onSuccess { setState { state.value.copy(reviewDetail = it /*, isLoading = false*/) } } + .onFailure { /* setState { state.value.copy(error = it, isLoading = false) } */ } } }feature/review/src/main/java/team/retum/review/ui/component/ReviewItems.kt (2)
45-49: ์ค์ฒฉ ์ปดํฌ์ ๋ธ์ ์ธ๋ถ modifier ์ฌ์ฌ์ฉ ์ง์๋ด๋ถ Row์์๋ Modifier๋ฅผ ์๋ก ์์ํ๋ ํธ์ด ์์ ํฉ๋๋ค(์์์น ๋ชปํ ์ ์ฝ/weight ์ ํ ๋ฐฉ์ง).
- Row( - modifier = modifier + Row( + modifier = Modifier .weight(1f) .clickable(onClick = { onReviewDetailClick(reviewId) }),
51-77: a11y ๋ฐ ํ ํฐ ์ฌ์ฉ ๊ฐ์ : contentDescription/์์
- AsyncImage์ contentDescription์ stringResource๋ก ์ง์ญํํ๊ฑฐ๋ ์ฅ์์ด๋ฉด null ์ฒ๋ฆฌ ๊ถ์ฅ.
 - ๋ณด์กฐ ํ ์คํธ ์์ onPrimary๋ณด๋ค onSurfaceVariant๊ฐ ํ ํฐ ์๋ฏธ์ ๋ง์ต๋๋ค.
 - contentDescription = "company profile", + contentDescription = null, // ๋๋ stringResource(R.string.cd_company_profile) ... - color = JobisTheme.colors.onPrimary, + color = JobisTheme.colors.onSurfaceVariant,feature/review/src/main/java/team/retum/review/viewmodel/SearchReviewsViewModel.kt (3)
33-42: ๊ฒ์ ๋๋ฐ์ด์ค ํ์ดํ๋ผ์ธ: flatMapLatest๋ก ์ด์  ์์ฒญ ์ทจ์ํ์ฌ๋ ๋งค ํค์๋๋ง๋ค ๋ณ๋ ์ฝ๋ฃจํด์ ๋์ ์ค๋ ๊ฑธ๋ฆฐ ์ด์  ์์ฒญ ๊ฒฐ๊ณผ๊ฐ ๋์ค์ ๋ฎ์ด์ธ ์ ์์ต๋๋ค. flatMapLatest ๊ธฐ๋ฐ์ผ๋ก ์ทจ์ ๊ฐ๋ฅ ํ์ดํ๋ผ์ธ์ผ๋ก ์ ํ์ ๊ถ์ฅํฉ๋๋ค. ๊ณต๋ฐฑ ํธ๋ฆฌ๋ฐ๋ ํฌํจํ์ต๋๋ค.
- @OptIn(FlowPreview::class) - private fun debounceName() { - viewModelScope.launch { - state.map { it.keyword }.distinctUntilChanged().debounce(SEARCH_DEBOUNCE_MILLIS).collect { - if (!it.isNullOrBlank()) { - fetchReviews() - } - } - } - } + @OptIn(FlowPreview::class, kotlinx.coroutines.ExperimentalCoroutinesApi::class) + private fun debounceName() { + viewModelScope.launch { + state + .map { it.keyword?.trim() } + .distinctUntilChanged() + .debounce(SEARCH_DEBOUNCE_MILLIS) + .flatMapLatest { kw -> + kotlinx.coroutines.flow.flow { + if (kw.isNullOrBlank()) { + // ๋น ํค์๋: ๊ฒฐ๊ณผ ์ด๊ธฐํ + setState { state.value.copy(reviews = emptyList(), showRecruitmentsEmptyContent = false) } + return@flow + } + val result = fetchReviewsUseCase( + companyId = null, page = null, location = null, + interviewType = null, keyword = kw, year = null, code = null + ) + emit(result) + } + } + .collect { res -> + res.onSuccess { + setState { + state.value.copy( + showRecruitmentsEmptyContent = it.reviews.isEmpty(), + reviews = it.reviews, + ) + } + } + // TODO: onFailure ์ฒ๋ฆฌ๋ ์ถ๊ฐ ๊ถ์ฅ + } + } + }
56-61: ๋น ํค์๋ ์ด๊ธฐํ ๋ฐ ์คํจ ์ฒ๋ฆฌ ์ถ๊ฐ ๊ถ์ฅํค์๋๊ฐ ๋น์์ก์ ๋ ๋ฆฌ์คํธ ์ด๊ธฐํ, ์คํจ ์ ์๋ฌ ์ํ ๋ฐ์์ด ํ์ํฉ๋๋ค. ์ flatMapLatest ์์์ ํฌํจํ์ต๋๋ค.
70-73: ๋ค์ด๋ฐ ์ ํฉ์ฑ: showRecruitmentsEmptyContent โ showReviewsEmptyContent๋ฆฌ๋ทฐ ๊ฒ์ ํ๋ฉด์ด๋ผ๋ฉด ํ๋กํผํฐ๋ช ์ ๋ฆฌ๋ทฐ ๋งฅ๋ฝ์ผ๋ก ๋ง์ถ๋ ๊ฒ์ด ๊ฐ๋ ์ฑ์ ์ข์ต๋๋ค. ์ ํ ์ํฅ์ด ํฌ๋ ํ์ PR์์ ์ ์ง ์ ์ฉ์ ๊ถ์ฅํฉ๋๋ค.
feature/review/src/main/java/team/retum/review/ui/ReviewDetailsScreen.kt (3)
172-189: ํญ๋ชฉ ๋ ๋๋ง์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
forEachIndexed๋ฅผ ์ฌ์ฉํ ํญ๋ชฉ ๋ ๋๋ง์ด ์๋ํ์ง๋ง, Compose์์๋Row์items.joinToString()์ ์ฌ์ฉํ๊ฑฐ๋items.flatMapIndexed๋ก ๊ตฌ๋ถ์๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ์์ด ๋ ์ ์ธ์ ์ ๋๋ค.๋ค์๊ณผ ๊ฐ์ด ๋ฆฌํฉํ ๋งํ ์ ์์ต๋๋ค:
Row( modifier = Modifier .fillMaxWidth() .padding(top = 10.dp), horizontalArrangement = Arrangement.spacedBy(8.dp), ) { items.forEachIndexed { index, item -> JobisText( text = item, style = JobisTypography.SubBody, color = JobisTheme.colors.inverseOnSurface, ) if (index < items.size - 1) { JobisText( text = "โข", style = JobisTypography.SubBody, color = JobisTheme.colors.inverseOnSurface, ) } } }ํ์ฌ ์ฝ๋๋ ์ ์ ์๋ํ๋ฏ๋ก ํ์๋ ์๋๋๋ค.
266-349: ๋ฆฌ์คํธ ๋ ๋๋ง์ ์์ ์ ์ธ ํค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
forEachIndexed๋ก ๋ฆฌ์คํธ๋ฅผ ๋ ๋๋งํ ๋ ๊ฐ ํญ๋ชฉ์ ๊ณ ์ ์๋ณ์๋ฅผ ํค๋ก ์ฌ์ฉํ์ง ์๊ณ ์์ต๋๋ค. ๋ฆฌ์คํธ๊ฐ ๋์ ์ผ๋ก ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ์ํ ๋ณด์กด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๊ฐ๋ฅํ๋ค๋ฉดLazyColumn๊ณผitems()ํจ์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, ๊ฐ ํญ๋ชฉ์keyํ๋ผ๋ฏธํฐ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
FetchReviewDetailEntity.QnAs์ ๊ณ ์ ID๊ฐ ์๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค:// LazyColumn ์ฌ์ฉ ์์ LazyColumn { items( items = review, key = { it.id } // ๊ณ ์ ID๊ฐ ์๋ค๊ณ ๊ฐ์  ) { reviewItem -> // ์นด๋ ๋ ๋๋ง ๋ก์ง } }
60-64: ViewModel์์ ID๋ฅผ Long ํ์ ์ผ๋ก ์ฒ๋ฆฌํ๋๋ก ๋ฆฌํฉํฐ๋งํ์ธ์.๊ฒ์ฆ ๊ฒฐ๊ณผ,
ReviewDetailsViewModel.setReviewId()๋ String์ ๊ธฐ๋ํ์ง๋ง,ReviewDetailsํจ์์reviewId๋งค๊ฐ๋ณ์๋ Long์ ๋๋ค. ์ด๋ก ์ธํด 62๋ฒ์งธ ์ค์์ ๋ถํ์ํtoString()๋ณํ์ด ๋ฐ์ํฉ๋๋ค.ID๋ ๋ณธ์ง์ ์ผ๋ก Long ํ์ ์ด๋ฏ๋ก, ViewModel์ ์ํ ๊ด๋ฆฌ๋ String ๋์ Long์ ์ฌ์ฉํ๋๋ก ์์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํ์ ์์ ์ฑ์ด ๊ฐ์ ๋๊ณ , ๋ถํ์ํ ๋ฌธ์์ด ๋ณํ์ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
๋ณ๊ฒฝ ์ฌํญ:
ReviewDetailsViewModel.setReviewId()๋ฉ์๋์ ๋งค๊ฐ๋ณ์๋ฅผString์์Long์ผ๋ก ๋ณ๊ฒฝ- ์ํ์
 reviewIdํ๋๋ Long ํ์ ์ผ๋ก ๋ณ๊ฒฝReviewDetailsScreen.kt62๋ฒ์งธ ์ค์์reviewId.toString()์ ๊ฑฐfeature/home/src/main/java/team/retum/home/ui/HomeScreen.kt (1)
204-204: TODO ํญ๋ชฉ์ด ์ถ๊ฐ๋์์ต๋๋ค.์ง์ ํ ํ ํ๋ฉด ์ง์ ์ UI ์ฆ์ ๋ฐ์๊ณผ ๊ด๋ จ๋ TODO ํญ๋ชฉ์ ๋๋ค. ์ด ๊ธฐ๋ฅ ๊ตฌํ์ด ํ์ํ์ง ํ์ธํด ์ฃผ์ธ์.
์ด TODO ํญ๋ชฉ ํด๊ฒฐ์ ์ํ ์ด์ ์์ฑ์ด๋ ๊ตฌํ์ ๋์๋๋ฆด ์ ์์ต๋๋ค. ํ์ํ์ ๊ฐ์?
core/domain/src/main/java/team/retum/usecase/entity/QuestionsEntity.kt (2)
16-16: TODO ์ฃผ์ ์ฒ๋ฆฌ ํ์์ด๋ฆ ํต์ผ์ ๋ํ TODO๊ฐ ๋จ์์์ต๋๋ค. ๋ค์ด๋ฐ ์ผ๊ด์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ฑฐ๋, ๋ค๋ฅธ ์ด์๋ก ์ถ์ ์ด ํ์ํ๋ค๋ฉด ์ด์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ด์ ์์ฑ์ ์ํ์๋ฉด ๋์์ ๋๋ฆด ์ ์์ต๋๋ค.
6-14:@Immutable์ด๋ ธํ ์ด์  ์ผ๊ด์ฑ ๊ฐ์ ๊ถ์ฅ์ค์ฒฉ๋
QuestionEntity์๋ง@Immutable์ด๋ ธํ ์ด์ ์ด ์ ์ฉ๋์ด ์์ต๋๋ค. ๋ถ๋ชจ ํด๋์คQuestionsEntity๋ ๋ถ๋ณ ๊ฐ์ฒด์ด๋ฏ๋ก ์ผ๊ด์ฑ์ ์ํด ๋์ผํ ์ด๋ ธํ ์ด์ ์ ์ถ๊ฐํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.๋ค์ diff๋ฅผ ์ ์ฉํ์ฌ ์ผ๊ด์ฑ์ ๊ฐ์ ํ์ธ์:
+@Immutable data class QuestionsEntity( val questions: List<QuestionEntity>, ) {core/domain/src/main/java/team/retum/usecase/usecase/review/FetchReviewsUseCase.kt (1)
12-14: ๋ค์์ nullable ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์ดํฐ ํด๋์ค๋ก ๋ฆฌํฉํ ๋ง ๊ถ์ฅ7๊ฐ์ nullable ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ง ํจ์๋ ์ ์ง๋ณด์๊ฐ ์ด๋ ต๊ณ ํธ์ถ ์ ์ค์ํ๊ธฐ ์ฝ์ต๋๋ค. ํํฐ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฌถ๋ ๋ฐ์ดํฐ ํด๋์ค(์:
ReviewFilters)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.๋ค์๊ณผ ๊ฐ์ด ๋ฆฌํฉํ ๋ง์ ๊ณ ๋ คํด๋ณด์ธ์:
data class ReviewFilters( val page: Int? = null, val location: InterviewLocation? = null, val interviewType: InterviewType? = null, val keyword: String? = null, val year: Int? = null, val companyId: Long? = null, val code: Long? = null, ) class FetchReviewsUseCase @Inject constructor( private val reviewRepository: ReviewRepository, ) { suspend operator fun invoke(filters: ReviewFilters = ReviewFilters()) = runCatching { reviewRepository.fetchReviews( filters.page, filters.location, filters.interviewType, filters.keyword, filters.year, filters.companyId, filters.code ).toEntity() } }feature/review/src/main/java/team/retum/review/ui/ReviewScreen.kt (2)
77-89: ๋ฆฌ์คํธ ํค ์ง์  ๋ฐ ๋ฆฌ์คํธ ๊ธฐ๋ฐ items ์ฌ์ฉ ๊ถ์ฅ์ธ๋ฑ์ค ๊ธฐ๋ฐ
items(size)๋ ํญ๋ชฉ ๋ณ๊ฒฝ ์ ์ํ ์ฌ์ฌ์ฉ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ต๋๋ค.reviewId๋ก key๋ฅผ ์ง์ ํ๊ณ ๋ฆฌ์คํธ ๊ธฐ๋ฐ DSL์ ์ฐ์ธ์.- LazyColumn { - items(state.reviews.size) { - val review = state.reviews[it] - ReviewItems( - companyImageUrl = review.companyLogoUrl, - companyName = review.companyName, - reviewId = review.reviewId, - writer = review.writer, - major = review.major, - onReviewDetailClick = onReviewDetailClick, - ) - } - } + LazyColumn { + items( + items = state.reviews, + key = { it.reviewId }, + ) { review -> + ReviewItems( + companyImageUrl = review.companyLogoUrl, + companyName = review.companyName, + reviewId = review.reviewId, + writer = review.writer, + major = review.major, + onReviewDetailClick = onReviewDetailClick, + ) + } + }ํ์ ์ import ์ถ๊ฐ:
import androidx.compose.foundation.lazy.items
65-75: a11y/i18n: contentDescription ๋ฆฌ์์คํ ๊ถ์ฅ"filter", "search" ํ๋์ฝ๋ฉ ๋์ string ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํด ์ ๊ทผ์ฑ๊ณผ ํ์งํ๋ฅผ ๋ณด์ํ์ธ์.
- JobisIconButton( - drawableResId = JobisIcon.Filter, - contentDescription = "filter", + JobisIconButton( + drawableResId = JobisIcon.Filter, + contentDescription = stringResource(R.string.cd_filter), onClick = onReviewFilterClick, tint = JobisTheme.colors.onPrimary, ) - JobisIconButton( - drawableResId = JobisIcon.Search, - contentDescription = "search", + JobisIconButton( + drawableResId = JobisIcon.Search, + contentDescription = stringResource(R.string.cd_search), onClick = onSearchReviewClick, )(๋ฆฌ์์ค๊ฐ ์๋ค๋ฉด ์ถ๊ฐ ํ์)
feature/review/src/main/java/team/retum/review/ui/SearchReviewScreen.kt (2)
52-65: ๋ฆฌ์คํธ๋ items(list, key) ์ฌ์ฉ์ผ๋ก ์์  ํค ์ ๊ณต ๋ฐ ๊ฐ๊ฒฐํ ๊ถ์ฅํ์ฌ index ๊ธฐ๋ฐ items(size) ์ฌ์ฉ์ ์คํฌ๋กค/์ ๋๋ฉ์ด์  ์ ์ฌ์กฐํฉ ๋น์ฉ์ด ์ปค์ง๋๋ค. reviewId๋ฅผ key๋ก ์ฌ์ฉํ์ธ์.
์ ์ฉ ์์:
@@ - if (!state.showRecruitmentsEmptyContent) { - LazyColumn { - items(state.reviews.size) { - val review = state.reviews[it] - ReviewItems( - companyImageUrl = review.companyLogoUrl, - companyName = review.companyName, - reviewId = review.reviewId, - writer = review.writer, - major = review.major, - onReviewDetailClick = onReviewDetailClick, - ) - } - } + if (!state.showRecruitmentsEmptyContent) { + LazyColumn { + items( + items = state.reviews, + key = { it.reviewId }, + ) { review -> + ReviewItems( + companyImageUrl = review.companyLogoUrl, + companyName = review.companyName, + reviewId = review.reviewId, + writer = review.writer, + major = review.major, + onReviewDetailClick = onReviewDetailClick, + ) + } + }์ถ๊ฐ: ์๋ import ํ์
import androidx.compose.foundation.lazy.items
52-52: ํ๋กํผํฐ ๋ค์ด๋ฐ ๋ถ์ผ์น
showRecruitmentsEmptyContent๋ ๋ฆฌ๋ทฐ ํ๋ฉด ๋งฅ๋ฝ๊ณผ ๋ง์ง ์์ต๋๋ค.showReviewsEmptyContent๋ฑ ์๋ฏธ ๋ง๋ ์ด๋ฆ์ผ๋ก ์ ๋ฆฌํ๋ฉด ๊ฐ๋ ์ฑ์ด ์ข์์ง๋๋ค.core/domain/src/main/java/team/retum/usecase/entity/FetchReviewsEntity.kt (1)
10-18: @immutable๋ฅผ ์์ ์ํฐํฐ์๋ ๋ถ์ฌ ๊ณ ๋ คUI์์ ์ด ์ํฐํฐ๋ฅผ ์ง์  ์๋นํ๋ค๋ฉด,
FetchReviewsEntity์๋@Immutable์ ๋ถ์ฌํ๋ฉด Compose ์ต์ ํ์ ๋์๋ฉ๋๋ค. ํ์ฌ ๋ด๋ถReview์๋ง ์ง์ ๋์ด ์์ด ์ผ๊ด์ฑ์ด ๋จ์ด์ง๋๋ค.feature/review/src/main/java/team/retum/review/viewmodel/ReviewFilterViewModel.kt (2)
22-27: Companion object์ ์ ํ๊ฐ ์ ์ฅ์ ์ ์ญ ์ฌ์ด๋์ดํํธ์ ์ญ
var(code/year/interviewType/location)๋ ํ๋ก์ธ์ค ์๋ช ์ฃผ๊ธฐ/๋ณต์ ์ ์๊ธฐ์น ์์ ์ํ ๋์๋ฅผ ์ ๋ฐํฉ๋๋ค.SavedStateHandle, ๊ณต์ ViewModel, ๋๋ ๋จ์ผAppliedFilters์ํ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ์ ํ์ ๊ถ์ฅํฉ๋๋ค.
33-47: ์๋ฌ ํธ๋ค๋ง/๋น ์ํ ์ฒ๋ฆฌ ์ถ๊ฐ ๊ถ์ฅ
fetchCodeUseCase์คํจ ์ ์ฌ์ฉ์ ํผ๋๋ฐฑ/๋ฆฌํธ๋ผ์ด๊ฐ ์์ต๋๋ค..onFailure์ฒ๋ฆฌ ๋ฐ ๋ก๋ฉ/์๋ฌ ์ํ ๋ฐ์์ ๊ณ ๋ คํด ์ฃผ์ธ์.core/domain/src/main/java/team/retum/usecase/entity/MyReviews.kt (1)
3-13: Immutable ์ด๋ ธํ ์ด์  ์ผ๊ด์ฑ์ด ํ์ผ์
javax.annotation.concurrent.Immutable, ๋ค๋ฅธ ํ์ผ์androidx.compose.runtime.Immutable๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ชจ๋ ์ ๋ฐ ์ผ๊ด๋ ์ด๋ ธํ ์ด์ (๊ฐ๋ฅํ๋ฉด Compose์@Immutable) ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค.feature/review/src/main/java/team/retum/review/ui/ReviewFilterScreen.kt (3)
81-83: ํ๋์ฝ๋ฉ ๋ฌธ์์ด -> stringResource๋ก i18n ์ ๋ฆฌ์ฌ๋ฌ UI ํ ์คํธ๊ฐ ํ๋์ฝ๋ฉ๋์ด ์์ต๋๋ค. ๋ค๊ตญ์ด/์ ๊ทผ์ฑ/์ผ๊ด์ฑ ์ํด
stringResource๋ก ์ด์ ํ์ธ์.์์(ํจํด ๋์ผ ์ ์ฉ):
- title = "ํํฐ ์ค์ ", + title = stringResource(R.string.review_filter_title), @@ - text = "์ ๊ณต", + text = stringResource(R.string.major), @@ - title = "๊ฐ์ธ ๋ฉด์ ", + title = stringResource(R.string.interview_type_individual),ํ์ํ ํค๋ฅผ
strings.xml์ ์ถ๊ฐํด ์ฃผ์ธ์.Also applies to: 133-136, 167-170, 198-201, 230-233, 203-216, 235-253
106-118: ํ๋จ ๊ณ ์  ๋ฒํผ ์์คํ  ์ธ์ /์ค๋ฒ๋ฉ ์ฒ๋ฆฌ์คํฌ๋กค ์ฝํ ์ธ ์ ๋ฒํผ์ด ๊ฒน์น ์ ์์ต๋๋ค.
navigationBarsPadding()๊ณผ ์ฌ๋ฐฑ์ ์ฃผ๊ณ , ์คํฌ๋กค ์์ญ ํ๋จ์ Spacer๋ฅผ ๋ฃ์ด ๊ฐ๋ ค์ง์ ๋ฐฉ์งํ์ธ์.- JobisButton( + JobisButton( text = stringResource(id = R.string.appliance), onClick = { @@ - modifier = Modifier.align(Alignment.BottomCenter), + modifier = Modifier + .align(Alignment.BottomCenter) + .navigationBarsPadding() + .padding(bottom = 16.dp), color = ButtonColor.Primary, )์คํฌ๋กค ์์ญ ๋์ ์ฌ์ ๊ณต๊ฐ๋ ์ถ๊ฐ:
// ReviewFilterScreen ๋ด๋ถ Column ๋งจ ์๋ Spacer(modifier = Modifier.height(96.dp))
109-113: UI์์ ViewModel.Companion์ ์ง์  ์ฐ๊ธฐ ์ง์UI๊ฐ
ReviewFilterViewModel.Companion.*์ ์ง์  ์ ๊ทผํด ์ธ๋ถ ์ํ๋ฅผ ์์ ํฉ๋๋ค. ์ ์ฉ ๋ก์ง์ ViewModel ๋ฉ์๋(์:applyAndClose(onBackPressed))๋ก ์บก์ํํ์ธ์. ํ ์คํธ ์ฉ์ด์ฑ๊ณผ ์ถ์ ์ฑ์ด ์ข์์ง๋๋ค.๊ฐ๋จ ์์:
// ViewModel fun apply(onApplied: () -> Unit) = setState { // ํ์ ์ ์์ํ/์ ์ฅ ํ state.value // no-op; ํน์ ์ ์ฅ ๋ก์ง }.also { onApplied() } // UI onClick = { reviewFilterViewModel.apply(onBackPressed) }feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostNextReviewViewModel.kt (2)
67-73: ์ด๊ธฐ answers ๊ธธ์ด ํ๋์ฝ๋ฉ(3) ์ ๊ฑฐ ๊ถ์ฅ์ง๋ฌธ ์์ ๋ฌด๊ดํ๊ฒ 3๊ฐ๋ก ๊ณ ์ ๋์ด ์์ด ์ดํ ๋จ๊ณ์์ ๋ถ์ผ์น๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๊ธฐ๊ฐ์ ๋น ๋ฆฌ์คํธ๋ก ๋๊ณ , fetch ์ฑ๊ณต ์ ์ง๋ฌธ ์์ ๋ง์ถฐ ๋๊ธฐํํ์ธ์.
fun getInitialState() = PostNextReviewState( questions = emptyList(), buttonEnabled = false, answer = "", - answers = listOf("", "", ""), + answers = emptyList(), qnaElements = emptyList(), )
59-65: PostNextReviewState์์ unused ํ๋ answer ์ ๊ฑฐ ํ์๊ฒ์ฆ ๊ฒฐ๊ณผ,
PostNextReviewState.answerํ๋๋PostNextReviewViewModel์ ์ด๋ ๋ฉ์๋์์๋ ์ฌ์ฉ๋์ง ์์ต๋๋ค. ์ด๊ธฐํ๋ง ๋๊ณ (line 70) ์ฝ๊ฑฐ๋ ์์ ๋์ง ์์ผ๋ฏ๋ก ์ ๊ฑฐํ์ธ์.๊ด๋ จ ์ฝ๋:
fetchQuestions(),setQuestion(),onNextClick()๋ชจ๋answerํ๋ ๋ฏธ์ฌ์ฉ- ๋์
 answers: List<String>ํ๋๊ฐ ์ค์  ๋ต๋ณ ๊ด๋ฆฌ์ ์ฌ์ฉ๋จfeature/review/src/main/java/team/retum/review/navigation/ReviewNavigation.kt (1)
26-28: ์ค๋ณต ๋ด๋น๊ฒ์ด์  ๋ฐฉ์ง ์ต์  ์ถ๊ฐํญ ์ฌ์ ํ ๋ฑ์์ ๋์ผ ๋ชฉ์ ์ง ์ค๋ณต ์์์ ๋ฐฉ์งํ๋ ค๋ฉด launchSingleTop(๋ฐ ํ์ ์ restoreState)์ ์ฌ์ฉํ๋ ๊ฒ์ด ์์ ํฉ๋๋ค.
-fun NavController.navigateToReview() { - navigate(NAVIGATION_REVIEW) -} +fun NavController.navigateToReview() { + navigate(NAVIGATION_REVIEW) { + launchSingleTop = true + restoreState = true + } +}feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewCompleteScreen.kt (1)
62-66: contentDescription ํ๋์ฝ๋ฉi18n/์ ๊ทผ์ฑ ์ผ๊ด์ฑ์ ์ํด stringResource๋ก ๊ด๋ฆฌํด์ฃผ์ธ์.
- Image( - painter = painterResource(team.retum.design_system.R.drawable.ic_success), - contentDescription = "review_make_success", - ) + Image( + painter = painterResource(team.retum.design_system.R.drawable.ic_success), + contentDescription = stringResource(R.string.content_description_review_make_success), + )core/network/src/main/java/team/retum/network/api/ReviewApi.kt (1)
36-38: ID ํ์ ์ผ๊ด์ฑ
reviewId: String์ ๋ค๋ฅธ API์์ Long์ ์ฃผ๋ก ์ฐ๋ ํจํด๊ณผ ์์ดํ ์ ์์ต๋๋ค. ์๋ฒ ์คํค๋ง์ ๋ง๋ค๋ฉด ์ ์ง, ์๋๋ผ๋ฉด Long์ผ๋ก ํต์ผ์ ๊ฒํ ํด์ฃผ์ธ์.core/data/src/main/java/team/retum/data/repository/review/ReviewRepositoryImpl.kt (1)
20-37: ํ๋ผ๋ฏธํฐ ํจ์ค์ค๋ฃจ LGTM๋ฐ์ดํฐ์์ค์ ๋ค์ด๋ฐ ์๊ท๋จผํธ๋ก ์ ํํ ์์๋๊ณ ์์ต๋๋ค. ์ ์ง๋ณด์์ฑ์ ์ํด ๋๋ฉ์ธ/๋คํธ์ํฌ ๊ณ์ธต๊ณผ ํ๋ผ๋ฏธํฐ ์์๋ฅผ ๋ง์ถ๋ฉด ๊ฐ๋ ์ฑ์ด ์กฐ๊ธ ๋ ์ข์์ง๋๋ค.
feature/post-review/src/main/java/team/retum/post/review/model/PostReviewData.kt (2)
30-38: URL ์ธ์ฝ๋ฉ์์ ๋ฌธ์์  ์์ ์ฌ์ฉ๋ฌธ์์ด ๋ฆฌํฐ๋ด ๋์ ํ์ค ์์๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ํฉ๋๋ค.
+import java.nio.charset.StandardCharsets @@ - return URLEncoder.encode(json, "UTF-8") + return URLEncoder.encode(json, StandardCharsets.UTF_8.toString()) @@ - val decoded = URLDecoder.decode(this, "UTF-8") + val decoded = URLDecoder.decode(this, StandardCharsets.UTF_8.toString())๋ํ Json ์ค์ ์ ํ๋๋ก ํต์ผ(encodeDefaults/ignoreUnknownKeys ๋ฑ)ํ๋ฉด ๋ฒ์  ๋ณ๊ฒฝ ์ ์์ ์ ์ ๋๋ค. ์)
private val json = Json { encodeDefaults = true }.
19-27: ๋ค์ด๋ฐ ์ผ๊ด์ฑ(qnaElements vs qnas)๋คํธ์ํฌ ๋ชจ๋ธ์
qnas, UI ๋ชจ๋ธ์qnaElements๋ก ํผ์ฌ๋์ด ํผ๋์ ์ ๋ฐํฉ๋๋ค. ํ์ชฝ์ผ๋ก ๋ง์ถ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewScreen.kt (3)
576-582: onValueChange ์๊ทธ๋์ฒ ํธํ์ฑ ํ์ธ
setKeyword๊ฐ(String?) -> Unit,onValueChange๋(String) -> Unit์ ๋๋ค. ๋ฉ์๋ ๋ ํผ๋ฐ์ค๊ฐ ํ์ ์ถ๋ก ์ ์คํจํ ์ ์์ด ๋๋ค๋ก ๊ฐ์ธ๋ ํธ์ด ์์ ํฉ๋๋ค.- onValueChange = setKeyword, + onValueChange = { setKeyword(it) },
362-373: ํ๋์ฝ๋ฉ๋ ํ ์คํธ i18n ์ฒ๋ฆฌ"๋ต๋ณ"๊ณผ ๊ฐ์ ๋ฌธ์์ด์ string ๋ฆฌ์์ค๋ก ๋ถ๋ฆฌํ์ธ์. ์ ๊ทผ์ฑ ๋ฒ์ญ/์ผ๊ด์ฑ์ ์ ๋ฆฌํฉ๋๋ค.
- JobisText( - text = "๋ต๋ณ", + JobisText( + text = stringResource(id = R.string.answer),Also applies to: 466-477, 691-702
169-191: ๋ฆฌ์คํธ ๋ ๋๋ง: items(size) ๋์ items(data) + key ๊ถ์ฅ์ฑ๋ฅ/์ฌ๊ตฌ์ฑ ์์ ์ฑ์ ์ํด key๋ฅผ ์ ๊ณตํ์ธ์.
- if (state.myReview.isNotEmpty()) { - items(state.myReview.size) { - val myReview = state.myReview[it] + if (state.myReview.isNotEmpty()) { + items( + items = state.myReview, + key = { it.id } // ๊ฐ์ฉํ ๊ณ ์ ํค๊ฐ ์๋ค๋ฉด + ) { myReview ->feature/post-review/src/main/java/team/retum/post/review/ui/PostNextReviewScreen.kt (2)
151-158: answers ์ธ๋ฑ์ฑ ์์ ํ ๋ฐ VM ์์
answers[page]์ง์  ์ธ๋ฑ์ฑ์ ํฌ๋์ ์ํ์ด ์์ต๋๋ค. ์์  ์ ๊ทผ์ ์ฐ๊ฑฐ๋(๊ถ์ฅ), TODO๋๋ก VM๋ก ์ํ๋ฅผ ์ฎ๊ธฐ์ธ์.์์  ์ ๊ทผ ์์:
- value = { answers[page] }, // TODO :: viewModel๋ก ๋ก์ง ์ด๋ + value = { answers.getOrElse(page) { "" } }, // TODO :: viewModel๋ก ๋ก์ง ์ด๋ onValueChange = { // TODO :: '' - answers[page] = it + if (page < answers.size) { + answers[page] = it + } },
131-134: ๋ฌธ์์ด ํ๋์ฝ๋ฉ(i18n) ์ ๊ฑฐ ์ ์"Q. ", "๋ค์"์ stringResource๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ฆฌ์์ค๊ฐ ์์ผ๋ฉด ์ถ๊ฐํด์ฃผ์ธ์.
์์:
- text = "Q. " + questions[page].question, + text = stringResource(R.string.prefix_question) + " " + questions[page].question, ... - text = "๋ค์", + text = stringResource(R.string.next),Also applies to: 161-163
core/domain/src/main/java/team/retum/usecase/entity/FetchReviewDetailEntity.kt (1)
16-24: ์ค๋ณต/๋ชจํธํ ํ๋ ๋ค์ด๋ฐ(question/answer)์ต์์
question/answer์qnaResponse[].question/answer๊ฐ ๊ณต์กดํด ์๋ฏธ๊ฐ ๋ชจํธํฉ๋๋ค. ๋๋ฉ์ธ ์ฉ์ด๋ฅผ ๋ฐ์ํด ์ด๋ฆ์ ๊ตฌ์ฒดํ(์:overallQuestion,overallAnswer)ํ๊ฑฐ๋ KDoc์ผ๋ก ์๋ฏธ๋ฅผ ๋ช ํํ ํด์ฃผ์ธ์.Also applies to: 41-45
feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostReviewViewModel.kt (3)
69-92: postReview ์คํจ ์ฒ๋ฆฌ ๋ฒ์ ํ์ฅ ์ ์
BadRequestException์ธ ์์ธ๋ ๋ฌด์๋ฉ๋๋ค. ๋คํธ์ํฌ/์๋ฒ ์ค๋ฅ ๋ฑ ๊ณตํต ์๋ฌ๋ฅผ ๊ตฌ๋ถ ์ฒ๋ฆฌํ๊ฑฐ๋ ๋ก๊น ์ด ํ์ํฉ๋๋ค.๊ฐ๋จ ์์:
.onFailure { when (it) { is BadRequestException -> postSideEffect(PostReviewSideEffect.BadRequest) else -> postSideEffect(PostReviewSideEffect.BadRequest) // ํน์ ๋ณ๋ SideEffect ์ถ๊ฐ } }
94-103: ์ฃผ์ ์ฒ๋ฆฌ๋ dead code ์ ๊ฑฐ์ฌ์ฉํ์ง ์๋
addReview๋ธ๋ก์ ์ ๊ฑฐํด ์ฃผ์ธ์. ํ์คํ ๋ฆฌ๋ Git์ด ๋ณด์กดํฉ๋๋ค.
220-238: ์ ํํ ํ๋์ ์ด๊ธฐ๊ฐ ํํ ๊ฐ์ ์ ์
interviewLocation์ด ๊ธฐ๋ณธ๊ฐDAEJEON์ผ๋ก ์์ํ๋ฉด โ๋ฏธ์ ํโ ํํ์ด ์ด๋ ต์ต๋๋ค.InterviewLocation? = null๋ก ๋ฐ๊พธ๊ณ UI์์ ๋ช ์์  ์ ํ์ ์ ๋ํ๋ ๋ฐฉ์์ ๊ณ ๋ คํด ์ฃผ์ธ์.feature/review/src/main/java/team/retum/review/navigation/ReviewDetailsNavigation.kt (1)
22-27: ์ ํจํ์ง ์์ reviewId ๊ฐ๋ ์ถ๊ฐ ๊ถ์ฅnullable ์
0์ผ๋ก ์งํํ๋ฉด ์๋ชป๋ ์์ธ ์ง์ ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ๊ฐ๋ ํ ๋ค๋ก๊ฐ๊ธฐ ์ฒ๋ฆฌ๋ก ์์ ํํ์ธ์.- val reviewId = it.arguments?.getLong(ResourceKeys.REVIEW_ID) ?: 0 + val reviewId = it.arguments?.getLong(ResourceKeys.REVIEW_ID) ?: run { + onBackPressed() + return@composable + }app/src/main/java/team/retum/jobisandroidv2/root/RootNavigation.kt (2)
27-31: ์ฝ๋ฐฑ ์๊ทธ๋์ฒ ๋ช ํ์ฑ
onPostReviewClick: (String, Long)ํ๋ผ๋ฏธํฐ ์๋ฏธ๊ฐ ๋ถ๋ถ๋ช ํฉ๋๋ค(์: companyName, companyId?). ์ถํ ์ ์ง๋ณด์๋ฅผ ์ํด ํ์ alias ๋๋ data class๋ก ๋ช ์ํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.Also applies to: 54-58
35-41: ๋ผ์ฐํธ ํจํด ๋ณ๊ฒฝ ์ 3๊ฐ ์์น ๋๊ธฐํ ํ์ํ์ฌ ๋ผ์ฐํธ ํจํด
"root{applicationId}"๋ ์๋ํ์ง๋ง ๊ตฌ๋ถ์ ์์ด ๋งค๊ฐ๋ณ์๋ฅผ ๋ถ์ด๋ฏ๋ก ๊ฐ๋ ์ฑ์ด ๋ฎ์ต๋๋ค. ์ ์๋ ๋๋ก"root/{applicationId}"๋ก ๊ฐ์ ํ ๊ฒฝ์ฐ ๋ค์ 3๊ฐ ์์น๋ฅผ ๋์์ ์์ ํด์ผ ํฉ๋๋ค:
- RootNavigation.kt 36์ค:
 route = "$NAVIGATION_ROOT/{$APPLICATION_ID}"- RootNavigation.kt 66์ค:
 navigate("$NAVIGATION_ROOT/$applicationId")- JobisNavigator.kt 235์ค:
 navController.currentDestination?.route == "$NAVIGATION_ROOT/{$APPLICATION_ID}"๋ชจ๋ ํจ๊ป ์์ ํ์ง ์์ผ๋ฉด ๋ผ์ฐํธ ๋งค์นญ์ด ์คํจํฉ๋๋ค.
core/data/src/main/java/team/retum/data/repository/review/ReviewRepository.kt (2)
15-23: ์ต์ ๋ ํ๋ผ๋ฏธํฐ ๊ธฐ๋ณธ๊ฐ ์ ๊ณต์ผ๋ก ํธ์ถ๋ถ ๊ฐ์ํ๋ค์๊ฐ nullable์ธ ๋งํผ ๊ธฐ๋ณธ๊ฐ์
= null๋ก ์ ๊ณตํ๋ฉด ํธ์ถ๋ถ ๊ฐ๋ ์ฑ์ด ์ข์์ง๋๋ค(ํนํ ํํฐ ์ผ๋ถ๋ง ์ ๋ฌ ์).- suspend fun fetchReviews( - page: Int?, - location: InterviewLocation?, - interviewType: InterviewType?, - keyword: String?, - year: Int?, - companyId: Long?, - code: Long?, - ): FetchReviewsResponse + suspend fun fetchReviews( + page: Int? = null, + location: InterviewLocation? = null, + interviewType: InterviewType? = null, + keyword: String? = null, + year: Int? = null, + companyId: Long? = null, + code: Long? = null, + ): FetchReviewsResponse
25-32: ๋ฆฌ๋ทฐ ID ํ์ ์ผ๊ดํ ์ ์๋ค๋น๊ฒ์ด์ /ํ๋ฉด์์
reviewId: Long๋ก ์ฌ์ฉ ์ค์ ๋๋ค.fetchReviewDetail(reviewId: String)๋ Long์ผ๋ก ํต์ผํ๋ฉด ๋ณํ ๋น์ฉ/์ค๋ฅ๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.- suspend fun fetchReviewDetail(reviewId: String): FetchReviewDetailResponse + suspend fun fetchReviewDetail(reviewId: Long): FetchReviewDetailResponse๋ํ
code๋ ์๋ฏธ๊ฐ ๋ชจํธํ๋jobCode๋ฑ ๋๋ฉ์ธ ๋ช ์๋ก ๊ต์ฒด๋ฅผ ๊ณ ๋ คํด ์ฃผ์ธ์.feature/post-review/src/main/java/team/retum/post/review/ui/PostExpectReviewScreen.kt (2)
92-97: ํ๋์ฝ๋ฉ ํ ์คํธ๋ฅผ stringResource๋ก ์ด์ ๊ตญ์ ํ/๋ฒ์ญ/ํ ์คํธ ํธ์์ฑ์ ์ํด ๋ฌธ์์ด ๋ฆฌ์์ค๋ก ์ด์ ํด ์ฃผ์ธ์.
์์:
- text = "๋ฐ์๋ ๋ฉด์  ์ง๋ฌธ์ ์ถ๊ฐํด์ฃผ์ธ์!", + text = stringResource(R.string.post_expect_title), @@ - text = "์ง๋ฌธ", + text = stringResource(R.string.question), @@ - hint = "๋ฐ์๋ ์ง๋ฌธ์ ์์ฑํด ์ฃผ์ธ์.", + hint = stringResource(R.string.post_expect_question_hint), @@ - hint = "์์ ์ง๋ฌธ ๋ต๋ณ์ ์ฑ์ฌ์ฑ์๊ป ์์ฑํด ์ฃผ์ธ์!", + hint = stringResource(R.string.post_expect_answer_hint), @@ - text = "๊ฑด๋๋ธ๋์.", + text = stringResource(R.string.skip), @@ - text = "์๋ฃ", + text = stringResource(R.string.complete),(๋ฆฌ์์ค ํค๋ ์์์ ๋๋ค.)
Also applies to: 101-110, 111-116, 120-129, 130-136, 138-147, 149-153
44-57: sideEffect ์์ง ํจํด ์ ๋ฆฌ(์ ํ)๋ ๊ฐ์
LaunchedEffect(Unit)๋ฅผ ํ๋๋ก ํฉ์น๊ฑฐ๋collectLatest/์๋ช ์ฃผ๊ธฐ ์ธ์ง ์์ง์ผ๋ก ์ผ์ํํ๋ฉด ๊ฐ๋ ์ฑ๊ณผ ์์ ์ฑ์ด ์ข์์ง๋๋ค.LaunchedEffect(Unit) { launch { postExpectReviewViewModel.sideEffect.collect { /* ... */ } } launch { postReviewViewModel.sideEffect.collect { /* ... */ } } }Also applies to: 59-65
app/src/main/java/team/retum/jobisandroidv2/JobisNavigator.kt (1)
213-218: ๋ถ์ฉ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๊ฑฐํ์ธ์๊ฒ์ฆ ๊ฒฐ๊ณผ,
JobisNavigator.navigateToReview(companyId, companyName)์ ๋งค๊ฐ๋ณ์๋ ์ ๋ง๋ก ์ฌ์ฉ๋์ง ์์ต๋๋ค. ๊ธฐ์  ํจ์NavController.navigateToReview()๋ ์ธ์๋ฅผ ๋ฐ์ง ์์ผ๋ฉฐ, ๋ํผ ํจ์๋ ์ด ๋งค๊ฐ๋ณ์๋ค์ ์ ๋ฌํ์ง ์์ต๋๋ค.ํธ์ถ ์ฌ์ดํธ์์ 2๊ฐ ์ธ์๋ฅผ ์ ๋ฌํ๋ ํจํด๋ ๋ฐ๊ฒฌ๋์ง ์์์ผ๋ฏ๋ก, **์ต์  A(ํ๋ผ๋ฏธํฐ ์ญ์ )**๋ฅผ ์งํํ๋ฉด ๋ฉ๋๋ค.
- fun navigateToReview( - companyId: Long, - companyName: String, - ) { - navController.navigateToReview() - } + fun navigateToReview() { + navController.navigateToReview() + }
๐ Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
โ Files ignored due to path filters (1)
feature/bookmark/src/main/res/drawable/ic_empty_bookmark.pngis excluded by!**/*.png
๐ Files selected for processing (88)
app/build.gradle.kts(1 hunks)app/src/main/java/team/retum/jobisandroidv2/JobisNavigator.kt(3 hunks)app/src/main/java/team/retum/jobisandroidv2/navigation/MainNavigation.kt(3 hunks)app/src/main/java/team/retum/jobisandroidv2/root/RootNavigation.kt(2 hunks)app/src/main/java/team/retum/jobisandroidv2/root/RootScreen.kt(5 hunks)app/src/main/java/team/retum/jobisandroidv2/ui/BottomMenu.kt(2 hunks)app/src/main/java/team/retum/jobisandroidv2/ui/BottomNavigationBar.kt(1 hunks)app/src/main/res/drawable/ic_review.xml(1 hunks)app/src/main/res/values/strings.xml(1 hunks)build.gradle.kts(1 hunks)core/common/src/main/java/team/retum/common/enums/ApplyStatus.kt(1 hunks)core/common/src/main/java/team/retum/common/enums/InterviewLocation.kt(1 hunks)core/common/src/main/java/team/retum/common/enums/InterviewType.kt(1 hunks)core/common/src/main/java/team/retum/common/enums/ReviewProcess.kt(1 hunks)core/common/src/main/java/team/retum/common/utils/ResourceKeys.kt(1 hunks)core/data/src/main/java/team/retum/data/repository/review/ReviewRepository.kt(1 hunks)core/data/src/main/java/team/retum/data/repository/review/ReviewRepositoryImpl.kt(2 hunks)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/foundation/JobisColor.kt(1 hunks)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/foundation/JobisIcon.kt(1 hunks)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/review/ReviewContent.kt(1 hunks)core/design-system/src/main/res/drawable/ic_asterisk.xml(1 hunks)core/design-system/src/main/res/drawable/ic_success.xml(1 hunks)core/domain/src/main/java/team/retum/usecase/entity/FetchReviewDetailEntity.kt(1 hunks)core/domain/src/main/java/team/retum/usecase/entity/FetchReviewsEntity.kt(2 hunks)core/domain/src/main/java/team/retum/usecase/entity/MyReviews.kt(1 hunks)core/domain/src/main/java/team/retum/usecase/entity/PostReviewEntity.kt(1 hunks)core/domain/src/main/java/team/retum/usecase/entity/QuestionsEntity.kt(1 hunks)core/domain/src/main/java/team/retum/usecase/entity/ReviewsCountEntity.kt(1 hunks)core/domain/src/main/java/team/retum/usecase/usecase/review/FetchMyReviewUseCase.kt(1 hunks)core/domain/src/main/java/team/retum/usecase/usecase/review/FetchQuestionsUseCase.kt(1 hunks)core/domain/src/main/java/team/retum/usecase/usecase/review/FetchReviewsCountUseCase.kt(1 hunks)core/domain/src/main/java/team/retum/usecase/usecase/review/FetchReviewsUseCase.kt(1 hunks)core/network/src/main/java/team/retum/network/api/InterestsApi.kt(1 hunks)core/network/src/main/java/team/retum/network/api/ReviewApi.kt(2 hunks)core/network/src/main/java/team/retum/network/datasource/review/ReviewDataSource.kt(1 hunks)core/network/src/main/java/team/retum/network/datasource/review/ReviewDataSourceImpl.kt(2 hunks)core/network/src/main/java/team/retum/network/di/RequestUrls.kt(1 hunks)core/network/src/main/java/team/retum/network/model/request/PostReviewRequest.kt(1 hunks)core/network/src/main/java/team/retum/network/model/response/FetchMyReviewResponse.kt(1 hunks)core/network/src/main/java/team/retum/network/model/response/FetchQuestionsResponse.kt(1 hunks)core/network/src/main/java/team/retum/network/model/response/FetchReviewDetailResponse.kt(1 hunks)core/network/src/main/java/team/retum/network/model/response/FetchReviewsCountResponse.kt(1 hunks)core/network/src/main/java/team/retum/network/model/response/FetchReviewsResponse.kt(1 hunks)feature/bookmark/src/main/java/team/retum/bookmark/ui/BookmarkScreen.kt(1 hunks)feature/company/src/main/java/team/retum/company/navigation/CompanyDetailsNavigation.kt(1 hunks)feature/company/src/main/java/team/retum/company/ui/CompanyDetailsScreen.kt(3 hunks)feature/company/src/main/java/team/retum/company/viewmodel/CompanyDetailsViewModel.kt(1 hunks)feature/home/src/main/java/team/retum/home/ui/ApplyCompanyItem.kt(1 hunks)feature/home/src/main/java/team/retum/home/ui/HomeScreen.kt(1 hunks)feature/mypage/src/main/java/team/retum/jobis/navigation/MyPageNavigation.kt(1 hunks)feature/mypage/src/main/java/team/retum/jobis/ui/MyPageScreen.kt(3 hunks)feature/post-review/.gitignore(1 hunks)feature/post-review/build.gradle.kts(1 hunks)feature/post-review/src/main/java/team/retum/post/review/model/PostReviewData.kt(1 hunks)feature/post-review/src/main/java/team/retum/post/review/navigation/PostExpectReviewNavigation.kt(1 hunks)feature/post-review/src/main/java/team/retum/post/review/navigation/PostNextReviewNavigation.kt(1 hunks)feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewCompleteNavigation.kt(1 hunks)feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewNavigation.kt(1 hunks)feature/post-review/src/main/java/team/retum/post/review/ui/PostExpectReviewScreen.kt(1 hunks)feature/post-review/src/main/java/team/retum/post/review/ui/PostNextReviewScreen.kt(1 hunks)feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewCompleteScreen.kt(1 hunks)feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewScreen.kt(1 hunks)feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostExpectReviewViewModel.kt(1 hunks)feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostNextReviewViewModel.kt(1 hunks)feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostReviewViewModel.kt(1 hunks)feature/post-review/src/main/res/values/strings.xml(1 hunks)feature/review/build.gradle.kts(2 hunks)feature/review/src/main/java/team/retum/review/navigation/PostReviewNavigation.kt(0 hunks)feature/review/src/main/java/team/retum/review/navigation/ReviewDetailsNavigation.kt(1 hunks)feature/review/src/main/java/team/retum/review/navigation/ReviewFilterNavigation.kt(1 hunks)feature/review/src/main/java/team/retum/review/navigation/ReviewNavigation.kt(1 hunks)feature/review/src/main/java/team/retum/review/navigation/ReviewsNavigation.kt(0 hunks)feature/review/src/main/java/team/retum/review/navigation/SearchReviewsNavigation.kt(1 hunks)feature/review/src/main/java/team/retum/review/ui/PostReviewScreen.kt(0 hunks)feature/review/src/main/java/team/retum/review/ui/ReviewDetailsScreen.kt(2 hunks)feature/review/src/main/java/team/retum/review/ui/ReviewFilterScreen.kt(1 hunks)feature/review/src/main/java/team/retum/review/ui/ReviewScreen.kt(1 hunks)feature/review/src/main/java/team/retum/review/ui/ReviewsScreen.kt(0 hunks)feature/review/src/main/java/team/retum/review/ui/SearchReviewScreen.kt(1 hunks)feature/review/src/main/java/team/retum/review/ui/component/ReviewItems.kt(1 hunks)feature/review/src/main/java/team/retum/review/viewmodel/PostReviewViewModel.kt(0 hunks)feature/review/src/main/java/team/retum/review/viewmodel/ReviewDetailsViewModel.kt(2 hunks)feature/review/src/main/java/team/retum/review/viewmodel/ReviewFilterViewModel.kt(1 hunks)feature/review/src/main/java/team/retum/review/viewmodel/ReviewViewModel.kt(1 hunks)feature/review/src/main/java/team/retum/review/viewmodel/ReviewsViewModel.kt(0 hunks)feature/review/src/main/java/team/retum/review/viewmodel/SearchReviewsViewModel.kt(1 hunks)feature/review/src/main/res/values/strings.xml(1 hunks)settings.gradle.kts(1 hunks)
๐ค Files with no reviewable changes (6)
- feature/review/src/main/java/team/retum/review/viewmodel/ReviewsViewModel.kt
 - feature/review/src/main/java/team/retum/review/navigation/ReviewsNavigation.kt
 - feature/review/src/main/java/team/retum/review/viewmodel/PostReviewViewModel.kt
 - feature/review/src/main/java/team/retum/review/ui/PostReviewScreen.kt
 - feature/review/src/main/java/team/retum/review/ui/ReviewsScreen.kt
 - feature/review/src/main/java/team/retum/review/navigation/PostReviewNavigation.kt
 
๐งฐ Additional context used
๐งฌ Code graph analysis (30)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/review/ReviewContent.kt (1)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/card/JobisCard.kt (1)
JobisCard(43-81)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewCompleteNavigation.kt (1)
feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewCompleteScreen.kt (1)
PostReviewComplete(29-47)
feature/review/src/main/java/team/retum/review/navigation/ReviewFilterNavigation.kt (1)
feature/review/src/main/java/team/retum/review/ui/ReviewFilterScreen.kt (1)
ReviewFilter(47-66)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostExpectReviewNavigation.kt (1)
feature/post-review/src/main/java/team/retum/post/review/ui/PostExpectReviewScreen.kt (1)
PostExpectReview(34-76)
feature/review/src/main/java/team/retum/review/ui/ReviewScreen.kt (4)
feature/review/src/main/java/team/retum/review/viewmodel/ReviewViewModel.kt (4)
setYear(27-29)setCode(23-25)setLocation(35-37)clearReview(39-44)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/appbar/JobisTopAppBar.kt (1)
JobisLargeTopAppBar(153-181)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/button/JobisIconButton.kt (1)
JobisIconButton(74-93)feature/review/src/main/java/team/retum/review/ui/component/ReviewItems.kt (1)
ReviewItems(25-81)
feature/post-review/src/main/java/team/retum/post/review/ui/PostNextReviewScreen.kt (6)
app/src/main/java/team/retum/jobisandroidv2/JobisNavigator.kt (1)
navigateToPostExpectReview(149-151)feature/post-review/src/main/java/team/retum/post/review/navigation/PostExpectReviewNavigation.kt (1)
navigateToPostExpectReview(31-33)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/appbar/JobisTopAppBar.kt (1)
JobisSmallTopAppBar(124-144)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/text/JobisText.kt (1)
JobisText(24-45)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/textfield/JobisTextField.kt (1)
JobisTextField(355-436)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/button/JobisButton.kt (1)
JobisButton(322-340)
feature/review/src/main/java/team/retum/review/viewmodel/ReviewViewModel.kt (1)
core/common/src/main/java/team/retum/common/base/BaseViewModel.kt (1)
setState(60-64)
feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewCompleteScreen.kt (2)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewNavigation.kt (1)
navigateToPostReview(35-37)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/text/JobisText.kt (1)
JobisText(24-45)
feature/review/src/main/java/team/retum/review/navigation/SearchReviewsNavigation.kt (1)
feature/review/src/main/java/team/retum/review/ui/SearchReviewScreen.kt (1)
SearchReview(19-33)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewNavigation.kt (1)
feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewScreen.kt (1)
PostReview(66-135)
feature/review/src/main/java/team/retum/review/navigation/ReviewNavigation.kt (1)
feature/review/src/main/java/team/retum/review/ui/ReviewScreen.kt (1)
Review(24-50)
feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostReviewViewModel.kt (2)
core/common/src/main/java/team/retum/common/base/BaseViewModel.kt (2)
setState(60-64)postSideEffect(106-110)feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostExpectReviewViewModel.kt (1)
setButtonEnabled(22-27)
feature/review/src/main/java/team/retum/review/viewmodel/SearchReviewsViewModel.kt (1)
core/common/src/main/java/team/retum/common/base/BaseViewModel.kt (1)
setState(60-64)
feature/post-review/build.gradle.kts (1)
buildSrc/src/main/kotlin/GradlePluginExtensions.kt (2)
android(8-10)implementation(15-17)
app/src/main/java/team/retum/jobisandroidv2/root/RootScreen.kt (1)
feature/review/src/main/java/team/retum/review/navigation/ReviewNavigation.kt (1)
review(10-24)
feature/post-review/src/main/java/team/retum/post/review/ui/PostExpectReviewScreen.kt (4)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/appbar/JobisTopAppBar.kt (1)
JobisSmallTopAppBar(124-144)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/text/JobisText.kt (1)
JobisText(24-45)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/textfield/JobisTextField.kt (1)
JobisTextField(355-436)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/button/JobisButton.kt (1)
JobisButton(322-340)
feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostExpectReviewViewModel.kt (3)
core/common/src/main/java/team/retum/common/base/BaseViewModel.kt (2)
setState(60-64)postSideEffect(106-110)feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostReviewViewModel.kt (2)
setButtonEnabled(130-140)onNextClick(187-197)feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostNextReviewViewModel.kt (1)
onNextClick(47-55)
app/src/main/java/team/retum/jobisandroidv2/navigation/MainNavigation.kt (7)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewNavigation.kt (1)
postReview(15-33)feature/post-review/src/main/java/team/retum/post/review/navigation/PostNextReviewNavigation.kt (1)
postNextReview(17-31)feature/post-review/src/main/java/team/retum/post/review/navigation/PostExpectReviewNavigation.kt (1)
postExpectReview(15-29)feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewCompleteNavigation.kt (1)
postReviewComplete(10-22)feature/review/src/main/java/team/retum/review/navigation/ReviewDetailsNavigation.kt (1)
reviewDetails(13-29)feature/review/src/main/java/team/retum/review/navigation/ReviewFilterNavigation.kt (1)
reviewFilter(10-18)feature/review/src/main/java/team/retum/review/navigation/SearchReviewsNavigation.kt (1)
searchReview(10-22)
feature/review/src/main/java/team/retum/review/viewmodel/ReviewFilterViewModel.kt (1)
core/common/src/main/java/team/retum/common/base/BaseViewModel.kt (1)
setState(60-64)
feature/review/src/main/java/team/retum/review/viewmodel/ReviewDetailsViewModel.kt (1)
core/common/src/main/java/team/retum/common/base/BaseViewModel.kt (1)
setState(60-64)
feature/review/src/main/java/team/retum/review/navigation/ReviewDetailsNavigation.kt (1)
feature/review/src/main/java/team/retum/review/ui/ReviewDetailsScreen.kt (1)
ReviewDetails(47-78)
feature/review/src/main/java/team/retum/review/ui/ReviewFilterScreen.kt (4)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/appbar/JobisTopAppBar.kt (1)
JobisSmallTopAppBar(124-144)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/button/JobisButton.kt (1)
JobisButton(322-340)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/text/JobisText.kt (1)
JobisText(24-45)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/checkbox/CheckBox.kt (1)
JobisCheckBox(21-66)
app/build.gradle.kts (1)
buildSrc/src/main/kotlin/GradlePluginExtensions.kt (1)
implementation(15-17)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostNextReviewNavigation.kt (1)
feature/post-review/src/main/java/team/retum/post/review/ui/PostNextReviewScreen.kt (1)
PostNextReview(45-82)
feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewScreen.kt (9)
app/src/main/java/team/retum/jobisandroidv2/JobisNavigator.kt (1)
navigateToPostNextReview(141-143)feature/post-review/src/main/java/team/retum/post/review/navigation/PostNextReviewNavigation.kt (1)
navigateToPostNextReview(33-35)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/appbar/JobisTopAppBar.kt (1)
JobisLargeTopAppBar(153-181)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/text/JobisText.kt (1)
JobisText(24-45)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/button/JobisButton.kt (1)
JobisButton(322-340)feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostReviewViewModel.kt (6)
setButtonClear(179-185)setInterviewType(151-158)setInterviewLocation(160-167)setChecked(142-149)setKeyword(59-67)setSelectedTech(104-105)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/button/JobisIconButton.kt (1)
JobisIconButton(74-93)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/textfield/JobisTextField.kt (1)
JobisTextField(355-436)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/checkbox/CheckBox.kt (1)
JobisCheckBox(21-66)
feature/review/build.gradle.kts (1)
buildSrc/src/main/kotlin/GradlePluginExtensions.kt (1)
implementation(15-17)
feature/review/src/main/java/team/retum/review/ui/component/ReviewItems.kt (1)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/text/JobisText.kt (1)
JobisText(24-45)
feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostNextReviewViewModel.kt (1)
core/common/src/main/java/team/retum/common/base/BaseViewModel.kt (2)
setState(60-64)postSideEffect(106-110)
feature/review/src/main/java/team/retum/review/ui/SearchReviewScreen.kt (4)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/appbar/JobisTopAppBar.kt (1)
JobisSmallTopAppBar(124-144)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/textfield/JobisTextField.kt (1)
JobisTextField(355-436)feature/review/src/main/java/team/retum/review/ui/component/ReviewItems.kt (1)
ReviewItems(25-81)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/empty/EmptyContent.kt (1)
EmptyContent(21-56)
feature/review/src/main/java/team/retum/review/ui/ReviewDetailsScreen.kt (4)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/appbar/JobisTopAppBar.kt (1)
JobisSmallTopAppBar(124-144)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/tab/TabBar.kt (1)
TabBar(21-68)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/text/JobisText.kt (1)
JobisText(24-45)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/card/JobisCard.kt (1)
JobisCard(43-81)
๐ช detekt (1.23.8)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostNextReviewNavigation.kt
[warning] 38-38: A call to the default constructor of an exception was detected. Instead one of the constructor overloads should be called. This allows to provide more meaningful exceptions.
(detekt.exceptions.ThrowingExceptionsWithoutMessageOrCause)
        
          
                app/src/main/java/team/retum/jobisandroidv2/navigation/MainNavigation.kt
          
            Show resolved
            Hide resolved
        
              
          
                core/design-system/src/main/java/team/retum/jobisdesignsystemv2/foundation/JobisColor.kt
          
            Show resolved
            Hide resolved
        
              
          
                core/network/src/main/java/team/retum/network/datasource/review/ReviewDataSource.kt
          
            Show resolved
            Hide resolved
        
              
          
                core/network/src/main/java/team/retum/network/datasource/review/ReviewDataSource.kt
          
            Show resolved
            Hide resolved
        
              
          
                feature/review/src/main/java/team/retum/review/viewmodel/ReviewViewModel.kt
          
            Show resolved
            Hide resolved
        
              
          
                feature/review/src/main/java/team/retum/review/viewmodel/ReviewViewModel.kt
          
            Show resolved
            Hide resolved
        
      Docstrings generation was requested by @uson1004. * #473 (comment) The following files were modified: * `app/src/main/java/team/retum/jobisandroidv2/JobisNavigator.kt` * `app/src/main/java/team/retum/jobisandroidv2/navigation/MainNavigation.kt` * `app/src/main/java/team/retum/jobisandroidv2/root/RootNavigation.kt` * `app/src/main/java/team/retum/jobisandroidv2/root/RootScreen.kt` * `core/data/src/main/java/team/retum/data/repository/review/ReviewRepository.kt` * `core/data/src/main/java/team/retum/data/repository/review/ReviewRepositoryImpl.kt` * `core/design-system/src/main/java/team/retum/jobisdesignsystemv2/review/ReviewContent.kt` * `core/domain/src/main/java/team/retum/usecase/entity/FetchReviewDetailEntity.kt` * `core/domain/src/main/java/team/retum/usecase/entity/FetchReviewsEntity.kt` * `core/domain/src/main/java/team/retum/usecase/entity/MyReviews.kt` * `core/domain/src/main/java/team/retum/usecase/entity/PostReviewEntity.kt` * `core/domain/src/main/java/team/retum/usecase/entity/QuestionsEntity.kt` * `core/domain/src/main/java/team/retum/usecase/entity/ReviewsCountEntity.kt` * `core/domain/src/main/java/team/retum/usecase/usecase/review/FetchMyReviewUseCase.kt` * `core/domain/src/main/java/team/retum/usecase/usecase/review/FetchQuestionsUseCase.kt` * `core/domain/src/main/java/team/retum/usecase/usecase/review/FetchReviewsCountUseCase.kt` * `core/domain/src/main/java/team/retum/usecase/usecase/review/FetchReviewsUseCase.kt` * `core/network/src/main/java/team/retum/network/api/ReviewApi.kt` * `core/network/src/main/java/team/retum/network/datasource/review/ReviewDataSource.kt` * `core/network/src/main/java/team/retum/network/datasource/review/ReviewDataSourceImpl.kt` * `feature/bookmark/src/main/java/team/retum/bookmark/ui/BookmarkScreen.kt` * `feature/company/src/main/java/team/retum/company/navigation/CompanyDetailsNavigation.kt` * `feature/company/src/main/java/team/retum/company/ui/CompanyDetailsScreen.kt` * `feature/company/src/main/java/team/retum/company/viewmodel/CompanyDetailsViewModel.kt` * `feature/home/src/main/java/team/retum/home/ui/ApplyCompanyItem.kt` * `feature/home/src/main/java/team/retum/home/ui/HomeScreen.kt` * `feature/mypage/src/main/java/team/retum/jobis/navigation/MyPageNavigation.kt` * `feature/mypage/src/main/java/team/retum/jobis/ui/MyPageScreen.kt` * `feature/post-review/src/main/java/team/retum/post/review/model/PostReviewData.kt` * `feature/post-review/src/main/java/team/retum/post/review/navigation/PostExpectReviewNavigation.kt` * `feature/post-review/src/main/java/team/retum/post/review/navigation/PostNextReviewNavigation.kt` * `feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewCompleteNavigation.kt` * `feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewNavigation.kt` * `feature/post-review/src/main/java/team/retum/post/review/ui/PostExpectReviewScreen.kt` * `feature/post-review/src/main/java/team/retum/post/review/ui/PostNextReviewScreen.kt` * `feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewCompleteScreen.kt` * `feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewScreen.kt` * `feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostExpectReviewViewModel.kt` * `feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostNextReviewViewModel.kt` * `feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostReviewViewModel.kt` * `feature/review/src/main/java/team/retum/review/navigation/ReviewDetailsNavigation.kt` * `feature/review/src/main/java/team/retum/review/navigation/ReviewFilterNavigation.kt` * `feature/review/src/main/java/team/retum/review/navigation/ReviewNavigation.kt` * `feature/review/src/main/java/team/retum/review/navigation/SearchReviewsNavigation.kt` * `feature/review/src/main/java/team/retum/review/ui/ReviewDetailsScreen.kt` * `feature/review/src/main/java/team/retum/review/ui/ReviewFilterScreen.kt` * `feature/review/src/main/java/team/retum/review/ui/ReviewScreen.kt` * `feature/review/src/main/java/team/retum/review/ui/SearchReviewScreen.kt` * `feature/review/src/main/java/team/retum/review/ui/component/ReviewItems.kt` * `feature/review/src/main/java/team/retum/review/viewmodel/ReviewDetailsViewModel.kt` * `feature/review/src/main/java/team/retum/review/viewmodel/ReviewFilterViewModel.kt` * `feature/review/src/main/java/team/retum/review/viewmodel/ReviewViewModel.kt` * `feature/review/src/main/java/team/retum/review/viewmodel/SearchReviewsViewModel.kt`
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: 17
โป๏ธ Duplicate comments (18)
core/common/src/main/java/team/retum/common/enums/ApplyStatus.kt (1)
12-13: DOC_FAILED ์ํ์ UI ์ฒ๋ฆฌ ๋๋ฝ๊ณผ๊ฑฐ ๋ฆฌ๋ทฐ์์ ์ด๋ฏธ ์ง์ ๋์๋ฏ์ด, ์๋ก ์ถ๊ฐ๋
DOC_FAILED์ํ๊ฐApplyCompanyItem.kt์ ์์ ๋งคํ์์ ๋ช ์์ ์ผ๋ก ์ฒ๋ฆฌ๋์ง ์์ต๋๋ค.PROCESSING์ํ๋ UI์์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌ๋๊ณ ์์ผ๋,DOC_FAILED๋else๋ถ๊ธฐ๋ก ๋น ์ ธ ์๋ํ์ง ์์onPrimary์์์ด ํ ๋น๋ฉ๋๋ค.feature/home/src/main/java/team/retum/home/ui/ApplyCompanyItem.kt (1)
48-54: DOC_FAILED ์ํ๊ฐ ์ฌ์ ํ ์ฒ๋ฆฌ๋์ง ์์ต๋๋ค๊ณผ๊ฑฐ ๋ฆฌ๋ทฐ์์ ์ง์ ๋ ๊ฒ์ฒ๋ผ,
ApplyStatus.DOC_FAILED๊ฐwhenํํ์์์ ๋ช ์์ ์ผ๋ก ์ฒ๋ฆฌ๋์ง ์์else๋ถ๊ธฐ๋ฅผ ํตํดonPrimary์์์ด ํ ๋น๋ฉ๋๋ค.DOC_FAILED("์๋ฅ ํ๋ฝ")๋ ์๋ฏธ์FAILED("ํ๋ฝ")์ ์ ์ฌํ๋ฏ๋กerror์์์ผ๋ก ๋งคํ๋์ด์ผ ํฉ๋๋ค.๋ค์๊ณผ ๊ฐ์ด ์์ ํ์ธ์:
- ApplyStatus.FAILED, ApplyStatus.REJECTED -> JobisTheme.colors.error + ApplyStatus.FAILED, ApplyStatus.DOC_FAILED, ApplyStatus.REJECTED -> JobisTheme.colors.errorfeature/post-review/src/main/java/team/retum/post/review/viewmodel/PostExpectReviewViewModel.kt (2)
12-27: ์ค์ฒฉ setState ํธ์ถ์ ์ ๊ฑฐํด์ผ ํฉ๋๋ค.
setAnswer์setQuestion์ดsetState๋ธ๋ก ์์์ ๋ค์setButtonEnabled๋ฅผ ํธ์ถํ๋ฉด์ ๋ ๋ค๋ฅธsetState๋ฅผ ํธ๋ฆฌ๊ฑฐํ๊ณ ์์ต๋๋ค.BaseViewModel.setState๋MutableStateFlow.update๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ์ด ํจํด์ ๋ง์ง๋ง ํธ์ถ์ด ๊ฐ์ ๋ฎ์ด์จ ์ํ ํ๋ฆฌ์ปค๋ ๋ ์ด์ค๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค. ํ ๋ฒ์setState์์์ ํ๋์buttonEnabled๋ฅผ ๋์์ ๊ณ์ฐยท๋ฐ์ํ๋๋ก ์ ๋ฆฌํด ์ฃผ์ธ์.- internal fun setAnswer(answer: String) = setState { - setButtonEnabled(answer = answer) - state.value.copy(answer = answer) - } - - internal fun setQuestion(question: String) = setState { - setButtonEnabled(question = question) - state.value.copy(question = question) - } - - private fun setButtonEnabled( - answer: String = state.value.answer, - question: String = state.value.question, - ) = setState { - state.value.copy(buttonEnabled = answer.isNotBlank() && question.isNotBlank()) - } + internal fun setAnswer(answer: String) { + val question = state.value.question + setState { + state.value.copy( + answer = answer, + buttonEnabled = answer.isNotBlank() && question.isNotBlank(), + ) + } + } + + internal fun setQuestion(question: String) { + val answer = state.value.answer + setState { + state.value.copy( + question = question, + buttonEnabled = answer.isNotBlank() && question.isNotBlank(), + ) + } + }
29-36: setEmpty๊ฐ ์ํ๋ฅผ ์ค์ ๋ก ๋น์ฐ์ง ๋ชปํฉ๋๋ค.
setEmpty๊ฐcopy๋ง ํธ์ถํ๊ณsetState๋ก ์ ์ฉํ์ง ์์onNextClick์ด ์ด์  ์ง๋ฌธ/๋ต๋ณ ๊ฐ์ ๊ทธ๋๋ก ์ ํํฉ๋๋ค. ๋ฒํผ ๋นํ์ฑํ๋ ๋์ง ์์ต๋๋ค. ๋จผ์  ์ํ๋ฅผ ๋น์ฐ๊ณ ๋ฒํผ๋ ๊บผ์ง๊ฒ ๋ง๋ ๋ค ์ฌ์ด๋ ์ดํํธ๋ฅผ ๋ณด๋ด๋๋ก ์์ ํด ์ฃผ์ธ์.- internal fun setEmpty() { - with(state.value) { - copy( - question = "", - answer = "", - ) - } - onNextClick() - } + internal fun setEmpty() { + setState { + state.value.copy( + question = "", + answer = "", + buttonEnabled = false, + ) + } + onNextClick() + }feature/post-review/src/main/res/values/strings.xml (1)
30-30: ์ด์  ๋ฆฌ๋ทฐ ์ฝ๋ฉํธ๊ฐ ์ด๋ฏธ ๋ฐ์๋์์ต๋๋ค."์๋ชป๋ ์์ฒญ์ด์์"๋ก ์ฌ๋ฐ๋ฅด๊ฒ ์์ ๋์ด ์์ต๋๋ค.
feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewNavigation.kt (3)
22-23: navArgument ํ์ ๋ช ์ ํ์ ๋ฐ companyId๋ LongType ์ฌ์ฉ์ด์  ๋ฆฌ๋ทฐ์์ ์ง์ ๋ ๋ฌธ์ ๊ฐ ์์ง ํด๊ฒฐ๋์ง ์์์ต๋๋ค.
navArgument๋ธ๋ก์type =์ ๋ช ์ํ๊ณ ,companyId๋LongType์ผ๋ก ๋ณ๊ฒฝํ์ฌ ์๋ ํ์ฑ์ ์ ๊ฑฐํด์ผ ํฉ๋๋ค.๋ค์ diff๋ฅผ ์ ์ฉํ์ธ์:
- navArgument(ResourceKeys.COMPANY_NAME) { NavType.StringType }, - navArgument(ResourceKeys.COMPANY_ID) { NavType.StringType }, + navArgument(ResourceKeys.COMPANY_NAME) { type = NavType.StringType }, + navArgument(ResourceKeys.COMPANY_ID) { type = NavType.LongType },
29-30: companyName URI ์ธ์ฝ๋ฉ ๋ฐ companyId ํ์ ์์ ์ฑ ๊ฐ์์ด์  ๋ฆฌ๋ทฐ์์ ์ง์ ๋ ๋ฌธ์ ๊ฐ ์์ง ํด๊ฒฐ๋์ง ์์์ต๋๋ค:
- ๊ณต๋ฐฑ์ด๋ ํน์๋ฌธ์๊ฐ ํฌํจ๋ ํ์ฌ๋ช ์ ๋ค๋น๊ฒ์ด์  ๊ฒฝ๋ก๋ฅผ ๊นจ๋จ๋ฆฝ๋๋ค.
 companyId๋ฅผ String์ผ๋ก ๋ฐ์ ํ์ฑํ๋ฉด์ 0L ๋ํดํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์คํจ๋ฅผ ์จ๊น๋๋ค.๋ค์ diff๋ฅผ ์ ์ฉํ์ธ์:
+import android.net.Uri -import kotlin.text.toLongOrNull @@ - companyName = it.arguments?.getString(ResourceKeys.COMPANY_NAME) ?: "", - companyId = it.arguments?.getString(ResourceKeys.COMPANY_ID)?.toLongOrNull() ?: 0L, + companyName = requireNotNull(it.arguments).getString(ResourceKeys.COMPANY_NAME).orEmpty(), + companyId = requireNotNull(it.arguments).getLong(ResourceKeys.COMPANY_ID),
35-39: navigateToPostReview์์ companyName URI ์ธ์ฝ๋ฉ ํ์์ด์  ๋ฆฌ๋ทฐ์์ ์ง์ ๋ ๋ฌธ์ ๊ฐ ์์ง ํด๊ฒฐ๋์ง ์์์ต๋๋ค.
companyName์ URI ์ธ์ฝ๋ฉํ์ง ์์ผ๋ฉด ๊ณต๋ฐฑ์ด๋ ํน์๋ฌธ์๋ก ์ธํด ๋ค๋น๊ฒ์ด์ ์ด ์คํจํ ์ ์์ต๋๋ค.๋ค์ diff๋ฅผ ์ ์ฉํ์ธ์:
+import android.net.Uri @@ fun NavController.navigateToPostReview(companyName: String, companyId: Long) { - navigate("$NAVIGATION_POST_REVIEW/$companyName/$companyId") { + navigate("$NAVIGATION_POST_REVIEW/${Uri.encode(companyName)}/$companyId") { popUpTo(NAVIGATION_POST_NEXT_REVIEW) { inclusive = false } popUpTo(NAVIGATION_POST_EXPECT_REVIEW) { inclusive = false } } }feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostNextReviewViewModel.kt (2)
19-29: ์ง๋ฌธ ๋ก๋ ์คํจ ์ฒ๋ฆฌ ๋๋ฝ์ด์  ๋ฆฌ๋ทฐ์์ ์ง์ ๋ ๋ฌธ์ ๊ฐ ์์ง ํด๊ฒฐ๋์ง ์์์ต๋๋ค. ๋คํธ์ํฌ ์คํจ ์ ์ํ๊ฐ ๊ฐฑ์ ๋์ง ์์ UX๊ฐ ๋ฉ์ถ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์คํจ ๋ถ๊ธฐ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค:
viewModelScope.launch(Dispatchers.IO) { fetchQuestionsUseCase().onSuccess { setState { state.value.copy( questions = it.questions, + answers = List(it.questions.size) { "" }, + qnaElements = emptyList(), + buttonEnabled = false, ) } + }.onFailure { + setState { + state.value.copy( + questions = emptyList(), + answers = emptyList(), + qnaElements = emptyList(), + buttonEnabled = false, + ) + } + // TODO: ์คํจ ์ฌ์ด๋์ดํํธ/ํ ์คํธ ๋ ธ์ถ } }
47-61: answers ๊ธธ์ด ๊ฒ์ฆ ๋ฐ ๋ฒํผ ํ์ฑํ ๋ก์ง ๋๋ฝ์ด์  ๋ฆฌ๋ทฐ์์ ์ง์ ๋ ๊ฒ์ฒ๋ผ, ์ง๋ฌธ ์์
answers๊ธธ์ด๊ฐ ๋ถ์ผ์นํ๋ฉดzip์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์๋ ค๋๊ฐ ๋ฐ์ดํฐ ์ ์ค์ด ๋ฐ์ํฉ๋๋ค. ๋ํ ๋ชจ๋ ๋ต๋ณ์ด ์ฑ์์ก์ ๋๋ง ๋ฒํผ์ ํ์ฑํํด์ผ ํฉ๋๋ค.๋ค์๊ณผ ๊ฐ์ด ๊ธธ์ด ๊ฒ์ฆ๊ณผ ๋ฒํผ ํ์ฑํ๋ฅผ ํจ๊ป ๋ฐ์ํด์ฃผ์ธ์:
internal fun setQuestion() { setState { with(state.value) { - val updatedQuestions = questions.map { it.id } - copy( - qnaElements = updatedQuestions.zip(answers).map { (q, a) -> - PostReviewContent( - question = q, - answer = a, - ) - }, - ) + val ids = questions.map { it.id } + val pairs = ids.zip(answers) + val allAnswered = answers.size == ids.size && answers.all { it.isNotBlank() } + copy( + qnaElements = pairs.map { (q, a) -> PostReviewContent(question = q, answer = a) }, + answers = answers, + buttonEnabled = allAnswered, + ) } } }feature/post-review/src/main/java/team/retum/post/review/ui/PostNextReviewScreen.kt (2)
55-55: answers ๋ฆฌ์คํธ ๊ณ ์  ํฌ๊ธฐ๋ก ์ธํ ํฌ๋์ ๊ฐ๋ฅ์ฑ์ด์  ๋ฆฌ๋ทฐ์์ ์ง์ ๋ ๋ฌธ์ ๊ฐ ์์ง ํด๊ฒฐ๋์ง ์์์ต๋๋ค. ์ง๋ฌธ ์(
state.questions.size)์answersํฌ๊ธฐ๊ฐ ๋ถ์ผ์นํ๋ฉดanswers[page]์์ IndexOutOfBoundsException์ด ๋ฐ์ํฉ๋๋ค.๋ค์ diff๋ฅผ ์ ์ฉํ์ธ์:
- val answers = remember { mutableStateListOf("", "", "") } + val answers = remember(state.questions) { + mutableStateListOf(*Array(state.questions.size) { "" }) + }๋๋
toMutableStateList()์ฌ์ฉ:+import androidx.compose.runtime.toMutableStateList @@ - val answers = remember { mutableStateListOf("", "", "") } + val answers = remember(state.questions) { + List(state.questions.size) { "" }.toMutableStateList() + }
166-166: ๋ง์ง๋ง ํ์ด์ง ํ๋์ฝ๋ฉ ์ ๊ฑฐ ํ์์ด์  ๋ฆฌ๋ทฐ์์ ์ง์ ๋ ๋ฌธ์ ๊ฐ ์์ง ํด๊ฒฐ๋์ง ์์์ต๋๋ค. ํ์ด์ง ์๊ฐ 3์ด ์๋ ๊ฒฝ์ฐ ํ๋ฆ์ด ๊นจ์ง๋๋ค. ๋ง์ง๋ง ์ธ๋ฑ์ค๋ฅผ ๋์ ์ผ๋ก ๊ณ์ฐํด์ผ ํฉ๋๋ค.
๋ค์ diff๋ฅผ ์ ์ฉํ์ธ์:
onClick = { setQuestion() coroutineScope.launch { - if (pagerState.currentPage != 2) pagerState.animateScrollToPage(pagerState.currentPage + 1) else onPostExpectReviewClick() + val lastPageIndex = pagerState.pageCount - 1 + if (pagerState.currentPage < lastPageIndex) { + pagerState.animateScrollToPage(pagerState.currentPage + 1) + } else { + onPostExpectReviewClick() + } } },feature/post-review/src/main/java/team/retum/post/review/ui/PostExpectReviewScreen.kt (1)
88-154: ํ๋จ ๋ฐฐ์น๊ฐ ๊นจ์ง์ง ์๋๋ก Column ์ ์ ์ฒด ๋์ด๋ฅผ ๋ถ์ฌํ์ธ์
Spacer(weight = 1f)๋ก ๋ฒํผ์ ํ๋จ์ ๋ถ์ด๋ ค๋ฉด ๋ถ๋ชจColumn์ด ๊ฐ์ฉ ๋์ด๋ฅผ ์ฐจ์งํด์ผ ํฉ๋๋ค. ํ์ฌModifier.fillMaxSize()๊ฐ ์์ด ๋ฒํผ์ด ์ค๊ฐ์ ๋จธ๋ฌด๋ฆ ๋๋ค. ๊ธฐ์กด ์ง์ ๊ณผ ๋์ผํ๋ ์๋์ ๊ฐ์ด ์์ ํด ์ฃผ์ธ์.-import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize @@ - Column { + Column( + modifier = Modifier.fillMaxSize(), + ) {feature/post-review/src/main/java/team/retum/post/review/navigation/PostNextReviewNavigation.kt (1)
33-39: ๋ผ์ฐํธ ์ธ์ฝ๋ฉ ๋๋ฝ์ผ๋ก ์ธํ ๋ค๋น๊ฒ์ด์  ์คํจJSON ์์
/,?,%๋ฑ์ด ํฌํจ๋๋ฉด ๊ฒฝ๋ก๊ฐ ๋ถ๋ฆฌ๋์ด ๋ชฉ์ ์ง ๋งค์นญ์ด ์คํจํ๊ณ , ์์ธ๋ฅผ ๋ฉ์์ง ์์ด ๋์ ธ ๋๋ฒ๊น ๋ ์ด๋ ต์ต๋๋ค. Uri.encode/Uri.decode์ ๋ช ์์ ์ธ ์์ธ ๋ฉ์์ง๋ฅผ ์ถ๊ฐํด ์ฃผ์ธ์.+import android.net.Uri @@ fun NavController.navigateToPostNextReview(reviewData: PostReviewData) { - navigate("$NAVIGATION_POST_NEXT_REVIEW/${reviewData.toJsonString()}") + val payload = Uri.encode(reviewData.toJsonString()) + navigate("$NAVIGATION_POST_NEXT_REVIEW/$payload") } internal fun NavBackStackEntry.getReviewData(): PostReviewData { - val reviewData = arguments?.getString(ResourceKeys.REVIEW_DATA) ?: throw NullPointerException() - return reviewData.toReviewData() + val encoded = requireNotNull(arguments?.getString(ResourceKeys.REVIEW_DATA)) { + "Missing '${ResourceKeys.REVIEW_DATA}' argument for $NAVIGATION_POST_NEXT_REVIEW" + } + return Uri.decode(encoded).toReviewData() }feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewScreen.kt (1)
704-708: ํํธ ๋ฌธ์์ด์ ํ๋ ์ฉ๋์ ๋ง๊ฒ ๊ต์ฒดํด์ฃผ์ธ์.๋ฉด์ ๊ด ์ ์ ๋ ฅ ํ๋์ ์ฌ์ ํ
search๋ฌธ์์ด์ ์ฌ์ฉํ๊ณ ์์ด UX๊ฐ ์ด์ํฉ๋๋ค. ๋ฉด์ ๊ด ์์ ๋ง๋ ์๋ก์ด string ๋ฆฌ์์ค๋ฅผ ์ถ๊ฐํ ๋ค ํด๋น ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํด์ฃผ์ธ์.- hint = stringResource(id = R.string.search), + hint = stringResource(id = R.string.hint_interviewer_count),โป
hint_interviewer_count๋ฆฌ์์ค ์ถ๊ฐ๋ ํจ๊ป ๋ฐ์ํด์ผ ํฉ๋๋ค.feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostReviewViewModel.kt (3)
107-116: [DUPLICATE] Compose SnapshotStateList๋ฅผ IO ์ค๋ ๋์์ ๋ณ๊ฒฝํ๋ ์ค๋ ๋ ์์ ์ฑ ๋ฌธ์ Line 114์์
techs.addAll(it.codes)๋ฅผDispatchers.IO์์ ํธ์ถํ๋ฉด ์ค๋ ์ท ์ถฉ๋ ๋ฐ ํฌ๋์ ์ํ์ด ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ ์ด์  ๋ฆฌ๋ทฐ์์ ์ด๋ฏธ ์ง์ ๋์์ต๋๋ค.๋ฉ์ธ ์ค๋ ๋์์ ๋ณ๊ฒฝํ๊ฑฐ๋ StateFlow๋ก ๋ณ๊ฒฝํ์ธ์:
internal fun fetchCodes(keyword: String?) = viewModelScope.launch(Dispatchers.IO) { fetchCodeUseCase( keyword = keyword, type = CodeType.JOB, parentCode = null, ).onSuccess { - techs.addAll(it.codes) + withContext(Dispatchers.Main) { + techs.addAll(it.codes) + } } }
130-140: [DUPLICATE] ๋ฒํผ ํ์ฑํ ๋ก์ง ์ญ์  ๋ฐ NPE ์ํLine 137์์
!state.value.keyword?.isNotEmpty()!!๋ ํค์๋๊ฐ ์ ๋ ฅ๋๋ฉด ๋ฒํผ์ ๋นํ์ฑํํ๋ ์ญ์ ๋ ๋ก์ง์ด๋ฉฐ, keyword๊ฐ null์ผ ๊ฒฝ์ฐ NPE ์ํ์ด ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ ์ด์  ๋ฆฌ๋ทฐ์์ ์ด๋ฏธ ์ง์ ๋์์ต๋๋ค.์์  ์ ์ฉ:
else -> { - setState { state.value.copy(buttonEnabled = !state.value.keyword?.isNotEmpty()!!) } + setState { + state.value.copy( + buttonEnabled = !state.value.keyword.isNullOrEmpty() + ) + } }
187-197: [DUPLICATE] interviewerCount ํ์ฑ ์ ํฌ๋์ ์ํLine 191์์
count.toInt()๋ ๋น ๋ฌธ์์ด์ด๋ ์ซ์๊ฐ ์๋ ์ ๋ ฅ ์ NumberFormatException์ ๋ฐ์์ํต๋๋ค. ์ด ๋ฌธ์ ๋ ์ด์  ๋ฆฌ๋ทฐ์์ ์ด๋ฏธ ์ง์ ๋์์ต๋๋ค.์์ ํ ํ์ฑ ์ ์ฉ:
internal fun onNextClick() { with(state.value) { + val parsedCount = count.toIntOrNull() + if (parsedCount == null || parsedCount <= 0) { + postSideEffect(PostReviewSideEffect.BadRequest) + return + } postSideEffect(PostReviewSideEffect.MoveToNext( companyId = companyId, - interviewerCount = count.toInt(), + interviewerCount = parsedCount, jobCode = selectedTech ?: 0, interviewType = interviewType, location = interviewLocation, )) } }
๐งน Nitpick comments (10)
feature/review/src/main/java/team/retum/review/viewmodel/ReviewFilterViewModel.kt (1)
33-47: ์๋ฌ ํธ๋ค๋ง ์ถ๊ฐ๋ฅผ ๊ณ ๋ คํ์ธ์.
fetchCodeUseCase์คํจ ์ ์ฒ๋ฆฌ๊ฐ ์์ด ์ฌ์ฉ์๊ฐ ๋น ๋ชฉ๋ก๋ง ๋ณด๊ฒ ๋ฉ๋๋ค. ์๋ฌ ์ํ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๋ก๊น ์ ๊ณ ๋ คํ์ธ์.fetchCodeUseCase( keyword = null, type = CodeType.JOB, parentCode = null, ).onSuccess { setState { state.value.copy( majorList = it.codes, ) } + }.onFailure { + // ๋ก๊น ๋๋ ์๋ฌ ์ํ ์ฒ๋ฆฌ ๊ณ ๋ ค }feature/post-review/src/main/java/team/retum/post/review/model/PostReviewData.kt (1)
30-38: deprecated API ์ฌ์ฉ์ ํผํ์ธ์.
URLEncoder.encode(String, String)๋ฐURLDecoder.decode(String, String)๋ deprecated API์ ๋๋ค.StandardCharsets๋ฅผ ์ฌ์ฉํ์ฌ ํ๋์ ์ด๊ณ ์์ ํ API๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.๋ค์๊ณผ ๊ฐ์ด ์์ ํ์ธ์:
+import java.nio.charset.StandardCharsets + internal fun PostReviewData.toJsonString(): String { val json = Json.encodeToString(this) - return URLEncoder.encode(json, "UTF-8") + return URLEncoder.encode(json, StandardCharsets.UTF_8) } internal fun String.toReviewData(): PostReviewData { - val decoded = URLDecoder.decode(this, "UTF-8") + val decoded = URLDecoder.decode(this, StandardCharsets.UTF_8) return Json.decodeFromString<PostReviewData>(decoded) }feature/review/src/main/java/team/retum/review/ui/ReviewScreen.kt (1)
77-89:items()ํ์ฅ ํจ์ ๋์itemsIndexed()์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค.
items(state.reviews.size)์ ์ธ๋ฑ์ค ์ ๊ทผ ๋์ , LazyColumn์itemsIndexed()ํ์ฅ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ๊ฐ๊ฒฐํ๊ณ ์์ ํฉ๋๋ค.๋ค์๊ณผ ๊ฐ์ด ๋ฆฌํฉํ ๋งํ ์ ์์ต๋๋ค:
+import androidx.compose.foundation.lazy.itemsIndexed + - LazyColumn { - items(state.reviews.size) { - val review = state.reviews[it] + LazyColumn { + itemsIndexed(state.reviews) { _, review -> ReviewItems( companyImageUrl = review.companyLogoUrl, companyName = review.companyName, reviewId = review.reviewId, writer = review.writer, major = review.major, onReviewDetailClick = onReviewDetailClick, ) } }feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewCompleteScreen.kt (1)
38-38: TODO ์ฃผ์: API ์์ฒญ ์ต์ ํ ํ์๋น๋ฒํ API ์์ฒญ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํฉ๋๋ค. ์บ์ฑ, ์์ฒญ ์ค๋ณต ์ ๊ฑฐ, ๋๋ ์ํ ๊ด๋ฆฌ ๊ฐ์ ๋ฑ์ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํด๋ณด์ธ์.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ตฌํ์ ์์ฑํ๊ฑฐ๋ ์๋ก์ด ์ด์๋ฅผ ์ด์ด๋๋ฆด๊น์?
feature/review/src/main/java/team/retum/review/viewmodel/SearchReviewsViewModel.kt (1)
33-60: ๊ฒ์์ด๊ฐ ๋น๋ฉด ๊ฒฐ๊ณผ๋ ์ด๊ธฐํํด ์ฃผ์ธ์๊ฒ์์ด๋ฅผ ๋ชจ๋ ์ง์ฐ๋ฉด
fetchReviews()๋ ํธ์ถ๋์ง ์๋๋ฐ, ์ด์  ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ๊ทธ๋๋ก ๋จ์ ์์ด ํ๋ฉด๊ณผ ๊ฒ์์ด๊ฐ ๋ถ์ผ์นํฉ๋๋ค. ๊ณต๋ฐฑ์ผ ๋๋ ๋ฆฌ์คํธ์ ๋น ์ํ ํ๋๊ทธ๋ฅผ ์ด๊ธฐํํ๋ ํธ์ด ์์ฐ์ค๋ฝ์ต๋๋ค.viewModelScope.launch { - state.map { it.keyword }.distinctUntilChanged().debounce(SEARCH_DEBOUNCE_MILLIS).collect { - if (!it.isNullOrBlank()) { - fetchReviews() - } + state.map { it.keyword }.distinctUntilChanged().debounce(SEARCH_DEBOUNCE_MILLIS).collect { keyword -> + if (keyword.isNullOrBlank()) { + setState { + state.value.copy( + reviews = emptyList(), + showRecruitmentsEmptyContent = false, + ) + } + } else { + fetchReviews() } } }feature/review/src/main/java/team/retum/review/ui/ReviewDetailsScreen.kt (5)
113-122: ํ๋ผ๋ฏธํฐ ์๊ฐ ๋ง์ ๋ฐ์ดํฐ ํด๋์ค ์ฌ์ฉ ๊ถ์ฅ8๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์ ๋ฌํ๊ณ ์์ต๋๋ค. ์ ์ง๋ณด์์ฑ๊ณผ ๊ฐ๋ ์ฑ ํฅ์์ ์ํด ๋ฐ์ดํฐ ํด๋์ค๋ก ๊ทธ๋ฃนํํ๋ ๊ฒ์ ๊ณ ๋ คํด๋ณด์ธ์.
๋ค์๊ณผ ๊ฐ์ด ๋ฐ์ดํฐ ํด๋์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค:
data class StudentInfoData( val writer: String, val major: String, val year: Int, val companyName: String, val location: InterviewLocation, val type: InterviewType, val interviewerCount: Int, val selectedTabIndex: Int, ) @Composable private fun StudentInfo(data: StudentInfoData) { // implementation }
133-140: ๋ณต์กํ ๋ฌธ์์ด ํฌ๋งทํ ๋ก์ง ๋จ์ํ ๊ถ์ฅ์ค์ฒฉ๋
stringResourceํธ์ถ๊ณผ ์กฐ๊ฑด๋ฌธ์ด ๊ฐ๋ ์ฑ์ ์ ํดํฉ๋๋ค. ๋ก์ง์ ๋ณ๋๋ก ์ถ์ถํ๋ ๊ฒ์ ๊ณ ๋ คํด๋ณด์ธ์.๋ค์๊ณผ ๊ฐ์ด ๋ฆฌํฉํ ๋งํ ์ ์์ต๋๋ค:
val reviewType = if (selectedTabIndex != 0) { stringResource(id = R.string.reviewed_question) } else { stringResource(id = R.string.interview_review) } JobisText( text = stringResource( id = R.string.review_writer_title, writer, reviewType, ), style = JobisTypography.PageTitle, )
254-258: ํ ์คํธ ์ค๋ฒํ๋ก์ฐ ์ฒ๋ฆฌ ๋ช ์ ๊ถ์ฅ
maxLines = 3์ ์ค์ ํ์ง๋งJobisText์ ๊ธฐ๋ณธoverflow์์ฑ์ ์์กดํ๊ณ ์์ต๋๋ค. ๋ช ์์ ์ผ๋กTextOverflow.Ellipsis๋ฅผ ์ง์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.JobisText์ ๊ธฐ๋ณธ๊ฐ์ด Ellipsis์ด๋ฏ๋ก ํ์ฌ๋ ๋ฌธ์ ์์ง๋ง, ๋ช ์์ฑ์ ์ํด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค:
Text( text = buildAnnotatedString { /* ... */ }, style = JobisTypography.Description, modifier = Modifier .padding(top = 12.dp) .fillMaxWidth(0.5f), maxLines = 3, overflow = TextOverflow.Ellipsis, // ๋ช ์์  ์ง์  )
274-274: ์ฌ์ฉํ์ง ์๋ index ๋ณ์ ์ ๊ฑฐ ๊ถ์ฅ
forEachIndexed๋ฅผ ์ฌ์ฉํ์ง๋งindex๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค.forEach๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.- review.forEachIndexed { index, reviewItem -> + review.forEach { reviewItem ->
344-350: ๋ต๋ณ ํ ์คํธ ์ค๋ฒํ๋ก์ฐ ์ฒ๋ฆฌ ๊ฒํ
maxLines = 3์ ์ค์ ํ์ง๋ง ๊ธด ๋ต๋ณ์ด ์๋ฆด ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ์ ์ฒด ๋ด์ฉ์ ๋ณผ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ํ์ฅ ์ํ์์๋ ์ ์ฒด ํ ์คํธ๋ฅผ ํ์ํ๊ฑฐ๋, ์ต์ํ ๋ง์ค์ํ๊ฐ ํ์๋๋๋ก ํด์ผ ํฉ๋๋ค.ํ์ฅ ์ํ์์๋ ์ ์ฒด ๋ต๋ณ์ ํ์ํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์:
JobisText( text = reviewItem.answer, color = JobisTheme.colors.inverseOnSurface, style = JobisTypography.Description, textAlign = TextAlign.Center, - maxLines = 3, + // ํ์ฅ๋ ์ํ์์๋ ์ ์ฒด ํ ์คํธ ํ์ )
๐ Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
โ Files ignored due to path filters (1)
feature/bookmark/src/main/res/drawable/ic_empty_bookmark.pngis excluded by!**/*.png
๐ Files selected for processing (86)
app/build.gradle.kts(1 hunks)app/src/main/java/team/retum/jobisandroidv2/JobisNavigator.kt(3 hunks)app/src/main/java/team/retum/jobisandroidv2/navigation/MainNavigation.kt(3 hunks)app/src/main/java/team/retum/jobisandroidv2/root/RootNavigation.kt(2 hunks)app/src/main/java/team/retum/jobisandroidv2/root/RootScreen.kt(5 hunks)app/src/main/java/team/retum/jobisandroidv2/ui/BottomMenu.kt(2 hunks)app/src/main/java/team/retum/jobisandroidv2/ui/BottomNavigationBar.kt(1 hunks)app/src/main/res/drawable/ic_review.xml(1 hunks)app/src/main/res/values/strings.xml(1 hunks)core/common/src/main/java/team/retum/common/enums/ApplyStatus.kt(1 hunks)core/common/src/main/java/team/retum/common/enums/InterviewLocation.kt(1 hunks)core/common/src/main/java/team/retum/common/enums/InterviewType.kt(1 hunks)core/common/src/main/java/team/retum/common/enums/ReviewProcess.kt(1 hunks)core/common/src/main/java/team/retum/common/utils/ResourceKeys.kt(1 hunks)core/data/src/main/java/team/retum/data/repository/review/ReviewRepository.kt(1 hunks)core/data/src/main/java/team/retum/data/repository/review/ReviewRepositoryImpl.kt(2 hunks)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/foundation/JobisColor.kt(1 hunks)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/foundation/JobisIcon.kt(1 hunks)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/review/ReviewContent.kt(1 hunks)core/design-system/src/main/res/drawable/ic_asterisk.xml(1 hunks)core/design-system/src/main/res/drawable/ic_success.xml(1 hunks)core/domain/src/main/java/team/retum/usecase/entity/FetchReviewDetailEntity.kt(1 hunks)core/domain/src/main/java/team/retum/usecase/entity/FetchReviewsEntity.kt(2 hunks)core/domain/src/main/java/team/retum/usecase/entity/MyReviews.kt(1 hunks)core/domain/src/main/java/team/retum/usecase/entity/PostReviewEntity.kt(1 hunks)core/domain/src/main/java/team/retum/usecase/entity/QuestionsEntity.kt(1 hunks)core/domain/src/main/java/team/retum/usecase/entity/ReviewsCountEntity.kt(1 hunks)core/domain/src/main/java/team/retum/usecase/usecase/review/FetchMyReviewUseCase.kt(1 hunks)core/domain/src/main/java/team/retum/usecase/usecase/review/FetchQuestionsUseCase.kt(1 hunks)core/domain/src/main/java/team/retum/usecase/usecase/review/FetchReviewsCountUseCase.kt(1 hunks)core/domain/src/main/java/team/retum/usecase/usecase/review/FetchReviewsUseCase.kt(1 hunks)core/network/src/main/java/team/retum/network/api/ReviewApi.kt(2 hunks)core/network/src/main/java/team/retum/network/datasource/review/ReviewDataSource.kt(1 hunks)core/network/src/main/java/team/retum/network/datasource/review/ReviewDataSourceImpl.kt(2 hunks)core/network/src/main/java/team/retum/network/di/RequestUrls.kt(1 hunks)core/network/src/main/java/team/retum/network/model/request/PostReviewRequest.kt(1 hunks)core/network/src/main/java/team/retum/network/model/response/FetchMyReviewResponse.kt(1 hunks)core/network/src/main/java/team/retum/network/model/response/FetchQuestionsResponse.kt(1 hunks)core/network/src/main/java/team/retum/network/model/response/FetchReviewDetailResponse.kt(1 hunks)core/network/src/main/java/team/retum/network/model/response/FetchReviewsCountResponse.kt(1 hunks)core/network/src/main/java/team/retum/network/model/response/FetchReviewsResponse.kt(1 hunks)feature/bookmark/src/main/java/team/retum/bookmark/ui/BookmarkScreen.kt(1 hunks)feature/company/src/main/java/team/retum/company/navigation/CompanyDetailsNavigation.kt(1 hunks)feature/company/src/main/java/team/retum/company/ui/CompanyDetailsScreen.kt(3 hunks)feature/company/src/main/java/team/retum/company/viewmodel/CompanyDetailsViewModel.kt(1 hunks)feature/home/src/main/java/team/retum/home/ui/ApplyCompanyItem.kt(1 hunks)feature/home/src/main/java/team/retum/home/ui/HomeScreen.kt(1 hunks)feature/mypage/src/main/java/team/retum/jobis/navigation/MyPageNavigation.kt(1 hunks)feature/mypage/src/main/java/team/retum/jobis/ui/MyPageScreen.kt(3 hunks)feature/post-review/.gitignore(1 hunks)feature/post-review/build.gradle.kts(1 hunks)feature/post-review/src/main/java/team/retum/post/review/model/PostReviewData.kt(1 hunks)feature/post-review/src/main/java/team/retum/post/review/navigation/PostExpectReviewNavigation.kt(1 hunks)feature/post-review/src/main/java/team/retum/post/review/navigation/PostNextReviewNavigation.kt(1 hunks)feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewCompleteNavigation.kt(1 hunks)feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewNavigation.kt(1 hunks)feature/post-review/src/main/java/team/retum/post/review/ui/PostExpectReviewScreen.kt(1 hunks)feature/post-review/src/main/java/team/retum/post/review/ui/PostNextReviewScreen.kt(1 hunks)feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewCompleteScreen.kt(1 hunks)feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewScreen.kt(1 hunks)feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostExpectReviewViewModel.kt(1 hunks)feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostNextReviewViewModel.kt(1 hunks)feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostReviewViewModel.kt(1 hunks)feature/post-review/src/main/res/values/strings.xml(1 hunks)feature/review/build.gradle.kts(2 hunks)feature/review/src/main/java/team/retum/review/navigation/PostReviewNavigation.kt(0 hunks)feature/review/src/main/java/team/retum/review/navigation/ReviewDetailsNavigation.kt(1 hunks)feature/review/src/main/java/team/retum/review/navigation/ReviewFilterNavigation.kt(1 hunks)feature/review/src/main/java/team/retum/review/navigation/ReviewNavigation.kt(1 hunks)feature/review/src/main/java/team/retum/review/navigation/ReviewsNavigation.kt(0 hunks)feature/review/src/main/java/team/retum/review/navigation/SearchReviewsNavigation.kt(1 hunks)feature/review/src/main/java/team/retum/review/ui/PostReviewScreen.kt(0 hunks)feature/review/src/main/java/team/retum/review/ui/ReviewDetailsScreen.kt(2 hunks)feature/review/src/main/java/team/retum/review/ui/ReviewFilterScreen.kt(1 hunks)feature/review/src/main/java/team/retum/review/ui/ReviewScreen.kt(1 hunks)feature/review/src/main/java/team/retum/review/ui/ReviewsScreen.kt(0 hunks)feature/review/src/main/java/team/retum/review/ui/SearchReviewScreen.kt(1 hunks)feature/review/src/main/java/team/retum/review/ui/component/ReviewItems.kt(1 hunks)feature/review/src/main/java/team/retum/review/viewmodel/PostReviewViewModel.kt(0 hunks)feature/review/src/main/java/team/retum/review/viewmodel/ReviewDetailsViewModel.kt(2 hunks)feature/review/src/main/java/team/retum/review/viewmodel/ReviewFilterViewModel.kt(1 hunks)feature/review/src/main/java/team/retum/review/viewmodel/ReviewViewModel.kt(1 hunks)feature/review/src/main/java/team/retum/review/viewmodel/ReviewsViewModel.kt(0 hunks)feature/review/src/main/java/team/retum/review/viewmodel/SearchReviewsViewModel.kt(1 hunks)feature/review/src/main/res/values/strings.xml(1 hunks)settings.gradle.kts(1 hunks)
๐ค Files with no reviewable changes (6)
- feature/review/src/main/java/team/retum/review/navigation/PostReviewNavigation.kt
 - feature/review/src/main/java/team/retum/review/viewmodel/PostReviewViewModel.kt
 - feature/review/src/main/java/team/retum/review/viewmodel/ReviewsViewModel.kt
 - feature/review/src/main/java/team/retum/review/ui/PostReviewScreen.kt
 - feature/review/src/main/java/team/retum/review/navigation/ReviewsNavigation.kt
 - feature/review/src/main/java/team/retum/review/ui/ReviewsScreen.kt
 
๐งฐ Additional context used
๐งฌ Code graph analysis (31)
app/build.gradle.kts (1)
buildSrc/src/main/kotlin/GradlePluginExtensions.kt (1)
implementation(15-17)
feature/review/build.gradle.kts (1)
buildSrc/src/main/kotlin/GradlePluginExtensions.kt (1)
implementation(15-17)
feature/post-review/src/main/java/team/retum/post/review/ui/PostExpectReviewScreen.kt (4)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/appbar/JobisTopAppBar.kt (1)
JobisSmallTopAppBar(124-144)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/text/JobisText.kt (1)
JobisText(24-45)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/textfield/JobisTextField.kt (1)
JobisTextField(355-436)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/button/JobisButton.kt (1)
JobisButton(322-340)
feature/review/src/main/java/team/retum/review/navigation/SearchReviewsNavigation.kt (1)
feature/review/src/main/java/team/retum/review/ui/SearchReviewScreen.kt (1)
SearchReview(19-33)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewCompleteNavigation.kt (1)
feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewCompleteScreen.kt (1)
PostReviewComplete(29-47)
feature/review/src/main/java/team/retum/review/ui/ReviewScreen.kt (4)
feature/review/src/main/java/team/retum/review/viewmodel/ReviewViewModel.kt (4)
setYear(23-25)setCode(19-21)setLocation(31-33)clearReview(35-44)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/appbar/JobisTopAppBar.kt (1)
JobisLargeTopAppBar(153-181)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/button/JobisIconButton.kt (1)
JobisIconButton(74-93)feature/review/src/main/java/team/retum/review/ui/component/ReviewItems.kt (1)
ReviewItems(25-81)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/review/ReviewContent.kt (1)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/card/JobisCard.kt (1)
JobisCard(43-81)
feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostNextReviewViewModel.kt (1)
core/common/src/main/java/team/retum/common/base/BaseViewModel.kt (2)
setState(60-64)postSideEffect(106-110)
feature/post-review/src/main/java/team/retum/post/review/ui/PostNextReviewScreen.kt (5)
app/src/main/java/team/retum/jobisandroidv2/JobisNavigator.kt (1)
navigateToPostExpectReview(149-151)feature/post-review/src/main/java/team/retum/post/review/navigation/PostExpectReviewNavigation.kt (1)
navigateToPostExpectReview(31-33)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/appbar/JobisTopAppBar.kt (1)
JobisSmallTopAppBar(124-144)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/textfield/JobisTextField.kt (1)
JobisTextField(355-436)feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostNextReviewViewModel.kt (2)
setAnswer(31-41)setQuestion(47-61)
feature/review/src/main/java/team/retum/review/viewmodel/ReviewViewModel.kt (1)
core/common/src/main/java/team/retum/common/base/BaseViewModel.kt (1)
setState(60-64)
feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewCompleteScreen.kt (2)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewNavigation.kt (1)
navigateToPostReview(35-40)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/text/JobisText.kt (1)
JobisText(24-45)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostExpectReviewNavigation.kt (1)
feature/post-review/src/main/java/team/retum/post/review/ui/PostExpectReviewScreen.kt (1)
PostExpectReview(34-76)
app/src/main/java/team/retum/jobisandroidv2/root/RootScreen.kt (1)
feature/review/src/main/java/team/retum/review/navigation/ReviewNavigation.kt (1)
review(10-24)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostNextReviewNavigation.kt (1)
feature/post-review/src/main/java/team/retum/post/review/ui/PostNextReviewScreen.kt (1)
PostNextReview(45-81)
feature/post-review/build.gradle.kts (1)
buildSrc/src/main/kotlin/GradlePluginExtensions.kt (2)
android(8-10)implementation(15-17)
feature/review/src/main/java/team/retum/review/ui/ReviewFilterScreen.kt (4)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/appbar/JobisTopAppBar.kt (1)
JobisSmallTopAppBar(124-144)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/button/JobisButton.kt (1)
JobisButton(322-340)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/text/JobisText.kt (1)
JobisText(24-45)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/checkbox/CheckBox.kt (1)
JobisCheckBox(21-66)
feature/review/src/main/java/team/retum/review/ui/component/ReviewItems.kt (1)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/text/JobisText.kt (1)
JobisText(24-45)
feature/review/src/main/java/team/retum/review/ui/ReviewDetailsScreen.kt (5)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/appbar/JobisTopAppBar.kt (1)
JobisSmallTopAppBar(124-144)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/tab/TabBar.kt (1)
TabBar(21-68)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/text/JobisText.kt (1)
JobisText(24-45)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/card/JobisCard.kt (1)
JobisCard(43-81)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/empty/EmptyContent.kt (1)
EmptyContent(21-56)
feature/review/src/main/java/team/retum/review/navigation/ReviewNavigation.kt (1)
feature/review/src/main/java/team/retum/review/ui/ReviewScreen.kt (1)
Review(24-50)
feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostReviewViewModel.kt (2)
core/common/src/main/java/team/retum/common/base/BaseViewModel.kt (2)
setState(60-64)postSideEffect(106-110)feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostExpectReviewViewModel.kt (1)
setButtonEnabled(22-27)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewNavigation.kt (1)
feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewScreen.kt (1)
PostReview(66-135)
feature/review/src/main/java/team/retum/review/navigation/ReviewFilterNavigation.kt (1)
feature/review/src/main/java/team/retum/review/ui/ReviewFilterScreen.kt (1)
ReviewFilter(47-66)
feature/review/src/main/java/team/retum/review/ui/SearchReviewScreen.kt (4)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/appbar/JobisTopAppBar.kt (1)
JobisSmallTopAppBar(124-144)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/textfield/JobisTextField.kt (1)
JobisTextField(355-436)feature/review/src/main/java/team/retum/review/ui/component/ReviewItems.kt (1)
ReviewItems(25-81)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/empty/EmptyContent.kt (1)
EmptyContent(21-56)
feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostExpectReviewViewModel.kt (3)
core/common/src/main/java/team/retum/common/base/BaseViewModel.kt (2)
setState(60-64)postSideEffect(106-110)feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostReviewViewModel.kt (2)
setButtonEnabled(130-140)onNextClick(187-197)feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostNextReviewViewModel.kt (1)
onNextClick(63-71)
feature/review/src/main/java/team/retum/review/viewmodel/SearchReviewsViewModel.kt (1)
core/common/src/main/java/team/retum/common/base/BaseViewModel.kt (1)
setState(60-64)
feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewScreen.kt (9)
app/src/main/java/team/retum/jobisandroidv2/JobisNavigator.kt (1)
navigateToPostNextReview(141-143)feature/post-review/src/main/java/team/retum/post/review/navigation/PostNextReviewNavigation.kt (1)
navigateToPostNextReview(33-35)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/appbar/JobisTopAppBar.kt (1)
JobisLargeTopAppBar(153-181)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/text/JobisText.kt (1)
JobisText(24-45)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/button/JobisButton.kt (1)
JobisButton(322-340)feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostReviewViewModel.kt (6)
setButtonClear(179-185)setInterviewType(151-158)setInterviewLocation(160-167)setChecked(142-149)setKeyword(59-67)setSelectedTech(104-105)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/button/JobisIconButton.kt (1)
JobisIconButton(74-93)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/textfield/JobisTextField.kt (1)
JobisTextField(355-436)core/design-system/src/main/java/team/retum/jobisdesignsystemv2/checkbox/CheckBox.kt (1)
JobisCheckBox(21-66)
feature/review/src/main/java/team/retum/review/viewmodel/ReviewDetailsViewModel.kt (1)
core/common/src/main/java/team/retum/common/base/BaseViewModel.kt (1)
setState(60-64)
feature/review/src/main/java/team/retum/review/navigation/ReviewDetailsNavigation.kt (1)
feature/review/src/main/java/team/retum/review/ui/ReviewDetailsScreen.kt (1)
ReviewDetails(48-75)
feature/company/src/main/java/team/retum/company/viewmodel/CompanyDetailsViewModel.kt (1)
feature/review/src/main/java/team/retum/review/viewmodel/ReviewViewModel.kt (1)
fetchReviewsUseCase(14-63)
feature/review/src/main/java/team/retum/review/viewmodel/ReviewFilterViewModel.kt (1)
core/common/src/main/java/team/retum/common/base/BaseViewModel.kt (1)
setState(60-64)
app/src/main/java/team/retum/jobisandroidv2/navigation/MainNavigation.kt (7)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewNavigation.kt (1)
postReview(15-33)feature/post-review/src/main/java/team/retum/post/review/navigation/PostNextReviewNavigation.kt (1)
postNextReview(17-31)feature/post-review/src/main/java/team/retum/post/review/navigation/PostExpectReviewNavigation.kt (1)
postExpectReview(15-29)feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewCompleteNavigation.kt (1)
postReviewComplete(10-22)feature/review/src/main/java/team/retum/review/navigation/ReviewDetailsNavigation.kt (1)
reviewDetails(13-29)feature/review/src/main/java/team/retum/review/navigation/ReviewFilterNavigation.kt (1)
reviewFilter(10-18)feature/review/src/main/java/team/retum/review/navigation/SearchReviewsNavigation.kt (1)
searchReview(10-22)
๐ช detekt (1.23.8)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostNextReviewNavigation.kt
[warning] 38-38: A call to the default constructor of an exception was detected. Instead one of the constructor overloads should be called. This allows to provide more meaningful exceptions.
(detekt.exceptions.ThrowingExceptionsWithoutMessageOrCause)
๐ Additional comments (50)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/review/ReviewContent.kt (2)
22-23: ์ข์ ๋ฆฌํฉํ ๋ง์ ๋๋ค!
reviewIdํ์ ์String์์Long์ผ๋ก ๋ณ๊ฒฝํ๊ณonClick์๊ทธ๋์ฒ๋ฅผ(Long) -> Unit์ผ๋ก ๋จ์ํํ ๊ฒ์ ํ๋ฅญํ ๊ฐ์ ์ ๋๋ค. ID์Longํ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ํ์ค์ ์ด๋ฉฐ ํ์ ์์ ์ฑ์ ๋์ฌ์ค๋๋ค. ๋ํ ๋ค๋น๊ฒ์ด์ ์๋ ๋ฆฌ๋ทฐ ID๋ง ํ์ํ๋ฏ๋ก API๊ฐ ๋์ฑ ๋ช ํํด์ก์ต๋๋ค.
27-27: ๊ตฌํ์ด ์ฌ๋ฐ๋ฆ ๋๋ค.
onClickํธ๋ค๋ฌ์reviewId๋ง ์ ๋ฌํ๋๋ก ๊ตฌํ์ด ์ ํํ๊ฒ ์ ๋ฐ์ดํธ๋์์ต๋๋ค.writerํ๋ผ๋ฏธํฐ๋ ์ฌ์ ํ UI ํ์์ ์ฌ์ฉ๋๊ณ ์์ด ์ ์ ํฉ๋๋ค.core/network/src/main/java/team/retum/network/di/RequestUrls.kt (1)
85-90: ๋ฆฌ๋ทฐ API ๊ฒฝ๋ก ๋ฆฌํฉํ ๋ง ํ์ธ ์๋ฃ
์์ธยท๋ชฉ๋กยท์ง๋ฌธยท์ง๊ณยท๋ด ๋ฆฌ๋ทฐ ๊ฒฝ๋ก๊ฐ ๊ณตํตpath๊ธฐ๋ฐ์ผ๋ก ์ ๋ฆฌ๋์ด ์ Retrofit ์๊ทธ๋์ฒ์ ์ผ๊ด๋ฉ๋๋ค. GET/POST ๊ฒฝ๋ก๋ ์์ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํด ํผ์ ์ด ์ค์ด๋ค ๊ฒ ๊ฐ์ต๋๋ค.core/common/src/main/java/team/retum/common/enums/ApplyStatus.kt (1)
6-6: SEND ๋ผ๋ฒจ ๋ณ๊ฒฝ ์๋๋ฅผ ํ์ธํ์ธ์."์ง์ ์ค"์์ "์ ์ก"์ผ๋ก ๋ผ๋ฒจ์ด ๋ณ๊ฒฝ๋์์ต๋๋ค. ์ด ๋ณ๊ฒฝ์ด ์๋๋ ๊ฒ์ด๋ฉฐ ๋ชจ๋ UI ํ ์คํธ์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ผ๊ด์ฑ์ด ์๋์ง ํ์ธ์ด ํ์ํฉ๋๋ค.
feature/home/src/main/java/team/retum/home/ui/ApplyCompanyItem.kt (1)
51-51: LGTM: SEND์ PROCESSING ์ํ ์ฒ๋ฆฌ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ถ๊ฐ๋จ์๋ก ์ถ๊ฐ๋
SEND์PROCESSING์ํ๋ฅผsecondary์์์ผ๋ก ๋งคํํ ๊ฒ์ ์ ์ ํฉ๋๋ค.feature/review/src/main/java/team/retum/review/viewmodel/ReviewFilterViewModel.kt (2)
61-91: LGTM!ํํฐ ์ ํ ํ ๊ธ ๋ก์ง์ด ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํ๋์์ต๋๋ค. ๋์ผํ ๊ฐ ์ฌ์ ํ ์ ์ ํ ํด์ ํ๋ ํจํด์ด ์ฌ์ฉ์ ๊ฒฝํ์ ์ ํฉํฉ๋๋ค.
94-113: LGTM!
ReviewsFilterState๋ฐ์ดํฐ ํด๋์ค๊ฐ ์ ์ ํ๊ฒ ์ ์๋์์ต๋๋ค.@Immutable์ด๋ ธํ ์ด์ ๊ณผ ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด์ด Compose ๋ชจ๋ฒ ์ฌ๋ก์ ๋ถํฉํฉ๋๋ค.feature/review/src/main/java/team/retum/review/viewmodel/ReviewDetailsViewModel.kt (1)
34-36: LGTM!
setTabIndexํจ์๋ ํญ ์ธ๋ฑ์ค๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ฐ์ดํธํ๋ฉฐ, ๊ตฌํ์ด ๋ช ํํฉ๋๋ค.feature/bookmark/src/main/java/team/retum/bookmark/ui/BookmarkScreen.kt (1)
135-135: ๋๋ก์ด๋ธ ๋ฆฌ์์ค ๋ณ๊ฒฝ - ์๊ฐ์  ์ ์ ์ฑ ๊ฒ์ฆ ํ์
ic_empty_bookmark์์ ์ค๊ณ ์์คํ ์ ์ ๋ค๋ฆญic_empty๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค. ์ ๋ฆฌ์์ค๋ ๋์์ธ ์์คํ ์ ์กด์ฌํ๋ฉฐ(core/design-system/src/main/res/drawable/ic_empty.png), ์ด ๋ณ๊ฒฝ์ด BookmarkScreen์๋ง ์ ์ฉ๋์ด ์์ต๋๋ค.ํ์ธ ์ฌํญ:
- ์ ๋ค๋ฆญ
 ic_empty๊ฐ ๋ถ๋งํฌ ๋น ์ํ ์ปจํ ์คํธ์ ์๊ฐ์ ์ผ๋ก ์ ์ ํ์ง ๊ฒ์ฆ- ์ด๊ฒ์ด ์๋๋ ๋์์ธ ์์คํ  ํตํฉ์ธ์ง ํ์ธ
 contentDescription์ ์ฌ์ ํ "empty bookmark"์ด๋ฏ๋ก, ์ ํ๋ ์์ด์ฝ์ด ๋ถ๋งํฌ ์ปจํ ์คํธ์ ์ผ์นํ๋์ง ํ์ธํด์ฃผ์ธ์.
feature/post-review/src/main/res/values/strings.xml (1)
1-58: LGTM!๋ฌธ์์ด ๋ฆฌ์์ค๊ฐ ํ๋ฉด๋ณ๋ก ์ ์ ๋ฆฌ๋์ด ์์ผ๋ฉฐ, ํ๊ตญ์ด ํ๊ธฐ๋ฒ๋ ์ ์ ํฉ๋๋ค.
app/src/main/java/team/retum/jobisandroidv2/ui/BottomNavigationBar.kt (1)
28-28: LGTM!ํ๋จ ๋ค๋น๊ฒ์ด์ ์ Review ๋ฉ๋ด ์์ดํ ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ถ๊ฐ๋์์ต๋๋ค.
settings.gradle.kts (1)
47-47: LGTM!์๋ก์ด post-review ๋ชจ๋์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ถ๊ฐ๋์์ต๋๋ค.
app/src/main/res/values/strings.xml (1)
6-6: LGTM!ํ๊ธฐ ๊ธฐ๋ฅ์ ์ํ ๋ฌธ์์ด ๋ฆฌ์์ค๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ถ๊ฐ๋์์ต๋๋ค.
core/design-system/src/main/res/drawable/ic_asterisk.xml (1)
1-9: LGTM!ํ์ ์ ๋ ฅ ํ์๋ฅผ ์ํ ๋ณํ ์์ด์ฝ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ ์๋์์ต๋๋ค.
feature/company/src/main/java/team/retum/company/viewmodel/CompanyDetailsViewModel.kt (1)
45-53: LGTM!
fetchReviewsUseCase์ ํ์ฅ๋ ์๊ทธ๋์ฒ์ ๋ง๊ฒ ํ๋ผ๋ฏธํฐ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ฌ๋๊ณ ์์ต๋๋ค. ํ์ฌ ์์ธ ํ๋ฉด์์๋companyId๋ง ํ์ํ๋ฏ๋ก ๋๋จธ์ง ํ๋ผ๋ฏธํฐ๋ฅผ null๋ก ์ ๋ฌํ๋ ๊ฒ์ด ์ ์ ํฉ๋๋ค.app/src/main/java/team/retum/jobisandroidv2/ui/BottomMenu.kt (2)
10-10: LGTM!
NAVIGATION_REVIEWimport๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ถ๊ฐ๋์์ต๋๋ค.
29-33: LGTM!Review ํ๋จ ๋ฉ๋ด ์์ดํ ์ด ๊ธฐ์กด ํจํด๊ณผ ์ผ๊ด๋๊ฒ ์ ์ ์๋์์ต๋๋ค.
core/common/src/main/java/team/retum/common/enums/ReviewProcess.kt (1)
4-8: ๊ฒ์ฆ ์๋ฃ - ๋ชจ๋ ๋ณ๊ฒฝ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ฉ๋์์ต๋๋ค.๊ฒ์ฆ ๊ฒฐ๊ณผ,
ReviewProcess์ด๊ฑฐํ์ ์์ ๋ณ๊ฒฝ(QUESTION, TECH, FINISH โ INTERVIEW_TYPE, INTERVIEW_LOCATION, TECH_STACK, INTERVIEWER_COUNT, SUMMARY)์ด ์ฝ๋๋ฒ ์ด์ค ์ ์ฒด์ ์์ ํ๊ณ ์ผ๊ด๋๊ฒ ์ ์ฉ๋์์ต๋๋ค:
- ์ ๊ฑฐ๋ ์์์ ๋ํ ์ง์  ์ฐธ์กฐ ์์
 - ๋ฌธ์์ด ๊ธฐ๋ฐ ์ฐธ์กฐ ์์
 - ๋ชจ๋ ์ฌ์ฉ์ฒ์์ ์๋ก์ด ์์๋ก ์ ๋ฐ์ดํธ๋จ (PostReviewViewModel.kt, PostReviewScreen.kt)
 breaking change์ด์ง๋ง ๋ณ๊ฒฝ์ด ์์ ํ๊ฒ ์ฒ๋ฆฌ๋์ด ์ปดํ์ผ ์ค๋ฅ๋ ๋ฐํ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/foundation/JobisIcon.kt (1)
40-40: ๋ณ๊ฒฝ ์ฌํญ์ด ์ ์ ํฉ๋๋ค.๊ธฐ์กด ํจํด์ ๋ฐ๋ผ ์๋ก์ด ์์ด์ฝ ์์๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
core/design-system/src/main/res/drawable/ic_success.xml (1)
1-9: ๋ฒกํฐ ๋๋ก์ด๋ธ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ ์๋์์ต๋๋ค.ํ์ค ๋ฒกํฐ ๋๋ก์ด๋ธ ํ์์ ๋ฐ๋ฅด๊ณ ์์ผ๋ฉฐ, ์ฑ๊ณต ์๋ฃ ํ๋ฉด์์ ์ฌ์ฉ๋ ์์ด์ฝ์ผ๋ก ์ ์ ํฉ๋๋ค.
core/network/src/main/java/team/retum/network/model/response/FetchReviewDetailResponse.kt (2)
23-27: ๋ด๋ถ ๋ฐ์ดํฐ ํด๋์ค ๋ฆฌํฉํ ๋ง์ด ์ ์ ํฉ๋๋ค.
Detail์์QnAs๋ก ๋ช ๋ช ์ด ๊ฐ์ ๋์๊ณ ,areaํ๋๊ฐ ์ ๊ฑฐ๋์ด ๊ตฌ์กฐ๊ฐ ๋จ์ํ๋์์ต๋๋ค. ๋ช ๋ช ์ด ๋ ๋ช ํํด์ก์ต๋๋ค.
10-20: ๊ฒ์ฆ ์๋ฃ - ๋ชจ๋ ๋ณ๊ฒฝ์ฌํญ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐ์๋์์ต๋๋ค.์๋ก์ด ํ๋ ๊ตฌ์กฐ๊ฐ ๋ชจ๋ ๊ณ์ธต์์ ์ผ๊ด๋๊ฒ ์ฒ๋ฆฌ๋๊ณ ์์ต๋๋ค. JSON ํ๋๋ช (review_id, company_name, company_name ๋ฑ)์ด ๋ชจ๋ ์ ์ ํ snake_case๋ก ์ค์ ๋์ด ์์ผ๋ฉฐ, API โ DataSource โ Repository โ UseCase โ ViewModel ์ ์ฒด ํ์ดํ๋ผ์ธ์์
toEntity()ํ์ฅํจ์๋ฅผ ํตํด ์ ์์ ์ผ๋ก ๋งคํ๋๊ณ ์์ต๋๋ค. QnAs ์ค์ฒฉ ํด๋์ค๋ ๋ณ๋ ๋งคํํจ์๋ก ์ง์๋๊ณ ์์ต๋๋ค.app/build.gradle.kts (1)
118-118: ๋ชจ๋ ์์กด์ฑ ์ถ๊ฐ๊ฐ ์ ์ ํฉ๋๋ค.์๋ก์ด
post-review๊ธฐ๋ฅ ๋ชจ๋์ ์ฑ์ ํตํฉํ๋ ํ์ค์ ์ธ ๋ฐฉ์์ ๋๋ค.app/src/main/res/drawable/ic_review.xml (1)
1-9: ๋ฒกํฐ ๋๋ก์ด๋ธ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ ์๋์์ต๋๋ค.ํ๋จ ๋ค๋น๊ฒ์ด์ ์ฉ ๋ฆฌ๋ทฐ ์์ด์ฝ์ด ์ ์ ํ ํฌ๊ธฐ(20dp)์ ์์์ผ๋ก ์ ์๋์์ต๋๋ค.
core/domain/src/main/java/team/retum/usecase/entity/ReviewsCountEntity.kt (1)
5-11: ์ํฐํฐ ์ ์์ ๋งคํ์ด ์ ์ ํฉ๋๋ค.๋จ์ํ๊ณ ๋ช ํํ ์ํฐํฐ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฅด๊ณ ์์ผ๋ฉฐ, ๋คํธ์ํฌ ์๋ต์์ ๋๋ฉ์ธ ์ํฐํฐ๋ก์ ๋งคํ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํ๋์์ต๋๋ค.
totalPageCount์Longํ์ ์ ์ฌ์ฉํ ๊ฒ๋ ์ ์ ํฉ๋๋ค.core/common/src/main/java/team/retum/common/enums/InterviewType.kt (1)
3-7: ๋ฐฑ์๋ API ์คํ ํ์ธ์ด ํ์ํฉ๋๋ค.ํ์ฌ
InterviewType์ด๊ฑฐํ์ ๋ช ์์ ์ธ ์ง๋ ฌํ ์ด๋ ธํ ์ด์ ์ด ์์ผ๋ฉฐ, Moshi์ ๊ธฐ๋ณธ ๋์์ ๋ฐ๋ผINDIVIDUAL,GROUP,OTHERํ์์ผ๋ก ์ง๋ ฌํ๋ฉ๋๋ค. ์ฝ๋๋ฒ ์ด์ค์์ ์ปค์คํ  ์ด๋ํฐ๋ ํ ์คํธ ํ์ผ์ ์ฐพ์ ์ ์์์ผ๋ฏ๋ก, ๋ฐฑ์๋ API๊ฐ ์ค์ ๋ก ์ด ํ์์ ๊ธฐ๋ํ๋์ง ๋ฐฑ์๋ ์คํ์ ํตํด ์ง์  ํ์ธํด์ผ ํฉ๋๋ค.core/common/src/main/java/team/retum/common/enums/InterviewLocation.kt (1)
3-8: ๋ฐฑ์๋ API ์คํ์ ํตํด enum ์ง๋ ฌํ ํ์ ๊ฒ์ฆ ํ์
InterviewLocationenum์ Moshi์ ์ํด enum ์์๋ช ์ด ๊ทธ๋๋ก ์ง๋ ฌํ๋ฉ๋๋ค (DAEJEON,SEOUL,GYEONGGI,OTHER).InterviewType๊ณผ ๋์ผํ๊ฒ ๋ช ์์ ์ธ ์ง๋ ฌํ ์ด๋ ธํ ์ด์ ์ด ์์ผ๋ฏ๋ก, ๋ฐฑ์๋๊ฐ ์ ํํ ์ด ํ์์ ๊ธฐ๋ํ๋์ง API ๋ฌธ์ ๋๋ ๋ฐฑ์๋ ํ์ ํตํด ํ์ธํ์ธ์.enum ์์๋ ์ด๋ฏธ ์์ฒญ/์๋ต ํด๋์ค(
PostReviewRequest.kt,FetchReviewDetailResponse.kt)์์ ์ฌ์ฉ ์ค์ด๋ฏ๋ก, ๊ธฐ์กด ๋ฐฑ์๋ ๊ณ์ฝ์ด ์ผ์นํ๋์ง ์ฌํ์ธํ์๊ธฐ ๋ฐ๋๋๋ค.core/domain/src/main/java/team/retum/usecase/entity/MyReviews.kt (1)
1-23: LGTM!๋๋ฉ์ธ ์ํฐํฐ์ ๋ณํ ๋ก์ง์ด ๊น๋ํ๊ฒ ๊ตฌํ๋์ด ์์ต๋๋ค. ์ ์ ํ ๊ฐ์์ฑ ์ ์ด์ ์ฌ์ฉ๊ณผ ๋ถ๋ณ์ฑ ๋ณด์ฅ์ด ์ ๋์ด ์์ต๋๋ค.
core/network/src/main/java/team/retum/network/model/response/FetchReviewsCountResponse.kt (1)
1-9: LGTM!๊ฐ๋จํ๊ณ ๋ช ํํ ์๋ต ๋ชจ๋ธ์ ๋๋ค. Moshi ์ด๋ํฐ ์์ฑ๊ณผ JSON ๋งคํ์ด ์ ์ ํ๊ฒ ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
feature/review/src/main/java/team/retum/review/navigation/ReviewNavigation.kt (1)
1-28: LGTM!Jetpack Compose Navigation์ ํ์ฉํ ๊น๋ํ ๋ค๋น๊ฒ์ด์  ๊ตฌ์ฑ์ ๋๋ค. ์ฝ๋ฐฑ ๊ธฐ๋ฐ ์ค๊ณ๊ฐ ์ ์ ํ๋ฉฐ ํ์ฅ ํจ์๋ฅผ ํตํ API๊ฐ ์ฌ์ฉํ๊ธฐ ํธ๋ฆฌํฉ๋๋ค.
core/domain/src/main/java/team/retum/usecase/usecase/review/FetchMyReviewUseCase.kt (1)
1-13: LGTM!๊ฐ๋จํ๊ณ ๋ช ํํ Use Case ๊ตฌํ์ ๋๋ค.
runCatching์ ํตํ ์๋ฌ ์ฒ๋ฆฌ์ ์ํฐํฐ ๋ณํ์ด ์ ์ ํ๊ฒ ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.core/network/src/main/java/team/retum/network/model/response/FetchMyReviewResponse.kt (1)
1-15: LGTM!๋คํธ์ํฌ ์๋ต ๋ชจ๋ธ์ด ๊น๋ํ๊ฒ ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. Moshi ์ด๋ํฐ ์์ฑ๊ณผ JSON ํ๋ ๋งคํ์ด ์ ์ ํฉ๋๋ค.
core/network/src/main/java/team/retum/network/model/response/FetchReviewsResponse.kt (1)
12-17: LGTM!์๋ต ๋ชจ๋ธ์ ํ๋ ์ ๋ฐ์ดํธ๊ฐ ์ ์ ํฉ๋๋ค.
reviewId์ ํ์ ๋ณ๊ฒฝ(String โ Long)๊ณผ ์๋ก์ด ํ๋๋ค(companyName,companyLogoUrl,major) ์ถ๊ฐ๊ฐ ํ์ฅ๋ ๊ธฐ๋ฅ ์๊ตฌ์ฌํญ๊ณผ ์ ๋ง์ต๋๋ค.feature/review/src/main/java/team/retum/review/ui/component/ReviewItems.kt (1)
26-81: LGTM!๋ฆฌ๋ทฐ ์์ดํ  ์ปดํฌ์ ๋ธ์ ๊ตฌํ์ด ๊น๋ํฉ๋๋ค. ์ด๋ฏธ์ง URL์ด ๋น์ด์์ ๋์ ํด๋ฐฑ ์ฒ๋ฆฌ, ํ ์คํธ ์ค๋ฒํ๋ก์ฐ ์ฒ๋ฆฌ, ํด๋ฆญ ์ด๋ฒคํธ ์ ๋ฌ ๋ฑ์ด ๋ชจ๋ ์ ์ ํ๊ฒ ๊ตฌํ๋์ด ์์ต๋๋ค.
feature/company/src/main/java/team/retum/company/navigation/CompanyDetailsNavigation.kt (1)
15-15: Long ๊ธฐ๋ฐ ๋ฆฌ๋ทฐ ์๋ณ์๋ก์ ์ ํ์ด ์ ์ ํฉ๋๋ค.๋ฆฌ๋ทฐ ์์ธ ๋ค๋น๊ฒ์ด์  ํ๋ผ๋ฏธํฐ๋ฅผ
(String, String)์์(Long)์ผ๋ก ๋ณ๊ฒฝํ์ฌ ํ์ ์์ ์ฑ๊ณผ ์ผ๊ด์ฑ์ด ๊ฐ์ ๋์์ต๋๋ค.core/domain/src/main/java/team/retum/usecase/usecase/review/FetchQuestionsUseCase.kt (1)
7-13: LGTM!UseCase์ ๊ตฌํ์ด ๊ฐ๊ฒฐํ๊ณ ์ ์ ํฉ๋๋ค.
runCatching์ ์ฌ์ฉํ์ฌ ์๋ฌ๋ฅผResult๋ก ๋ํํ๋ ๋ฐฉ์์ด ์ ์ ํ๋ฉฐ, ํธ์ถ์๊ฐ ์ฑ๊ณต/์คํจ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋์ด ์์ต๋๋ค.core/domain/src/main/java/team/retum/usecase/entity/QuestionsEntity.kt (1)
16-16: ๋ค์ด๋ฐ ํจํด ์ผ๊ด์ฑ ํ์ธ ์๋ฃ - ์ง์  ์ฌํญ ์์ํ๋ก์ ํธ ์ ์ฒด์
toEntity()ํจ์ ํจํด์ ๊ฒํ ํ ๊ฒฐ๊ณผ,QuestionsEntity.kt์ ํจ์๋ช ๊ณผ ๊ตฌ์กฐ๋ ์ด๋ฏธ ํ๋ก์ ํธ์ ํ์ค ๋ค์ด๋ฐ ๊ท์น๊ณผ ์๋ฒฝํ๊ฒ ์ผ์นํฉ๋๋ค. 18๊ฐ ์ด์์ ์ํฐํฐ ํ์ผ์์internal fun ResponseType.toEntity() = EntityType(...)ํจํด์ ๋ฐ๋ฅด๊ณ ์์ผ๋ฉฐ,QuestionsEntity.kt๋ ๋์ผํ ๊ท์น์ ์ค์ํ๊ณ ์์ต๋๋ค. TODO ์ฃผ์์ ์ ๊ฑฐํด๋ ๋ฌด๋ฐฉํฉ๋๋ค.Likely an incorrect or invalid review comment.
core/domain/src/main/java/team/retum/usecase/usecase/review/FetchReviewsUseCase.kt (1)
12-14: ํ๋ผ๋ฏธํฐ ์์ ๊ฒ์ฆ ์๋ฃํ์ฅ๋ ํํฐ ์ธ์๊ฐ repository ๊ณ์ธต์ผ๋ก ์ ํํ ์ ๋ฌ๋๊ณ runCatching ์ผ๋ก ์ค๋ฅ๋ฅผ ํฌ์ฅํ๋ ํ๋ฆ์ด ๋ช ํํฉ๋๋ค.
core/data/src/main/java/team/retum/data/repository/review/ReviewRepositoryImpl.kt (1)
20-49: ๋ฐ์ดํฐ์์ค ์์์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ ฌ๋์์ต๋๋คrepository ๊ณ์ธต์์ ์ถ๊ฐ๋ ํํฐ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ถ data source ์ ๋ค์๋ ์ธ์๋ก ๋๊ฒจ์ฃผ์ด ๋งคํ ์ค๋ฅ ์ํ์ด ์์ต๋๋ค.
core/domain/src/main/java/team/retum/usecase/entity/PostReviewEntity.kt (1)
7-21: ๋๋ฉ์ธ ์ํฐํฐ ๊ตฌ์กฐ ๋ณ๊ฒฝ์ด ์ ์ ํฉ๋๋ค.๋ฉด์  ํ๊ธฐ ์ํฐํฐ์ ์๋ก์ด ํ๋๋ค(interviewType, location, jobCode, interviewerCount, question, answer)์ด ์ถ๊ฐ๋์๊ณ , PostReviewContentEntity์ question ํ์ ์ด String์์ Long์ผ๋ก ๋ณ๊ฒฝ๋์ด ์๋ณ์๋ก์ ๋ ์ ํฉํ ํ์ ์ ์ฌ์ฉํ๊ฒ ๋์์ต๋๋ค.
core/network/src/main/java/team/retum/network/datasource/review/ReviewDataSource.kt (1)
27-31: ์๋ก์ด ๋ฆฌ๋ทฐ ๊ด๋ จ ๋ฉ์๋ ์ถ๊ฐ๊ฐ ์ ์ ํฉ๋๋ค.fetchQuestions(), fetchReviewsCount(), fetchMyReviews() ๋ฉ์๋๊ฐ ์ถ๊ฐ๋์ด ๋ฆฌ๋ทฐ ๊ธฐ๋ฅ์ API ํ๋ฉด์ด ํ์ฅ๋์์ต๋๋ค.
app/src/main/java/team/retum/jobisandroidv2/root/RootScreen.kt (1)
59-62: ๋ฆฌ๋ทฐ ๊ด๋ จ ์ฝ๋ฐฑ ์ถ๊ฐ ๋ฐ ์ ๋ฌ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํ๋์์ต๋๋ค.์๋ก์ด ์ฝ๋ฐฑ๋ค(onReviewFilterClick, onSearchReviewClick, onReviewDetailClick)์ด Root โ RootScreen โ review ์ปดํฌ์ ๋ธ๋ก ์ผ๊ด๋๊ฒ ์ ๋ฌ๋๊ณ ์์ผ๋ฉฐ, onPostReviewClick์ ์๊ทธ๋์ฒ๋ ์ถ๊ฐ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ๋๋ก ์ ์ ํ ์ ๋ฐ์ดํธ๋์์ต๋๋ค.
Also applies to: 99-101, 135-138, 185-189
app/src/main/java/team/retum/jobisandroidv2/JobisNavigator.kt (1)
201-203: reviewId ํ์ ์ด Long์ผ๋ก ๋ณ๊ฒฝ๋ ๊ฒ์ด ์ ์ ํฉ๋๋ค.์ด์  String ํ์ ์์ Long์ผ๋ก ๋ณ๊ฒฝ๋์ด ๋๋ฉ์ธ ๋ชจ๋ธ๊ณผ ์ผ๊ด์ฑ์ ๊ฐ์ถ๊ฒ ๋์์ต๋๋ค.
app/src/main/java/team/retum/jobisandroidv2/navigation/MainNavigation.kt (1)
118-133: ํฌ์คํธ ๋ฆฌ๋ทฐ ๋ค๋น๊ฒ์ด์  ์ฒด์ธ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑ๋์์ต๋๋ค.postReview โ postNextReview โ postExpectReview โ postReviewComplete ํ๋ฆ์ด ์ ์ ํ ์ฝ๋ฐฑ๊ณผ ํจ๊ป ๊ตฌ์ฑ๋์์ต๋๋ค. ๊ฐ ๋จ๊ณ๊ฐ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋จ๊ณ๋ก ์ ๋ฌํ๊ณ ์์ต๋๋ค.
core/network/src/main/java/team/retum/network/api/ReviewApi.kt (1)
24-47: ๋ฆฌ๋ทฐ API ํ์ฅ์ด ์ ์ ํ๊ฒ ๊ตฌํ๋์์ต๋๋ค.fetchReviews๊ฐ ํ์ด์ง๋ค์ด์  ๋ฐ ๋ค์ค ํํฐ๋ง์ ์ง์ํ๋๋ก ํ์ฅ๋์๊ณ , ์๋ก์ด ์๋ํฌ์ธํธ๋ค(fetchQuestions, fetchReviewsCount, fetchMyReviews)์ด ์ถ๊ฐ๋์ด ๋ฆฌ๋ทฐ ๊ธฐ๋ฅ์ ์ถฉ๋ถํ ์ง์ํฉ๋๋ค. ๋ชจ๋ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๊ฐ nullable๋ก ์ ์ธ๋์ด ์ ํ์  ํํฐ๋ง์ด ๊ฐ๋ฅํฉ๋๋ค.
feature/review/src/main/java/team/retum/review/ui/ReviewFilterScreen.kt (1)
47-66: UI ๊ตฌ์กฐ์ ์ปดํฌ๋ํธ ๊ตฌ์ฑ์ด ์ ๋์ด ์์ต๋๋ค.ReviewFilter ์ง์ ์ ๋ถํฐ ์ธ๋ถ ์น์ ๋ค(Skills, Years, InterviewType, Location)๊น์ง ์ ๊ตฌ์กฐํ๋์ด ์์ผ๋ฉฐ, ์ ๋๋ฉ์ด์ ๊ณผ ์ํ ๊ด๋ฆฌ๊ฐ ์ ์ ํ๊ฒ ๊ตฌํ๋์์ต๋๋ค. FlowRow๋ฅผ ์ฌ์ฉํ ๋ ์ด์์๊ณผ ์์ ์ ํ ์ ๋๋ฉ์ด์ ์ด ์ข์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
Also applies to: 68-119, 123-373
feature/review/src/main/java/team/retum/review/ui/ReviewDetailsScreen.kt (4)
77-110: ๋ช ์์  ๋ฐ์ดํฐ ํ๋ก์ฐ๋ก ๊ฐ์ ๋ ๊ตฌ์กฐViewModel ์ํ์ ์ง์  ์์กดํ์ง ์๊ณ ๋ช ์์ ์ธ ํ๋ผ๋ฏธํฐ๋ฅผ ํตํ ๋ฐ์ดํฐ ์ ๋ฌ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํ์ฌ ํ ์คํธ ๊ฐ๋ฅ์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ด ํฅ์๋์์ต๋๋ค.
162-172: ์ด๊ฑฐํ ๋งคํ ๋ก์ง์ด ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํ๋จ
InterviewType๊ณผInterviewLocation์ด๊ฑฐํ์ ๋ชจ๋ ์ผ์ด์ค๋ฅผ exhaustiveํ๊ฒ ์ฒ๋ฆฌํ๊ณ ์์ด ์์ ํฉ๋๋ค.
194-201: ๊น๋ํ ์์ ํจํด
InterviewReview๊ฐReviewContent๋ก ๋ช ํํ๊ฒ ์์ํ๊ณ ์์ต๋๋ค.
207-207: ๋น ๊ฐ ๊ฒ์ฆ ๋ก์ง ํ์ธ ํ์ํ์ฌ
!review.answer.isBlank() || !review.question.isBlank()๋ก์ง์ ๋ ์ค ํ๋๋ผ๋ ๋น์ด์์ง ์์ผ๋ฉด ์ฝํ ์ธ ๋ฅผ ํ์ํฉ๋๋ค. ์๋๊ฐ "๋ ๋ค ์กด์ฌํด์ผ ํ์"๋ผ๋ฉด&&์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.์๋ํ ๋ก์ง์ด ๋ค์ ์ค ์ด๋ ๊ฒ์ธ์ง ํ์ธํ์ธ์:
- ํ์ฌ: ์ง๋ฌธ ๋๋ ๋ต๋ณ ์ค ํ๋๋ผ๋ ์์ผ๋ฉด ํ์
 - ์ ์: ์ง๋ฌธ๊ณผ ๋ต๋ณ์ด ๋ชจ๋ ์์ด์ผ ํ์ (
 &&์ฌ์ฉ)// ์ ์ํ๋ ๋ณ๊ฒฝ if (!review.answer.isBlank() && !review.question.isBlank()) { // show content }
        
          
                ...re/post-review/src/main/java/team/retum/post/review/navigation/PostExpectReviewNavigation.kt
          
            Show resolved
            Hide resolved
        
              
          
                feature/post-review/src/main/java/team/retum/post/review/ui/PostNextReviewScreen.kt
          
            Show resolved
            Hide resolved
        
              
          
                feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewCompleteScreen.kt
          
            Show resolved
            Hide resolved
        
              
          
                feature/review/src/main/java/team/retum/review/viewmodel/ReviewDetailsViewModel.kt
          
            Show resolved
            Hide resolved
        
              
          
                feature/review/src/main/java/team/retum/review/viewmodel/ReviewDetailsViewModel.kt
          
            Show resolved
            Hide resolved
        
      | companion object { | ||
| var code: Long? = null | ||
| var year: Int? = null | ||
| var interviewType: InterviewType? = null | ||
| var location: InterviewLocation? = null | ||
| } | 
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.
companion object์ mutable static state๋ฅผ ์ ๊ฑฐํ์ธ์.
companion object์ var๋ก ์ ์ธ๋ ํํฐ ์ํ๋ ์ฌ๋ฌ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํฉ๋๋ค:
- ViewModel ์ธ์คํด์ค ๊ฐ ์ํ ๊ณต์ ๋ก ์ธํ ์๊ธฐ์น ์์ ๋์
 - ๋ฉ๋ชจ๋ฆฌ ๋์ ์ํ (์ ์  ์ฐธ์กฐ๊ฐ ๊ณ์ ์ ์ง)
 - ๋จ์ ํ ์คํธ ๋ถ๊ฐ๋ฅ (ํ ์คํธ ๊ฐ ๊ฒฉ๋ฆฌ ๋ถ๊ฐ)
 ReviewsFilterState์ ๋์ผํ ์์ฑ์ด ์ด๋ฏธ ์กด์ฌํ์ฌ ์ค๋ณต
๋ชจ๋  ํํฐ ์ํ๋ ReviewsFilterState ์ธ์คํด์ค๋ฅผ ํตํด ๊ด๋ฆฌ๋์ด์ผ ํฉ๋๋ค.
๋ค์ diff๋ฅผ ์ ์ฉํ์ฌ companion object๋ฅผ ์ ๊ฑฐํ์ธ์:
-    companion object {
-        var code: Long? = null
-        var year: Int? = null
-        var interviewType: InterviewType? = null
-        var location: InterviewLocation? = null
-    }
-
     init {Committable suggestion skipped: line range outside the PR's diff.
๐ค Prompt for AI Agents
In
feature/review/src/main/java/team/retum/review/viewmodel/ReviewFilterViewModel.kt
around lines 22 to 27, remove the companion object that defines mutable static
vars (code, year, interviewType, location) and stop using static state; instead,
add those properties to and manage them via the existing ReviewsFilterState
instance held by the ViewModel (initialize/update/read from the state object,
expose changes via LiveData/StateFlow as appropriate), eliminate any references
to ReviewFilterViewModel.Companion.* across the codebase, and adjust
constructors/usage so each ViewModel instance uses its own ReviewsFilterState to
avoid shared mutable static state.
๊ฐ์
https://drive.google.com/file/d/1kPvDZ2Ta0tqk69P0ZkUZwY8VD3ph81UC/view?usp=share_link
๋ฉด์  ํ๊ธฐ ์์ฑ ํ๋ก์ฐ ์์์ ๋๋ค
์ฉ๋ ์ ํ์ผ๋ก ๊ตฌ๊ธ ๋๋ผ์ด๋ธ๋ก ์ฌ๋ฆฝ๋๋ค
์์ ๋ด์ฉ
ํ ๋ง
Summary by CodeRabbit
๋ฆด๋ฆฌ์ค ๋ ธํธ
์๋ก์ด ๊ธฐ๋ฅ
๊ฐ์ ์ฌํญ