refactor: integrate ViewModel and repository for record management
This commit is contained in:
@@ -2,13 +2,20 @@ package fr.ajaury.gwenedeg
|
||||
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import fr.ajaury.gwenedeg.records.data.InMemoryRecordRepository
|
||||
import fr.ajaury.gwenedeg.records.ui.RecordsScreen
|
||||
import fr.ajaury.gwenedeg.records.ui.viewmodel.RecordsViewModel
|
||||
|
||||
@Composable
|
||||
@Preview
|
||||
fun App() {
|
||||
val viewModel = remember {
|
||||
RecordsViewModel(InMemoryRecordRepository())
|
||||
}
|
||||
|
||||
MaterialTheme {
|
||||
RecordsScreen()
|
||||
RecordsScreen(viewModel)
|
||||
}
|
||||
}
|
||||
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
package fr.ajaury.gwenedeg.records.data
|
||||
|
||||
import fr.ajaury.gwenedeg.records.domain.Record
|
||||
import fr.ajaury.gwenedeg.records.domain.RecordRepository
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.flowOf
|
||||
|
||||
class InMemoryRecordRepository : RecordRepository {
|
||||
private val records =
|
||||
listOf(
|
||||
"An onestiz",
|
||||
"En em brezntiñ",
|
||||
"An amzer a ra",
|
||||
"E komz get unan arall",
|
||||
"Me hag ar brezhoneg",
|
||||
"Ar yec'hed",
|
||||
"Deskriviñ",
|
||||
"Me 'gar / Ne garan ket",
|
||||
"C'hoantoù",
|
||||
"Penaos 'peus kavet...?",
|
||||
"Oberiantizoù",
|
||||
"Debriñ hag evet",
|
||||
"Bale, pourmen ha beajiñ",
|
||||
"Ma c'horf",
|
||||
"Dle eo / ret eo / dav eo / mall eo...",
|
||||
"Deizioù ar sizhun",
|
||||
"Mizioù ha kourzoù ar blez",
|
||||
"Bez'zo / N'eus ket...",
|
||||
"Banne.../Tamm...",
|
||||
"Stad a vuhez",
|
||||
"Lec'hiiñ",
|
||||
).map { Record(it) }
|
||||
|
||||
override fun getRecords(): Flow<List<Record>> = flowOf(records)
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package fr.ajaury.gwenedeg.records.domain
|
||||
|
||||
data class Record(
|
||||
val title: String,
|
||||
)
|
||||
@@ -0,0 +1,7 @@
|
||||
package fr.ajaury.gwenedeg.records.domain
|
||||
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
interface RecordRepository {
|
||||
fun getRecords(): Flow<List<Record>>
|
||||
}
|
||||
@@ -5,11 +5,12 @@ import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.unit.dp
|
||||
import fr.ajaury.gwenedeg.records.domain.Record
|
||||
|
||||
@Composable
|
||||
fun RecordView(record: String) {
|
||||
fun RecordView(record: Record) {
|
||||
Text(
|
||||
text = record,
|
||||
text = record.title,
|
||||
modifier = Modifier.padding(16.dp),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -5,41 +5,20 @@ import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.safeContentPadding
|
||||
import androidx.compose.foundation.lazy.LazyColumn
|
||||
import androidx.compose.foundation.lazy.items
|
||||
import androidx.compose.foundation.lazy.itemsIndexed
|
||||
import androidx.compose.material3.HorizontalDivider
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Scaffold
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
private val records =
|
||||
listOf(
|
||||
"An onestiz",
|
||||
"En em brezntiñ",
|
||||
"An amzer a ra",
|
||||
"E komz get unan arall",
|
||||
"Me hag ar brezhoneg",
|
||||
"Ar yec'hed",
|
||||
"Deskriviñ",
|
||||
"Me 'gar / Ne garan ket",
|
||||
"C'hoantoù",
|
||||
"Penaos 'peus kavet...?",
|
||||
"Oberiantizoù",
|
||||
"Debriñ hag evet",
|
||||
"Bale, pourmen ha beajiñ",
|
||||
"Ma c'horf",
|
||||
"Dle eo / ret eo / dav eo / mall eo...",
|
||||
"Deizioù ar sizhun",
|
||||
"Mizioù ha kourzoù ar blez",
|
||||
"Bez'zo / N'eus ket...",
|
||||
"Banne.../Tamm...",
|
||||
"Stad a vuhez",
|
||||
"Lec'hiiñ",
|
||||
)
|
||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||
import fr.ajaury.gwenedeg.records.ui.viewmodel.RecordsViewModel
|
||||
|
||||
@Composable
|
||||
fun RecordsScreen() {
|
||||
fun RecordsScreen(viewModel: RecordsViewModel) {
|
||||
val records by viewModel.uiState.collectAsStateWithLifecycle()
|
||||
Scaffold { innerPadding ->
|
||||
LazyColumn(
|
||||
modifier =
|
||||
@@ -48,12 +27,12 @@ fun RecordsScreen() {
|
||||
.background(MaterialTheme.colorScheme.primaryContainer)
|
||||
.fillMaxSize(),
|
||||
) {
|
||||
items(records) { item ->
|
||||
itemsIndexed(records) { index, item ->
|
||||
RecordView(
|
||||
record = item,
|
||||
)
|
||||
|
||||
if (!item.isLastItem()) {
|
||||
if (index < records.lastIndex) {
|
||||
HorizontalDivider(
|
||||
modifier = Modifier.padding(horizontal = 16.dp),
|
||||
thickness = 1.dp,
|
||||
@@ -64,5 +43,3 @@ fun RecordsScreen() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun String.isLastItem(): Boolean = this == records.last()
|
||||
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
package fr.ajaury.gwenedeg.records.ui.viewmodel
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import fr.ajaury.gwenedeg.records.domain.Record
|
||||
import fr.ajaury.gwenedeg.records.domain.RecordRepository
|
||||
import kotlinx.coroutines.flow.SharingStarted
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.flow.stateIn
|
||||
|
||||
class RecordsViewModel(
|
||||
recordRepository: RecordRepository,
|
||||
) : ViewModel() {
|
||||
val uiState: StateFlow<List<Record>> = recordRepository
|
||||
.getRecords()
|
||||
.stateIn(
|
||||
scope = viewModelScope,
|
||||
started = SharingStarted.WhileSubscribed(5000),
|
||||
initialValue = emptyList(),
|
||||
)
|
||||
}
|
||||
@@ -2,4 +2,4 @@ package fr.ajaury.gwenedeg
|
||||
|
||||
import androidx.compose.ui.window.ComposeUIViewController
|
||||
|
||||
fun MainViewController() = ComposeUIViewController { App() }
|
||||
fun MainViewController() = ComposeUIViewController { App() }
|
||||
|
||||
Reference in New Issue
Block a user