diff --git a/composeApp/src/commonMain/kotlin/press/mantra/compose/database/repository/DatabaseMantraRepository.kt b/composeApp/src/commonMain/kotlin/press/mantra/compose/database/repository/DatabaseMantraRepository.kt new file mode 100644 index 00000000..5c3613d8 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/press/mantra/compose/database/repository/DatabaseMantraRepository.kt @@ -0,0 +1,14 @@ +package press.mantra.compose.database.repository + +import kotlinx.coroutines.CoroutineScope +import press.mantra.compose.database.MantraDatabase +import press.mantra.compose.repository.MantraRepository + +class DatabaseMantraRepository( + val database: MantraDatabase, + val scope: CoroutineScope +): MantraRepository { + override fun addArtifact(name: String, url: String, versionLabel: String) { + TODO("Implement add artifact") + } +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/press/mantra/compose/repository/MantraRepository.kt b/composeApp/src/commonMain/kotlin/press/mantra/compose/repository/MantraRepository.kt new file mode 100644 index 00000000..4f13c5c9 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/press/mantra/compose/repository/MantraRepository.kt @@ -0,0 +1,21 @@ +package press.mantra.compose.repository + +interface MantraRepository { + fun addArtifact( + name: String, + url: String, + versionLabel: String + ) + + companion object { + val NO_OP_MANTRA_REPOSITORY = object: MantraRepository{ + override fun addArtifact( + name: String, + url: String, + versionLabel: String + ) { + TODO("Not yet implemented") + } + } + } +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/press/mantra/compose/ui/composable/AddArtifactScreen.kt b/composeApp/src/commonMain/kotlin/press/mantra/compose/ui/composable/AddArtifactScreen.kt index e72b1e4b..61c56f46 100644 --- a/composeApp/src/commonMain/kotlin/press/mantra/compose/ui/composable/AddArtifactScreen.kt +++ b/composeApp/src/commonMain/kotlin/press/mantra/compose/ui/composable/AddArtifactScreen.kt @@ -50,6 +50,7 @@ import press.mantra.compose.ui.composable.widgets.LoadingDataIndicator import press.mantra.compose.ui.theme.TorchTheme import press.mantra.compose.ui.view.state.ChatRoomMessagingUIState import com.vitorpamplona.quartz.nip01Core.core.HexKey +import press.mantra.compose.repository.MantraRepository import press.mantra.compose.ui.composable.navigation.routes.ImplementationPendingRoute import press.mantra.compose.ui.view.model.AddArtifactViewModel import press.mantra.compose.ui.view.state.AddArtifactUIState @@ -63,6 +64,7 @@ fun AddArtifactScreen( initialAddArtifactUIState: AddArtifactUIState = AddArtifactUIState.Loading, nostrRepository: NostrRepository, chatRepository: ChatRepository, + mantraRepository: MantraRepository, onNavigateToRouteAndPopUpInclusive: (Route) -> Unit, onNavigateToRoute: (Route) -> Unit, ) { @@ -73,7 +75,8 @@ fun AddArtifactScreen( initialAddArtifactUIState = initialAddArtifactUIState, nostrRepository = nostrRepository, chatRepository = chatRepository, - activeUserPublicKey = activeUserPublicKey + activeUserPublicKey = activeUserPublicKey, + mantraRepository = mantraRepository ) ) @@ -114,9 +117,10 @@ fun AddArtifactScreen( ExtendedFloatingActionButton( onClick = { addArtifactViewModel.addArtifact( - name = nameFieldState.text.toString(), - url = urlFieldState.text.toString(), - versionLabel = versionLabelFieldState.text.toString(), + localChatRoom = addArtifactUIState.localChatRoom, + nameField = nameFieldState, + urlField = urlFieldState, + versionLabelField = versionLabelFieldState, onSuccess = { onNavigateToRoute.invoke( ImplementationPendingRoute("Add Artifact") @@ -281,7 +285,7 @@ fun AddArtifactScreen( @Preview @Composable -private fun ChatRoomMessagingScreenPreview() { +private fun AddArtifactScreenPreview() { TorchTheme { Surface( modifier = Modifier.fillMaxSize() @@ -304,6 +308,7 @@ private fun ChatRoomMessagingScreenPreview() { ), nostrRepository = NostrRepository.NO_OP_NOSTR_REPOSITORY, chatRepository = ChatRepository.NO_OP_CHAT_REPOSITORY, + mantraRepository = MantraRepository.NO_OP_MANTRA_REPOSITORY, onNavigateToRouteAndPopUpInclusive = {}, onNavigateToRoute = {} ) diff --git a/composeApp/src/commonMain/kotlin/press/mantra/compose/ui/composable/navigation/MantraNavHost.kt b/composeApp/src/commonMain/kotlin/press/mantra/compose/ui/composable/navigation/MantraNavHost.kt index 38fdb680..1eb1d3d0 100644 --- a/composeApp/src/commonMain/kotlin/press/mantra/compose/ui/composable/navigation/MantraNavHost.kt +++ b/composeApp/src/commonMain/kotlin/press/mantra/compose/ui/composable/navigation/MantraNavHost.kt @@ -86,6 +86,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.IO import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.launch +import press.mantra.compose.database.repository.DatabaseMantraRepository import press.mantra.compose.ui.composable.AddArtifactScreen import press.mantra.compose.ui.composable.navigation.routes.AddArtifactRoute @@ -123,6 +124,10 @@ fun MantraNavHost( database = auxDatabaseManager.auxDatabase, applicationIOScope ) + val databaseMantraRepository = DatabaseMantraRepository( + database = auxDatabaseManager.auxDatabase, + applicationIOScope + ) val searchRepository = DatabaseSearchRepository( database = auxDatabaseManager.auxDatabase @@ -652,6 +657,7 @@ fun MantraNavHost( relayHint = route.relayHint, nostrRepository = databaseNostrRepository, chatRepository = databaseChatRepository, + mantraRepository = databaseMantraRepository, onNavigateToRouteAndPopUpInclusive = { chatRoomDetailRoute -> navController.navigate( route = chatRoomDetailRoute diff --git a/composeApp/src/commonMain/kotlin/press/mantra/compose/ui/view/model/AddArtifactViewModel.kt b/composeApp/src/commonMain/kotlin/press/mantra/compose/ui/view/model/AddArtifactViewModel.kt index fb2c4837..10589179 100644 --- a/composeApp/src/commonMain/kotlin/press/mantra/compose/ui/view/model/AddArtifactViewModel.kt +++ b/composeApp/src/commonMain/kotlin/press/mantra/compose/ui/view/model/AddArtifactViewModel.kt @@ -1,5 +1,7 @@ package press.mantra.compose.ui.view.model +import androidx.compose.foundation.text.input.TextFieldState +import androidx.compose.foundation.text.input.clearText import androidx.compose.runtime.MutableState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -16,6 +18,8 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.IO import kotlinx.coroutines.launch +import press.mantra.compose.database.model.intermdiate.LocalChatRoom +import press.mantra.compose.repository.MantraRepository import press.mantra.compose.ui.view.state.AddArtifactUIState class AddArtifactViewModel( @@ -24,7 +28,8 @@ class AddArtifactViewModel( val relayHint: String?, initialAddArtifactUIState: AddArtifactUIState, val nostrRepository: NostrRepository, - val chatRepository: ChatRepository + val chatRepository: ChatRepository, + val mantraRepository: MantraRepository ): ViewModel() { var addArtifactUIState: AddArtifactUIState by mutableStateOf(initialAddArtifactUIState) @@ -52,13 +57,33 @@ class AddArtifactViewModel( } fun addArtifact( - name: String, - url: String, - versionLabel: String, + localChatRoom: LocalChatRoom, + nameField: TextFieldState, + urlField: TextFieldState, + versionLabelField: TextFieldState, onSuccess: () -> Unit, onFailure: () -> Unit ) { + if (nameField.text.isNotBlank() && urlField.text.isNotBlank() && versionLabelField.text.isNotBlank()) { + val name = nameField.text.toString() + val url = urlField.text.toString() + val versionLabel = versionLabelField.text.toString() + + nameField.clearText() + urlField.clearText() + versionLabelField.clearText() + + viewModelScope.launch(Dispatchers.IO) { + mantraRepository.addArtifact( + name = name, + url = url, + versionLabel = versionLabel + ) + // TODO: Navigate to artifact... + onSuccess.invoke() + } + } } companion object { @@ -70,7 +95,8 @@ class AddArtifactViewModel( relayHint: String?, initialAddArtifactUIState: AddArtifactUIState = AddArtifactUIState.Loading, nostrRepository: NostrRepository, - chatRepository: ChatRepository + chatRepository: ChatRepository, + mantraRepository: MantraRepository ): ViewModelProvider.Factory = viewModelFactory { initializer { AddArtifactViewModel( @@ -79,7 +105,8 @@ class AddArtifactViewModel( relayHint = relayHint, initialAddArtifactUIState = initialAddArtifactUIState, nostrRepository = nostrRepository, - chatRepository = chatRepository + chatRepository = chatRepository, + mantraRepository = mantraRepository ) } } diff --git a/composeApp/src/commonMain/kotlin/press/mantra/compose/ui/view/model/ChatMessageListViewModel.kt b/composeApp/src/commonMain/kotlin/press/mantra/compose/ui/view/model/ChatMessageListViewModel.kt index 42c256de..6539f999 100755 --- a/composeApp/src/commonMain/kotlin/press/mantra/compose/ui/view/model/ChatMessageListViewModel.kt +++ b/composeApp/src/commonMain/kotlin/press/mantra/compose/ui/view/model/ChatMessageListViewModel.kt @@ -419,7 +419,6 @@ class ChatMessageListViewModel( localChatRoom = localChatRoom ) } - } }