Skip to content

Commit

Permalink
[feat] #20 코드리뷰 반영
Browse files Browse the repository at this point in the history
  • Loading branch information
kamja0510 committed Jan 16, 2025
1 parent e90f21f commit 4d8d22b
Show file tree
Hide file tree
Showing 7 changed files with 64 additions and 61 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,28 +16,28 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.android.bbangzip.presentation.model.Date
import org.android.bbangzip.presentation.util.constant.DateConstant
import org.android.bbangzip.presentation.util.constant.DateConstants
import java.time.YearMonth

@Composable
fun BbangZipDatePicker(
onConfirm: (Date) -> Unit = {},
currentDate: Date = Date(DateConstant.YEAR_OF_TODAY.toString(), "1", "1"),
currentDate: Date = Date(DateConstants.YEAR_OF_TODAY.toString(), "1", "1"),
) {
Row(
modifier = Modifier.fillMaxWidth(),
) {
val years = DateConstant.YEARS_LIST
val years = DateConstants.YEARS_LIST
val yearPickerState by remember { mutableStateOf("") }
val startYear = currentDate.year.toInt() - DateConstant.YEAR_OF_TODAY
val startYear = currentDate.year.toInt() - DateConstants.YEAR_OF_TODAY

val months = DateConstant.MONTHS_LIST
val months = DateConstants.MONTHS_LIST
val monthsPickerState by remember { mutableStateOf("") }
val startMonth = currentDate.month.toInt() - 1

val days =
remember(yearPickerState, monthsPickerState) {
val year = yearPickerState.filter { it.isDigit() }.toIntOrNull() ?: DateConstant.YEAR_OF_TODAY
val year = yearPickerState.filter { it.isDigit() }.toIntOrNull() ?: DateConstants.YEAR_OF_TODAY
val month = monthsPickerState.filter { it.isDigit() }.toIntOrNull() ?: 1
(1..getDaysInMonth(year, month)).map { it.toString() + "" }
}
Expand All @@ -58,28 +58,22 @@ fun BbangZipDatePicker(
}

// 3개 picker에 weight 부여해서 대충 피그마와 비슷하게 동적으로 되게 구현해봤는데 어떤가요..
Picker(
state = yearPickerState,
BbangZipPicker(
items = years,
modifier = Modifier.weight(5f),
startIndex = startYear,
isCircular = false,
)

Picker(
state = monthsPickerState,
BbangZipPicker(
items = months,
modifier = Modifier.weight(3f),
startIndex = startMonth,
isCircular = false,
)

Picker(
state = daysPickerState,
BbangZipPicker(
items = days,
modifier = Modifier.weight(3f),
startIndex = startDay,
isCircular = false,
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.runtime.snapshotFlow
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
Expand All @@ -37,20 +38,21 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.map
import org.android.bbangzip.presentation.util.graphic.pixelsToDp
import org.android.bbangzip.presentation.util.modifier.fadingEdge
import org.android.bbangzip.ui.theme.BBANGZIPTheme
import org.android.bbangzip.ui.theme.BbangZipTheme

// isCircular : 무한 스크롤 여부
@Composable
fun Picker(
fun BbangZipPicker(
items: List<String>,
state: String,
onItemChanged: (String) -> Unit = {},
modifier: Modifier = Modifier,
onItemChanged: (String) -> Unit = {},
startIndex: Int = 0,
visibleItemsCount: Int = 5,
textModifier: Modifier = Modifier,
isCircular: Boolean = true,
isCircular: Boolean = false,
) {
val pickerItems: List<String> =
if (isCircular) {
Expand Down Expand Up @@ -88,7 +90,7 @@ fun Picker(
val flingBehavior = rememberSnapFlingBehavior(lazyListState = listState)

val itemHeightPixels = remember { mutableIntStateOf(0) }
val itemHeightDp = pixelsToDp(itemHeightPixels.intValue)
val itemHeightDp = itemHeightPixels.intValue.pixelsToDp()

val fadingEdgeGradient =
remember {
Expand Down Expand Up @@ -149,17 +151,6 @@ fun Picker(
}
}

private fun Modifier.fadingEdge(brush: Brush) =
this
.graphicsLayer(compositingStrategy = CompositingStrategy.Offscreen)
.drawWithContent {
drawContent()
drawRect(brush = brush, blendMode = BlendMode.DstIn)
}

@Composable
private fun pixelsToDp(pixels: Int) = with(LocalDensity.current) { pixels.toDp() }

@Composable
@Preview(showBackground = true)
fun PickerPreview() {
Expand All @@ -170,25 +161,25 @@ fun PickerPreview() {
modifier = Modifier.fillMaxSize(),
) {
val values = remember { (1..99).map { it.toString() } }
val valuesPickerState by remember { mutableStateOf("") }
var valuesPickerState by remember { mutableStateOf("") }

val units = remember { listOf("seconds", "minutes", "hours") }
val unitsPickerState by remember { mutableStateOf("") }
var unitsPickerState by remember { mutableStateOf("") }

Text(text = "Example Picker", modifier = Modifier.padding(top = 16.dp))
Row(modifier = Modifier.fillMaxWidth()) {
Picker(
state = valuesPickerState,
BbangZipPicker(
items = values,
visibleItemsCount = 5,
modifier = Modifier.weight(0.3f),
isCircular = false,
onItemChanged = { valuesPickerState = it },
visibleItemsCount = 5,
)

Picker(
state = unitsPickerState,
BbangZipPicker(
items = units,
visibleItemsCount = 5,
modifier = Modifier.weight(0.7f),
onItemChanged = { unitsPickerState = it },
visibleItemsCount = 5,
isCircular = true,
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,49 +17,45 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.android.bbangzip.presentation.model.Semester
import org.android.bbangzip.presentation.type.SemesterType
import org.android.bbangzip.presentation.util.constant.DateConstant
import org.android.bbangzip.presentation.util.constant.DateConstants

@Composable
fun BbangZipSemesterPicker(
onConfirm: (Semester) -> Unit = {},
currentSemester: Semester = Semester(DateConstant.YEAR_OF_TODAY.toString(), "1학기"),
currentSemester: Semester = Semester(DateConstants.YEAR_OF_TODAY.toString(), SemesterType.FIRST),
) {
Row(
modifier = Modifier.fillMaxWidth(),
) {
val years = DateConstant.YEARS_LIST
val yearPickerState = remember { mutableStateOf("") }
val startYear = currentSemester.year.toInt() - DateConstant.YEAR_OF_TODAY
val years = DateConstants.YEARS_LIST
val yearPickerState by remember { mutableStateOf("") }
val startYear = currentSemester.year.toInt() - DateConstants.YEAR_OF_TODAY

val semesters = SemesterType.entries.map { entry -> entry.text }
val semesterPickerState = remember { mutableStateOf("") }
val startSemester = SemesterType.entries.find { it.text == currentSemester.semester }?.ordinal
val semesterPickerState by remember { mutableStateOf("") }
val startSemester = SemesterType.entries.find { it == currentSemester.semester }?.ordinal

LaunchedEffect(yearPickerState.value, semesterPickerState.value) {
val year = yearPickerState.value.filter { it.isDigit() }
val semester = semesterPickerState.value
LaunchedEffect(yearPickerState, semesterPickerState) {
val year = yearPickerState.filter { it.isDigit() }
val semester = SemesterType.entries.find { it.text == semesterPickerState }
onConfirm(
Semester(
year = year,
semester = semester,
semester = semester?:SemesterType.FIRST,
),
)
}

Picker(
state = yearPickerState,
BbangZipPicker(
items = years,
modifier = Modifier.weight(5f),
startIndex = startYear,
isCircular = false,
)

Picker(
state = semesterPickerState,
BbangZipPicker(
items = semesters,
modifier = Modifier.weight(4f),
startIndex = startSemester ?: 0,
isCircular = false,
)
}
}
Expand All @@ -79,7 +75,7 @@ fun BbangZipSemesterPickerPreview() {
onConfirm = {
selectedSemester = it
},
currentSemester = Semester("2025", "2학기"),
currentSemester = Semester("2025", SemesterType.SECOND),
)
Text("Selected Semester: ${selectedSemester?.year}${selectedSemester?.semester}")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@ package org.android.bbangzip.presentation.model

import android.os.Parcelable
import kotlinx.parcelize.Parcelize
import org.android.bbangzip.presentation.type.SemesterType

@Parcelize
data class Semester(
val year: String,
val semester: String,
val semester: SemesterType,
) : Parcelable
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@ package org.android.bbangzip.presentation.util.constant

import java.time.LocalDate

object DateConstant {
object DateConstants {

val YEAR_OF_TODAY = LocalDate.now().year
val YEARS_LIST = (YEAR_OF_TODAY..2099).map { it.toString() + "" }
val YEARS_LIST = (YEAR_OF_TODAY..2028).map { it.toString() + "" }
val MONTHS_LIST = (1..12).map { it.toString() + "" }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.android.bbangzip.presentation.util.graphic

import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalDensity

@Composable
fun Int.pixelsToDp() = LocalDensity.current.run { this@pixelsToDp.toDp() }
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,18 @@ import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.composed
import androidx.compose.ui.draw.drawBehind
import androidx.compose.ui.draw.drawWithContent
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.BlendMode
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.CompositingStrategy
import androidx.compose.ui.graphics.Paint
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.graphics.compositeOver
import androidx.compose.ui.graphics.drawOutline
import androidx.compose.ui.graphics.drawscope.drawIntoCanvas
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.semantics.Role
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
Expand Down Expand Up @@ -113,3 +118,11 @@ fun Modifier.applyShadows(
)
}
}

fun Modifier.fadingEdge(brush: Brush) =
this
.graphicsLayer(compositingStrategy = CompositingStrategy.Offscreen)
.drawWithContent {
drawContent()
drawRect(brush = brush, blendMode = BlendMode.DstIn)
}

0 comments on commit 4d8d22b

Please sign in to comment.