Skip to content

[Feat/#56] 분철 내역 뷰 UI 구현#58

Merged
sonyerim merged 9 commits intodevelopfrom
feat/#56-history-list-ui
Jan 20, 2026
Merged

[Feat/#56] 분철 내역 뷰 UI 구현#58
sonyerim merged 9 commits intodevelopfrom
feat/#56-history-list-ui

Conversation

@sonyerim
Copy link
Copy Markdown
Contributor

@sonyerim sonyerim commented Jan 18, 2026

Related issue 🛠️

Work Description ✏️

  • history list UI

Screenshot 📸

스크린샷 1 스크린샷 2
Screen_recording_20260118_153932.mp4

Uncompleted Tasks 😅

  • N/A

To Reviewers 📢

Summary by CodeRabbit

  • 새로운 기능

    • 모집자/참여자 모드 전환 가능 이력 목록 화면 추가
    • 진행 중/종료 탭으로 항목 구분 조회 및 카드 선택 시 상세로 이동
  • 개선 사항

    • 모드·탭별 카운트 표시 및 빈 상태 문구 개선
    • 뒤로가기 및 화면 전환 흐름 안정화, UI 상태 기반 렌더링 적용
  • 추가

    • 이력 목록용 데이터 타입 및 지역화(빈 상태 문자열) 추가

✏️ Tip: You can customize this high-level summary in your review settings.

@sonyerim sonyerim self-assigned this Jan 18, 2026
@sonyerim sonyerim added 🌟 Feat 새로운 기능 구현 🔎 UI UI 작업 💕 예림 labels Jan 18, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Jan 18, 2026

📝 Walkthrough

Walkthrough

History 목록 화면을 새 UI 모델/뷰모델 기반 아키텍처로 재구성했습니다. 공개 진입점이 HistoryListRoute로 변경되고, 내부에 상태 기반 렌더링을 수행하는 프라이빗 HistoryListScreen이 추가되었으며 네비게이션 콜백과 ViewModel 사이드이펙트가 연결됩니다.

Changes

Cohort / File(s) 변경 요약
UI Route / Screen
app/src/main/java/com/poti/android/presentation/history/list/HistoryListScreen.kt
공개 API를 HistoryListRoute(...)로 변경. ViewModel(hiltViewModel) 연결, 사이드이펙트 수집(NavigateBack, NavigateToDetail) 및 네비게이션 콜백 호출 로직 추가. 프라이빗 HistoryListScreen(uiState, ...)로 UI 렌더링 분리. HistoryMode enum 추가.
UI 모델 / Contracts
app/src/main/java/com/poti/android/presentation/history/list/model/Contracts.kt
HistoryListUiState, HistoryListUiIntent, HistoryListUiEffect 추가 — 상태·인텐트·이펙트 정의 및 HistoryItem→UI 매핑 확장함수 추가(타이틀/빈 텍스트/아이템/카운트 파생 포함).
ViewModel
app/src/main/java/com/poti/android/presentation/history/list/HistoryListViewModel.kt
ViewModelBaseViewModel<HistoryListUiState,HistoryListUiIntent,HistoryListUiEffect>로 마이그레이션. processIntent 구현, init에서 데이터 로드 트리거, fetchJob으로 로드 관리 및 더미 콘텐츠 생성 로직 추가.
도메인 모델
app/src/main/java/com/poti/android/domain/model/history/HistoryList.kt
HistoryListContent, HistoryItem 도메인 데이터 클래스 추가(ongoingCount, endedCount, items 등).
도메인 타입
app/src/main/java/com/poti/android/domain/type/HistoryType.kt
HistoryStage, HistoryStatus enum 추가(도메인 상태/단계 정의).
네비게이션
app/src/main/java/com/poti/android/presentation/history/navigation/HistoryNavigation.kt
app/src/main/java/com/poti/android/presentation/main/MainNavHost.kt
historyNavGraph 시그니처에 navController 추가. HistoryListRoute 호출 시 onPopBackStack, onNavigateToRecruiterDetail, onNavigateToParticipantDetail 콜백 전달로 네비게이션 와이어링 변경.
리소스
app/src/main/res/values/strings.xml
히스토리 빈 상태용 문자열 리소스 4개(history_empty_recruit_ongoing, history_empty_recruit_ended, history_empty_participation_ongoing, history_empty_participation_ended) 추가 및 일부 문자열 항목 순서 변경.

Sequence Diagram(s)

sequenceDiagram
    participant UI as HistoryListRoute
    participant VM as HistoryListViewModel
    participant State as HistoryListUiState
    participant Nav as NavController

    UI->>VM: ViewModel 획득(hiltViewModel)
    VM->>VM: init -> loadUserHistoryList()
    VM->>State: historyListLoadState 변경 (Loading -> Success)
    State-->>UI: uiState 수집(collectAsState)

    UI->>VM: processIntent(OnTabSelected / OnSwitchModeClick / OnCardClick / OnBackClick)
    VM->>VM: 상태 변경(selectedTab/mode) 및 데이터 재로드
    VM->>UI: 사이드이펙트 emit(NavigateToDetail(id) / NavigateBack)

    UI->>Nav: onNavigateToRecruiterDetail() / onNavigateToParticipantDetail() / onPopBackStack()
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested reviewers

  • cmj7271
  • doyeon0307
  • jyvnee
🚥 Pre-merge checks | ✅ 2 | ❌ 3
❌ Failed checks (1 warning, 2 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Description check ❓ Inconclusive PR 설명이 템플릿 구조를 따르고 있으나, '분철 내역 뷰 UI'라는 작업 내용이 상당히 간략하며 구현된 구체적인 내용이 부족합니다. 작업 내용 섹션에서 도입된 주요 컴포넌트(HistoryMode, HistoryListViewModel, UI 계약)에 대한 간단한 설명을 추가하여 변경사항의 범위를 명확히 해주세요.
Out of Scope Changes check ❓ Inconclusive 기본적으로 모든 변경사항이 UI 구현 범위 내에 있으나, domain 계층의 HistoryType.kt 추가와 BaseViewModel 아키텍처 변경이 UI 구현 목표 범위를 넘어갈 수 있습니다. domain 계층 변경과 BaseViewModel 도입이 현재 PR의 범위에 포함되어야 하는지, 아니면 별도의 리팩토링 작업으로 분리해야 하는지 명확히 해주세요.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목이 linked issue #56의 핵심 목표인 '분철 내역 뷰 UI 구현'을 명확하게 반영하고 있으며, 변경사항의 주요 내용을 잘 요약하고 있습니다.
Linked Issues check ✅ Passed PR의 코드 변경사항이 linked issue #56의 '분철 내역 뷰 UI 구현' 요구사항을 충족하고 있으며, 스크린샷으로도 UI 구현이 완료되었음을 보여주고 있습니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In
`@app/src/main/java/com/poti/android/presentation/history/list/HistoryListScreen.kt`:
- Around line 56-62: The NavigateToDetail effect handler is not passing the
selected item's id so detail screens may mismatch; update the
HistoryListUiEffect.NavigateToDetail handling to forward effect.id to the
navigation callbacks (or adjust the callbacks to accept an id) — specifically
modify the branch that checks uiState.mode to call
onNavigateToRecruiterDetail(effect.id) when mode == HistoryMode.RECRUIT and
onNavigateToParticipantDetail(effect.id) otherwise, ensuring the
NavigateToDetail effect's id is included in the route or callback signature used
by the detail screens.
🧹 Nitpick comments (2)
app/src/main/java/com/poti/android/presentation/history/list/HistoryListViewModel.kt (1)

54-94: 빠른 탭/모드 전환 시 이전 로드 결과가 최신 상태를 덮을 수 있습니다.
Line 54-94: loadHistory()가 중복 실행돼 결과 순서가 뒤바뀔 여지가 있습니다. API 연동 시 특히 문제가 됩니다.

🔧 권장 개선안 (이전 작업 취소)
+import kotlinx.coroutines.Job
 import kotlinx.coroutines.launch
@@
 class HistoryListViewModel `@Inject` constructor() : BaseViewModel<HistoryListUiState, HistoryListUiIntent, HistoryListUiEffect>(
@@
 ) {
+    private var loadJob: Job? = null
@@
     private fun loadHistory() {
-        viewModelScope.launch {
+        loadJob?.cancel()
+        loadJob = viewModelScope.launch {
             updateState { copy(isLoading = true) }
@@
-            val dummyItems = if (uiState.value.selectedTab == PotiHeaderTabType.ONGOING) {
+            val selectedTabSnapshot = uiState.value.selectedTab
+            val dummyItems = if (selectedTabSnapshot == PotiHeaderTabType.ONGOING) {
                 listOf(
                     HistoryItem(
app/src/main/java/com/poti/android/presentation/history/list/model/Contracts.kt (1)

11-27: Compose 안정성 향상을 위해 @Immutable 적용을 권장드립니다.
Line 11-27: HistoryListUiState, HistoryItem이 Compose 상태로 사용되므로 불변성을 명시하면 불필요한 리컴포지션을 줄일 수 있습니다. 리스트는 항상 새 인스턴스로 교체되는 전제가 필요합니다.

♻️ 제안 변경
+import androidx.compose.runtime.Immutable
@@
-data class HistoryListUiState(
+@Immutable
+data class HistoryListUiState(
@@
-data class HistoryItem(
+@Immutable
+data class HistoryItem(

코딩 가이드라인에 따라 제안드립니다.

Comment on lines +56 to +62
is HistoryListUiEffect.NavigateToDetail -> {
// TODO: [예림] effect.id 전달
if (uiState.mode == HistoryMode.RECRUIT) {
onNavigateToRecruiterDetail()
} else {
onNavigateToParticipantDetail()
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

상세 이동에 id가 전달되지 않아 항목 매칭이 깨질 수 있습니다.
Line 56-62: NavigateToDetailid가 네비게이션으로 사용되지 않습니다. 클릭한 카드와 상세 화면이 불일치할 수 있으니, 라우트에 id 파라미터를 추가해 전달하거나 id 자체를 제거해 일관성을 맞춰주세요.

🤖 Prompt for AI Agents
In
`@app/src/main/java/com/poti/android/presentation/history/list/HistoryListScreen.kt`
around lines 56 - 62, The NavigateToDetail effect handler is not passing the
selected item's id so detail screens may mismatch; update the
HistoryListUiEffect.NavigateToDetail handling to forward effect.id to the
navigation callbacks (or adjust the callbacks to accept an id) — specifically
modify the branch that checks uiState.mode to call
onNavigateToRecruiterDetail(effect.id) when mode == HistoryMode.RECRUIT and
onNavigateToParticipantDetail(effect.id) otherwise, ensuring the
NavigateToDetail effect's id is included in the route or callback signature used
by the detail screens.

Copy link
Copy Markdown
Contributor

@doyeon0307 doyeon0307 left a comment

Choose a reason for hiding this comment

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

고생띠니

Comment on lines +89 to +94
val titleRes = when (uiState.mode) {
HistoryMode.RECRUIT -> R.string.user_history_recruit
HistoryMode.PARTICIPATION -> R.string.user_history_participate
}

val emptyTextRes = when (uiState.mode) {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

p2: titleRes, emptyTextRes 변수는 Contracts.kt 내부에서 정의해주심 좋습니다!
이유는 스크린은 처리 완료된 텍스트를 보여주기만하고
모델/뷰모델에서 데이터 가공을 완료해 뷰에 넘겨주는 편이 역할 분리가 잘 되어서 구조적으로 좋아보입니다

data class HistoryListUiState(
    val isLoading: Boolean = false,
    val mode: HistoryMode = HistoryMode.RECRUIT,
    val selectedTab: PotiHeaderTabType = PotiHeaderTabType.ONGOING,
    val ongoingCount: Int = 0,
    val endedCount: Int = 0,
    val items: List<HistoryItem> = emptyList(),
) : UiState {
    val titleRes = when (mode) {
        HistoryMode.RECRUIT -> R.string.user_history_recruit
        HistoryMode.PARTICIPATION -> R.string.user_history_participate
    }

    val emptyTextRes = when (mode) {
        HistoryMode.RECRUIT -> {
            when (uiState.selectedTab) {
                PotiHeaderTabType.ONGOING -> R.string.history_empty_recruit_ongoing
                PotiHeaderTabType.ENDED -> R.string.history_empty_recruit_ended
            }
        }

        HistoryMode.PARTICIPATION -> {
            when (uiState.selectedTab) {
                PotiHeaderTabType.ONGOING -> R.string.history_empty_participation_ongoing
                PotiHeaderTabType.ENDED -> R.string.history_empty_participation_ended
            }
        }
    }

sealed interface HistoryListUiEffect : UiEffect {
data object NavigateBack : HistoryListUiEffect

data class SwitchMode(val isRecruitMode: Boolean) : HistoryListUiEffect
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

p1: SwitchMode는 UiEffect로 만들지 않아도 될 거 같아요

  • OnSwitchModeClick으로 uiState의 mode를 변경
    -> 스크린 타이틀에 반영 됨
    -> historyApi 호출 시에는 뷰모델 내에서 mode값 활용해 적절한 history get

현재 UiEffect로는 네비게이션 정도만 들어간다고 보심됩니다!

Comment on lines +24 to +38
val newMode = if (uiState.value.mode == HistoryMode.RECRUIT) {
HistoryMode.PARTICIPATION
} else {
HistoryMode.RECRUIT
}
updateState {
copy(
mode = newMode,
selectedTab = PotiHeaderTabType.ONGOING,
)
}
sendEffect(
HistoryListUiEffect.SwitchMode(newMode == HistoryMode.RECRUIT),
)
loadHistory()
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

p1: processIntent가 좀 길어져서
이 내용 hadleSwitchMode private 메소드 만들어 분리하면
코드 간결해지고 가독성 좋아질 것 같아용

Copy link
Copy Markdown
Contributor

@cmj7271 cmj7271 left a comment

Choose a reason for hiding this comment

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

고생 많았어요요요요


@Preview(showBackground = true)
@Composable
private fun HistoryListScreenPreview_Ongoing() {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

p3: 네이밍이 신기방기하다

Copy link
Copy Markdown
Contributor

@jyvnee jyvnee left a comment

Choose a reason for hiding this comment

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

이제 진짜 잘한다~

Comment on lines +51 to +52
private fun loadHistory() {
viewModelScope.launch {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2: 탭 빠르게 바꿀 경우 이전 작업이 있다면 취소하는게 낫지 않을까욤

Suggested change
private fun loadHistory() {
viewModelScope.launch {
fetchJob?.cancel()
fetchJob = viewModelScope.launch {
// 리스트 로드
}

근데 이거 머.. 나중에 서버 연결할 때 해도 됨

val selectedTab: PotiHeaderTabType = PotiHeaderTabType.ONGOING,
val ongoingCount: Int = 0,
val endedCount: Int = 0,
val items: List<HistoryItem> = emptyList(),
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P1: ImmutableList 사용해주면 조을 듯?? 그리고 ApiState로 감싸주면 isLoading 필요 없을 것 같아요

# Conflicts:
#	app/src/main/res/values/strings.xml
@github-actions
Copy link
Copy Markdown

github-actions bot commented Jan 19, 2026

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In `@app/src/main/java/com/poti/android/domain/model/history/HistoryList.kt`:
- Around line 3-18: Domain models HistoryListContent and HistoryItem currently
depend on presentation types ParticipantStateLabelStage and
ParticipantStateLabelStatus; introduce domain enums (e.g., ParticipantStage,
ParticipantStatus) in the domain layer and change HistoryListContent/HistoryItem
to use those domain enums instead of the presentation types, remove the
presentation imports, and update any callers to map domain enums to
Presentation's ParticipantStateLabelStage/ParticipantStateLabelStatus in the
Presentation layer (add mapping functions or extension functions that convert
ParticipantStage -> ParticipantStateLabelStage and ParticipantStatus ->
ParticipantStateLabelStatus) so the Domain no longer depends on Presentation.

In `@app/src/main/res/values/strings.xml`:
- Around line 123-126: The new empty-state strings use "진행 중" but the app
currently uses "진행중" elsewhere (e.g., user_history_ongoing); make the wording
consistent by updating the resources history_empty_recruit_ongoing and
history_empty_participation_ongoing to match the established form ("진행중" or "진행
중") used across the app, and ensure history_empty_recruit_ended and
history_empty_participation_ended follow the same spacing convention; update the
string values for the resource names mentioned to the chosen consistent form.
♻️ Duplicate comments (1)
app/src/main/java/com/poti/android/presentation/history/list/HistoryListScreen.kt (1)

43-61: 상세 이동에 id가 전달되지 않아 항목 매칭이 깨질 수 있어요.

NavigateToDetaileffect.id가 네비게이션 콜백에 반영되지 않아 상세 화면이 잘못 열릴 수 있습니다. 콜백 시그니처를 Long 파라미터를 받도록 변경하고 effect.id를 전달해주세요.

🐛 제안 수정
-fun HistoryListRoute(
-    onPopBackStack: () -> Unit,
-    onNavigateToRecruiterDetail: () -> Unit,
-    onNavigateToParticipantDetail: () -> Unit,
+fun HistoryListRoute(
+    onPopBackStack: () -> Unit,
+    onNavigateToRecruiterDetail: (Long) -> Unit,
+    onNavigateToParticipantDetail: (Long) -> Unit,
     modifier: Modifier = Modifier,
     viewModel: HistoryListViewModel = hiltViewModel(),
 ) {
@@
-            is HistoryListUiEffect.NavigateToDetail -> {
-                // TODO: [예림] effect.id 전달
-                if (uiState.mode == HistoryMode.RECRUIT) {
-                    onNavigateToRecruiterDetail()
-                } else {
-                    onNavigateToParticipantDetail()
-                }
-            }
+            is HistoryListUiEffect.NavigateToDetail -> {
+                if (uiState.mode == HistoryMode.RECRUIT) {
+                    onNavigateToRecruiterDetail(effect.id)
+                } else {
+                    onNavigateToParticipantDetail(effect.id)
+                }
+            }
         }
     }
🧹 Nitpick comments (3)
app/src/main/java/com/poti/android/presentation/history/list/HistoryListViewModel.kt (2)

70-109: createDummyContent는 외부에 노출할 필요가 없어 보입니다.

테스트나 외부 호출이 없다면 private로 좁혀 API surface를 줄이는 편이 안전합니다.

♻️ 제안 수정
-    fun createDummyContent(): HistoryListContent {
+    private fun createDummyContent(): HistoryListContent {

111-114: TODO(API 분기) 항목은 추적 이슈로 분리하는 것을 권장합니다.

나중에 잊히지 않도록 이슈로 옮기거나 TODO에 목적/기한을 보강해 주세요. 필요하시면 이 작업을 위한 이슈 템플릿/초안을 만들어 드릴게요.

app/src/main/java/com/poti/android/presentation/history/list/HistoryListScreen.kt (1)

117-124: 간격 값이 하드코딩되어 있어 디자인 시스템 토큰 사용을 권장합니다.

16.dp, 12.dp, 10.dp 같은 값은 Dimens/Theme의 spacing 토큰으로 치환하면 일관성과 유지보수성이 좋아집니다. 코딩 가이드라인에 따라, ...

Comment on lines +3 to +18
import com.poti.android.presentation.history.component.ParticipantStateLabelStage
import com.poti.android.presentation.history.component.ParticipantStateLabelStatus

data class HistoryListContent(
val ongoingCount: Int,
val endedCount: Int,
val items: List<HistoryItem>,
)

data class HistoryItem(
val id: Long,
val imageUrl: String?,
val artist: String,
val title: String,
val stage: ParticipantStateLabelStage,
val status: ParticipantStateLabelStatus,
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

도메인 레이어가 프레젠테이션 타입에 의존하고 있습니다.

HistoryListContent/HistoryItemcom.poti.android.presentation... 타입을 직접 참조하고 있어 Domain → Presentation 의존이 생깁니다. 도메인에는 순수한 상태/enum을 두고, UI 타입으로의 매핑은 Presentation 레이어에서 처리하는 방향으로 분리해주세요. 코딩 가이드라인에 따라, ...

🤖 Prompt for AI Agents
In `@app/src/main/java/com/poti/android/domain/model/history/HistoryList.kt`
around lines 3 - 18, Domain models HistoryListContent and HistoryItem currently
depend on presentation types ParticipantStateLabelStage and
ParticipantStateLabelStatus; introduce domain enums (e.g., ParticipantStage,
ParticipantStatus) in the domain layer and change HistoryListContent/HistoryItem
to use those domain enums instead of the presentation types, remove the
presentation imports, and update any callers to map domain enums to
Presentation's ParticipantStateLabelStage/ParticipantStateLabelStatus in the
Presentation layer (add mapping functions or extension functions that convert
ParticipantStage -> ParticipantStateLabelStage and ParticipantStatus ->
ParticipantStateLabelStatus) so the Domain no longer depends on Presentation.

Comment on lines +123 to +126
<string name="history_empty_recruit_ongoing">진행 중인 모집 내역이 없어요</string>
<string name="history_empty_recruit_ended">지난 모집 내역이 없어요</string>
<string name="history_empty_participation_ongoing">진행 중인 참여 내역이 없어요</string>
<string name="history_empty_participation_ended">지난 참여 내역이 없어요</string>
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

진행 상태 표기 띄어쓰기 일관성 확인해주세요.

기존 문자열은 "진행중"을 사용하고 있는데(예: user_history_ongoing), 신규 빈 상태 문구는 "진행 중"으로 표기가 달라요. UI에서 같은 상태가 서로 다르게 보여 혼란을 줄 수 있으니 하나로 통일하는 편이 좋겠습니다.

🤖 Prompt for AI Agents
In `@app/src/main/res/values/strings.xml` around lines 123 - 126, The new
empty-state strings use "진행 중" but the app currently uses "진행중" elsewhere (e.g.,
user_history_ongoing); make the wording consistent by updating the resources
history_empty_recruit_ongoing and history_empty_participation_ongoing to match
the established form ("진행중" or "진행 중") used across the app, and ensure
history_empty_recruit_ended and history_empty_participation_ended follow the
same spacing convention; update the string values for the resource names
mentioned to the chosen consistent form.

Copy link
Copy Markdown
Contributor

@jyvnee jyvnee left a comment

Choose a reason for hiding this comment

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

수정 한 번만 해죠!!

Comment on lines +17 to +18
val stage: ParticipantStateLabelStage,
val status: ParticipantStateLabelStatus,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P1: 도메인 레이어에서는 프레젠테이션 레이어를 의존하면 안됩니다!!!! 타입 설정이 필요하면 도메인 레이어에 있는 타입 패키지 안에 넣어주세용!!

Comment on lines +27 to +39
val newMode = if (uiState.value.mode == HistoryMode.RECRUIT) {
HistoryMode.PARTICIPATION
} else {
HistoryMode.RECRUIT
}
updateState {
copy(
mode = newMode,
selectedTab = PotiHeaderTabType.ONGOING,
)
}
loadUserHistoryList()
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P3: 처리해야할 내용이 많으면 함수로 따로 빼는게 낫지 않을까용

Copy link
Copy Markdown
Contributor

@jyvnee jyvnee left a comment

Choose a reason for hiding this comment

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

머지하장

Copy link
Copy Markdown
Contributor

@doyeon0307 doyeon0307 left a comment

Choose a reason for hiding this comment

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

고생티티

@sonyerim sonyerim merged commit 6048b38 into develop Jan 20, 2026
2 checks passed
@github-project-automation github-project-automation bot moved this from To-do to Done in POTI-ANDROID Jan 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🌟 Feat 새로운 기능 구현 💕 예림 🔎 UI UI 작업

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

[Feat] 분철 내역 뷰 UI 구현

4 participants