Skip to content

Commit

Permalink
Add Filter Feature
Browse files Browse the repository at this point in the history
  • Loading branch information
mtkw0127 committed Jul 16, 2023
1 parent f759753 commit 24978d8
Show file tree
Hide file tree
Showing 7 changed files with 204 additions and 12 deletions.
1 change: 1 addition & 0 deletions feature/sessions/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ dependencies {
implementation(libs.androidxActivityActivityCompose)
implementation(libs.composeCoil)
implementation(libs.composeConstraintLayout)
implementation(libs.composeMaterialIcon)
androidTestImplementation(libs.composeUiTestJunit4)
debugImplementation(libs.composeUiTooling)
debugImplementation(libs.composeUiTestManifest)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import androidx.compose.ui.platform.testTag
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavController
import io.github.droidkaigi.confsched2023.model.DroidKaigi2023Day
import io.github.droidkaigi.confsched2023.model.Timetable
import io.github.droidkaigi.confsched2023.sessions.component.BookMarkTopArea
import io.github.droidkaigi.confsched2023.sessions.section.BookMarkSheet
Expand All @@ -27,6 +28,7 @@ sealed interface BookMarkScreenUiState {

data class ListBookMark(
val bookMarkedTimeline: Timetable,
val currentDayFilter: List<DroidKaigi2023Day>,
) : BookMarkScreenUiState
}

Expand All @@ -38,6 +40,10 @@ fun BookMarkScreen(

BookMarkScreen(
uiState = uiState,
onClickAllFilterChip = { viewModel.onClickAllFilterChip() },
onClickDayFirstChip = { viewModel.onClickDayFirstChip() },
onClickDaySecondChip = { viewModel.onClickDaySecondChip() },
onClickDayThirdChip = { viewModel.onClickDayThirdChip() },
)
}

Expand All @@ -46,6 +52,10 @@ const val BookScreenTestTag = "TimetableScreenTestTag"
@Composable
private fun BookMarkScreen(
uiState: BookMarkScreenUiState,
onClickAllFilterChip: () -> Unit,
onClickDayFirstChip: () -> Unit,
onClickDaySecondChip: () -> Unit,
onClickDayThirdChip: () -> Unit,
) {
Scaffold(
modifier = Modifier.testTag(BookScreenTestTag),
Expand All @@ -57,6 +67,10 @@ private fun BookMarkScreen(
) { padding ->
BookMarkSheet(
modifier = Modifier.padding(padding),
onClickAllFilterChip = onClickAllFilterChip,
onClickDayFirstChip = onClickDayFirstChip,
onClickDaySecondChip = onClickDaySecondChip,
onClickDayThirdChip = onClickDayThirdChip,
uiState = uiState,
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,18 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import io.github.droidkaigi.confsched2023.designsystem.strings.AppStrings
import io.github.droidkaigi.confsched2023.model.DroidKaigi2023Day
import io.github.droidkaigi.confsched2023.model.Filters
import io.github.droidkaigi.confsched2023.model.SessionsRepository
import io.github.droidkaigi.confsched2023.model.Timetable
import io.github.droidkaigi.confsched2023.ui.UserMessageStateHolder
import io.github.droidkaigi.confsched2023.ui.buildUiState
import io.github.droidkaigi.confsched2023.ui.handleErrorAndRetry
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.update
import javax.inject.Inject

@HiltViewModel
Expand All @@ -33,12 +36,46 @@ class BookMarkScreenViewModel @Inject constructor(
initialValue = Timetable(),
)

val uiState: StateFlow<BookMarkScreenUiState> = buildUiState(sessionsStateFlow) {
val bookMarkedTimetable = it.filtered(Filters(filterFavorite = false))
if (bookMarkedTimetable.isEmpty()) {
BookMarkScreenUiState.Empty
} else {
BookMarkScreenUiState.ListBookMark(bookMarkedTimetable)
private val currentDayFilter = MutableStateFlow(
DroidKaigi2023Day.values().map { it },
)

val uiState: StateFlow<BookMarkScreenUiState> =
buildUiState(sessionsStateFlow, currentDayFilter) { sessionsStateFlow, currentDayFilter ->
val bookMarkedTimetable = sessionsStateFlow.filtered(
Filters(
days = currentDayFilter,
filterFavorite = false,
),
)
if (bookMarkedTimetable.isEmpty()) {
BookMarkScreenUiState.Empty
} else {
BookMarkScreenUiState.ListBookMark(bookMarkedTimetable, currentDayFilter)
}
}

fun onClickAllFilterChip() {
currentDayFilter.update {
DroidKaigi2023Day.values().toList()
}
}

fun onClickDayFirstChip() {
currentDayFilter.update {
listOf(DroidKaigi2023Day.Day1)
}
}

fun onClickDaySecondChip() {
currentDayFilter.update {
listOf(DroidKaigi2023Day.Day2)
}
}

fun onClickDayThirdChip() {
currentDayFilter.update {
listOf(DroidKaigi2023Day.Day3)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import androidx.compose.foundation.layout.height
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.DateRange
import androidx.compose.material.icons.filled.Search
import androidx.compose.material.icons.filled.Favorite
import androidx.compose.material.icons.outlined.Bookmark
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
Expand Down Expand Up @@ -67,7 +67,7 @@ fun TimetableTopArea(
onClick = { onClickTopAreaBookMarkIcon() },
) {
Icon(
imageVector = Icons.Default.Favorite,
imageVector = Icons.Outlined.Bookmark,
contentDescription = Timetable.asString(),
)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
package io.github.droidkaigi.confsched2023.sessions.section

import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.size
import androidx.compose.material3.AssistChip
import androidx.compose.material3.AssistChipDefaults
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import io.github.droidkaigi.confsched2023.model.DroidKaigi2023Day

@Composable
fun BookMarkFilter(
currentDayFilter: List<DroidKaigi2023Day>,
onClickAllFilterChip: () -> Unit,
onClickDayFirstChip: () -> Unit,
onClickDaySecondChip: () -> Unit,
onClickDayThirdChip: () -> Unit,
modifier: Modifier = Modifier,
) {
val selectedChipColor = AssistChipDefaults.assistChipColors(
containerColor = Color(0xFFCEE9DB),
)
val selectedChipBoarderColor = AssistChipDefaults.assistChipBorder(
borderColor = Color(0xFF707974),
borderWidth = 0.dp,
)
val isAll = currentDayFilter.size == DroidKaigi2023Day.values().size
val isDayFirst =
currentDayFilter.size == 1 && currentDayFilter.first() == DroidKaigi2023Day.Day1
val isDaySecond =
currentDayFilter.size == 1 && currentDayFilter.first() == DroidKaigi2023Day.Day2
val isDayThird =
currentDayFilter.size == 1 && currentDayFilter.first() == DroidKaigi2023Day.Day3
Row(modifier) {
AssistChip(
onClick = onClickAllFilterChip,
label = {
Text(
text = "全て",
fontWeight = FontWeight(500),
fontSize = 17.sp,
)
},
colors = if (isAll) {
selectedChipColor
} else {
AssistChipDefaults.assistChipColors()
},
border = if (isAll) {
selectedChipBoarderColor
} else {
AssistChipDefaults.assistChipBorder()
},
)
Spacer(modifier = Modifier.size(8.dp))
AssistChip(
onClick = onClickDayFirstChip,
label = {
Text(
text = DroidKaigi2023Day.Day1.name,
fontWeight = FontWeight(500),
fontSize = 17.sp,
)
},
colors = if (isDayFirst) {
selectedChipColor
} else {
AssistChipDefaults.assistChipColors()
},
border = if (isDayFirst) {
selectedChipBoarderColor
} else {
AssistChipDefaults.assistChipBorder()
},
)
Spacer(modifier = Modifier.size(8.dp))
AssistChip(
onClick = onClickDaySecondChip,
label = {
Text(
text = DroidKaigi2023Day.Day2.name,
fontWeight = FontWeight(500),
fontSize = 17.sp,
)
},
colors = if (isDaySecond) {
selectedChipColor
} else {
AssistChipDefaults.assistChipColors()
},
border = if (isDaySecond) {
selectedChipBoarderColor
} else {
AssistChipDefaults.assistChipBorder()
},
)
Spacer(modifier = Modifier.size(8.dp))
AssistChip(
onClick = onClickDayThirdChip,
label = {
Text(
text = DroidKaigi2023Day.Day3.name,
fontWeight = FontWeight(500),
fontSize = 17.sp,
)
},
colors = if (isDayThird) {
selectedChipColor
} else {
AssistChipDefaults.assistChipColors()
},
border = if (isDayThird) {
selectedChipBoarderColor
} else {
AssistChipDefaults.assistChipBorder()
},
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ import io.github.droidkaigi.confsched2023.sessions.BookMarkScreenUiState.ListBoo
@Composable
fun BookMarkSheet(
uiState: BookMarkScreenUiState,
onClickAllFilterChip: () -> Unit,
onClickDayFirstChip: () -> Unit,
onClickDaySecondChip: () -> Unit,
onClickDayThirdChip: () -> Unit,
modifier: Modifier = Modifier,
) {
Box(
Expand All @@ -40,10 +44,20 @@ fun BookMarkSheet(
}

is ListBookMark -> {
BookMarkList(
timetable = uiState.bookMarkedTimeline,
modifier = Modifier.padding(start = 16.dp),
)
Column {
BookMarkFilter(
currentDayFilter = uiState.currentDayFilter,
onClickAllFilterChip = onClickAllFilterChip,
onClickDayFirstChip = onClickDayFirstChip,
onClickDaySecondChip = onClickDaySecondChip,
onClickDayThirdChip = onClickDayThirdChip,
modifier = Modifier.padding(start = 16.dp),
)
BookMarkList(
timetable = uiState.bookMarkedTimeline,
modifier = Modifier.padding(start = 16.dp),
)
}
}
}
}
Expand Down
1 change: 1 addition & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ composeUi = { module = "androidx.compose.ui:ui", version.ref = "compose" }
composeNavigation = { module = "androidx.navigation:navigation-compose", version = "2.6.0" }
composeRuntime = { module = "androidx.compose.runtime:runtime", version.ref = "compose" }
composeMaterial = { module = "androidx.compose.material3:material3", version = "1.1.1" }
composeMaterialIcon = { module = "androidx.compose.material:material-icons-extended", version = "1.4.3" }
composeUiToolingPreview = { module = "androidx.compose.ui:ui-tooling-preview", version.ref = "compose" }
composeUiTestJunit4 = { module = "androidx.compose.ui:ui-test-junit4", version.ref = "compose" }
composeUiTooling = { module = "androidx.compose.ui:ui-tooling", version.ref = "compose" }
Expand Down

0 comments on commit 24978d8

Please sign in to comment.