From 522bb7b718401580eda423c3bcb4ff035bb34b0c Mon Sep 17 00:00:00 2001 From: Philipp Fahlteich Date: Thu, 7 Dec 2023 21:33:25 +0100 Subject: [PATCH] Create tag on clicking fab in form dialog --- .../bottom/BottomAppBarStyleProvider.kt | 3 ++- .../com/faltenreich/diaguard/tag/TagModule.kt | 2 ++ .../diaguard/tag/form/CreateTagUseCase.kt | 19 +++++++++++++++++++ .../faltenreich/diaguard/tag/list/TagList.kt | 6 +++--- .../diaguard/tag/list/TagListIntent.kt | 10 ++++++++++ .../diaguard/tag/list/TagListViewModel.kt | 18 ++++++++---------- 6 files changed, 44 insertions(+), 14 deletions(-) create mode 100644 shared/src/commonMain/kotlin/com/faltenreich/diaguard/tag/form/CreateTagUseCase.kt create mode 100644 shared/src/commonMain/kotlin/com/faltenreich/diaguard/tag/list/TagListIntent.kt diff --git a/shared/src/commonMain/kotlin/com/faltenreich/diaguard/navigation/bottom/BottomAppBarStyleProvider.kt b/shared/src/commonMain/kotlin/com/faltenreich/diaguard/navigation/bottom/BottomAppBarStyleProvider.kt index e7ad8c12c..f4501a351 100644 --- a/shared/src/commonMain/kotlin/com/faltenreich/diaguard/navigation/bottom/BottomAppBarStyleProvider.kt +++ b/shared/src/commonMain/kotlin/com/faltenreich/diaguard/navigation/bottom/BottomAppBarStyleProvider.kt @@ -41,6 +41,7 @@ import com.faltenreich.diaguard.shared.localization.getString import com.faltenreich.diaguard.shared.view.DatePickerBottomAppBarItem import com.faltenreich.diaguard.shared.view.FloatingActionButton import com.faltenreich.diaguard.shared.view.SearchField +import com.faltenreich.diaguard.tag.list.TagListIntent import com.faltenreich.diaguard.tag.list.TagListViewModel import com.faltenreich.diaguard.timeline.TimelineViewModel import dev.icerock.moko.resources.compose.painterResource @@ -178,7 +179,7 @@ fun Screen.bottomAppBarStyle(): BottomAppBarStyle { is TagListScreen -> BottomAppBarStyle.Visible( floatingActionButton = { val viewModel = getViewModel() - FloatingActionButton(onClick = { viewModel.showFormDialog() }) { + FloatingActionButton(onClick = { viewModel.handleIntent(TagListIntent.OpenForm) }) { Icon( painter = painterResource(MR.images.ic_add), contentDescription = getString(MR.strings.tag_new), diff --git a/shared/src/commonMain/kotlin/com/faltenreich/diaguard/tag/TagModule.kt b/shared/src/commonMain/kotlin/com/faltenreich/diaguard/tag/TagModule.kt index 7f32e52bf..ce1a68836 100644 --- a/shared/src/commonMain/kotlin/com/faltenreich/diaguard/tag/TagModule.kt +++ b/shared/src/commonMain/kotlin/com/faltenreich/diaguard/tag/TagModule.kt @@ -1,5 +1,6 @@ package com.faltenreich.diaguard.tag +import com.faltenreich.diaguard.tag.form.CreateTagUseCase import com.faltenreich.diaguard.tag.list.GetTagsUseCase import com.faltenreich.diaguard.tag.list.TagListViewModel import org.koin.core.module.dsl.singleOf @@ -9,6 +10,7 @@ fun tagModule() = module { singleOf(::TagRepository) singleOf(::GetTagsUseCase) + singleOf(::CreateTagUseCase) singleOf(::TagListViewModel) } \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/faltenreich/diaguard/tag/form/CreateTagUseCase.kt b/shared/src/commonMain/kotlin/com/faltenreich/diaguard/tag/form/CreateTagUseCase.kt new file mode 100644 index 000000000..f5ee93d63 --- /dev/null +++ b/shared/src/commonMain/kotlin/com/faltenreich/diaguard/tag/form/CreateTagUseCase.kt @@ -0,0 +1,19 @@ +package com.faltenreich.diaguard.tag.form + +import com.faltenreich.diaguard.shared.datetime.DateTimeFactory +import com.faltenreich.diaguard.tag.TagRepository + +class CreateTagUseCase( + private val repository: TagRepository, + private val dateTimeFactory: DateTimeFactory, +) { + + operator fun invoke(name: String) { + val now = dateTimeFactory.now() + repository.create( + createdAt = now, + updatedAt = now, + name = name, + ) + } +} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/faltenreich/diaguard/tag/list/TagList.kt b/shared/src/commonMain/kotlin/com/faltenreich/diaguard/tag/list/TagList.kt index 04b45acfe..a6d8306f9 100644 --- a/shared/src/commonMain/kotlin/com/faltenreich/diaguard/tag/list/TagList.kt +++ b/shared/src/commonMain/kotlin/com/faltenreich/diaguard/tag/list/TagList.kt @@ -25,10 +25,10 @@ fun TagList( } if (viewState.showFormDialog) { TagFormDialog( - onDismissRequest = viewModel::hideFormDialog, + onDismissRequest = { viewModel.handleIntent(TagListIntent.CloseForm) }, onConfirmRequest = { name -> - viewModel.createTag(name) - viewModel.hideFormDialog() + viewModel.handleIntent(TagListIntent.Submit(name)) + viewModel.handleIntent(TagListIntent.CloseForm) } ) } diff --git a/shared/src/commonMain/kotlin/com/faltenreich/diaguard/tag/list/TagListIntent.kt b/shared/src/commonMain/kotlin/com/faltenreich/diaguard/tag/list/TagListIntent.kt new file mode 100644 index 000000000..f1f71300f --- /dev/null +++ b/shared/src/commonMain/kotlin/com/faltenreich/diaguard/tag/list/TagListIntent.kt @@ -0,0 +1,10 @@ +package com.faltenreich.diaguard.tag.list + +sealed interface TagListIntent { + + data object OpenForm : TagListIntent + + data object CloseForm : TagListIntent + + data class Submit(val name: String) : TagListIntent +} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/faltenreich/diaguard/tag/list/TagListViewModel.kt b/shared/src/commonMain/kotlin/com/faltenreich/diaguard/tag/list/TagListViewModel.kt index fffb62d0e..4fddcd2b9 100644 --- a/shared/src/commonMain/kotlin/com/faltenreich/diaguard/tag/list/TagListViewModel.kt +++ b/shared/src/commonMain/kotlin/com/faltenreich/diaguard/tag/list/TagListViewModel.kt @@ -2,6 +2,7 @@ package com.faltenreich.diaguard.tag.list import com.faltenreich.diaguard.shared.architecture.ViewModel import com.faltenreich.diaguard.shared.di.inject +import com.faltenreich.diaguard.tag.form.CreateTagUseCase import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.combine @@ -9,6 +10,7 @@ import kotlinx.coroutines.flow.stateIn class TagListViewModel( getTags: GetTagsUseCase = inject(), + private val createTag: CreateTagUseCase = inject(), ) : ViewModel() { private val tags = getTags() @@ -24,15 +26,11 @@ class TagListViewModel( initialValue = TagListViewState.Loading, ) - fun showFormDialog() { - showFormDialog.value = true - } - - fun hideFormDialog() { - showFormDialog.value = false - } - - fun createTag(name: String) { - + fun handleIntent(intent: TagListIntent) { + when (intent) { + is TagListIntent.OpenForm -> showFormDialog.value = true + is TagListIntent.CloseForm -> showFormDialog.value = false + is TagListIntent.Submit -> createTag(intent.name) + } } } \ No newline at end of file