Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
32af711
feat: BaseViewModel 도입 및 MVI 패턴 기반 리팩토링
HamBeomJoon Apr 3, 2026
b33b91f
feat: 홈 화면 기본 UI 구현 및 Splash 피처 리팩토링
HamBeomJoon Apr 3, 2026
11fbc0a
style: PrezelTabs 크기 옵션 명칭 변경 및 스타일 로직 수정
HamBeomJoon Apr 3, 2026
0d4f1c4
feat: 홈 화면 내 발표 목록 표시 방식 개선 및 탭 시스템 도입
HamBeomJoon Apr 3, 2026
2c47826
refactor: 홈 화면 UI 개선 및 카테고리 모델 구조 변경
HamBeomJoon Apr 3, 2026
e6f4233
feat: 홈 화면 UI 구조 개선 및 상태 관리 로직 리팩터링
HamBeomJoon Apr 3, 2026
667558a
feat: 디자인 시스템 섹션 타이틀용 일러스트레이션 에셋 추가
HamBeomJoon Apr 5, 2026
a43a45a
feat: 홈 화면 배경 이미지 적용 및 UI 컴포넌트 리팩터링
HamBeomJoon Apr 5, 2026
fedec91
feat: HomeViewModel 데이터 로드 로직 구현 및 HomeUiState 생성 함수 추가
HamBeomJoon Apr 5, 2026
77b793c
build: detekt JVM 타겟 설정 추가 및 코드 정리
HamBeomJoon Apr 5, 2026
50c3a91
feat: 홈 화면 바텀 시트 구조 설계 및 데이터 페칭 로직 추가
HamBeomJoon Apr 5, 2026
b515230
feat: 홈 화면 문자열 리소스 분리 및 적용
HamBeomJoon Apr 5, 2026
81e45e4
Merge remote-tracking branch 'origin/develop' into feat/#88-home-tabs
HamBeomJoon Apr 5, 2026
1d198f7
feat: home feature 내 카테고리 라벨 문자열 리소스화 및 다국어 지원 준비
HamBeomJoon Apr 6, 2026
7f9b70d
fix: 홈 화면 프레젠테이션 D-Day 표시 로직 개선
HamBeomJoon Apr 6, 2026
1e1323e
feat: HomeScreen 발표 상태(D-Day)에 따른 분기 로직 및 피드백 작성 UI 추가
HamBeomJoon Apr 6, 2026
a678a1d
refactor: 홈 화면 내 발표 상태에 따른 액션 UI 로직 리팩토링
HamBeomJoon Apr 6, 2026
0d48cc8
refactor: PrezelTabs 및 HomeUiEffect 코드 정리
HamBeomJoon Apr 6, 2026
aa20638
refactor: home feature의 홈 화면 액션 처리 로직을 개선하고 피드백 작성 기능을 추가했습니다.
HamBeomJoon Apr 6, 2026
14d0288
Merge remote-tracking branch 'origin/develop' into feat/#88-home-tabs
HamBeomJoon Apr 9, 2026
7a04d0e
refactor: HomeScreen UI 수정 및 PrezelChip 설정 방식 변경
HamBeomJoon Apr 9, 2026
1c27ffc
refactor: HomeScreen 레이아웃 구조 개선 및 홈 피처 전용 리소스 이동
HamBeomJoon Apr 9, 2026
211003d
refactor: 홈 화면 액션 처리 로직 리팩터링
HamBeomJoon Apr 10, 2026
1a9665f
feat: core:model 모듈 추가 및 카테고리 로직 개선
HamBeomJoon Apr 10, 2026
0d2189c
refactor: 홈 화면의 발표 카드 UI 개선 및 PresentationUiModel 리팩터링
HamBeomJoon Apr 10, 2026
bc68ea0
build: 프로젝트 구조 설정 및 플러그인 정리
HamBeomJoon Apr 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions Prezel/.editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,7 @@ ktlint_standard_backing-property-naming = disabled
ktlint_standard_multiline-expression-wrapping = disabled
ktlint_standard_function-signature = enabled
ktlint_function_signature_rule_force_multiline_when_parameter_count_greater_or_equal_than = 2

# Keep @Inject constructor on the same line (ktlint #2138)
# Related ktlint issue: https://github.com/pinterest/ktlint/issues/2138
ktlint_standard_annotation = disabled
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,14 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import kotlin.math.abs

enum class PrezelTabSize { Small, Regular }
enum class PrezelTabSize { REGULAR, MEDIUM }

@Composable
fun PrezelTabs(
tabs: ImmutableList<String>,
pagerState: PagerState,
modifier: Modifier = Modifier,
size: PrezelTabSize = PrezelTabSize.Regular,
size: PrezelTabSize = PrezelTabSize.REGULAR,
userScrollEnabled: Boolean = true,
content: @Composable (pageIndex: Int) -> Unit,
) {
Expand Down Expand Up @@ -109,11 +109,11 @@ private fun PrezelTabContent(
Tab(
selected = selected,
onClick = onClick,
modifier = Modifier.height(if (size == PrezelTabSize.Small) 36.dp else 48.dp),
modifier = Modifier.height(if (size == PrezelTabSize.REGULAR) 36.dp else 48.dp),
text = {
Text(
text = label,
style = if (size == PrezelTabSize.Small) PrezelTextStyles.Body3Medium.toTextStyle() else PrezelTextStyles.Body2Bold.toTextStyle(),
style = if (size == PrezelTabSize.REGULAR) PrezelTextStyles.Body3Medium.toTextStyle() else PrezelTextStyles.Body2Bold.toTextStyle(),
)
},
selectedContentColor = PrezelTheme.colors.solidBlack,
Expand Down Expand Up @@ -165,7 +165,7 @@ private fun PrezelMediumTabPreview() {
PrezelTabs(
tabs = tabs,
pagerState = pagerState,
size = PrezelTabSize.Regular,
size = PrezelTabSize.MEDIUM,
modifier = Modifier,
) { page ->
Box(
Expand All @@ -180,7 +180,7 @@ private fun PrezelMediumTabPreview() {

@BasicPreview
@Composable
private fun PrezelSmallTabPreview() {
private fun PrezelRegularTabPreview() {
val tabs = persistentListOf("Label1", "Label2")
val pagerState = rememberPagerState(initialPage = 0) { tabs.size }

Expand All @@ -190,7 +190,7 @@ private fun PrezelSmallTabPreview() {
PrezelTabs(
tabs = tabs,
pagerState = pagerState,
size = PrezelTabSize.Small,
size = PrezelTabSize.REGULAR,
) { page ->
Box(
modifier = Modifier.fillMaxSize(),
Expand Down
1 change: 1 addition & 0 deletions Prezel/core/model/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/build
3 changes: 3 additions & 0 deletions Prezel/core/model/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
plugins {
alias(libs.plugins.prezel.jvm.library)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.team.prezel.core.model

enum class Category {
PERSUASION,
EVENT,
EDUCATION,
REPORT,
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.team.prezel.core.ui

import androidx.compose.runtime.Immutable
import androidx.lifecycle.ViewModel
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.receiveAsFlow
import kotlinx.coroutines.flow.update

@Immutable
interface UiState

interface UiIntent

interface UiEffect

abstract class BaseViewModel<STATE : UiState, INTENT : UiIntent, EFFECT : UiEffect>(
initialState: STATE,
) : ViewModel() {
private val _uiState = MutableStateFlow(initialState)
val uiState: StateFlow<STATE> = _uiState

private val _uiEffect = Channel<EFFECT>()
val uiEffect: Flow<EFFECT> = _uiEffect.receiveAsFlow()

protected val currentState: STATE
get() = uiState.value

protected fun updateState(reducer: STATE.() -> STATE) {
_uiState.update(reducer)
}

protected suspend fun sendEffect(effect: EFFECT) {
_uiEffect.send(effect)
}

abstract fun onIntent(intent: INTENT)
}
4 changes: 4 additions & 0 deletions Prezel/feature/home/impl/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,9 @@ android {
}

dependencies {
implementation(projects.coreModel)
implementation(projects.featureHomeApi)

implementation(libs.kotlinx.collections.immutable)
implementation(libs.kotlinx.datetime)
}
Loading