Add and broadcast translation artifact version

We might not want to do translation chunk scaffolding
This commit is contained in:
Kgothatso Ngako committed 2026-07-28 09:21:16 +02:00
1 parent 8de05742d0
commit 02b2c9a4f8
7 files changed
+175 -143

No files matched your search

@@ -11,6 +11,9 @@ import press.mantra.compose.database.model.MantraArtifactVersion
import press.mantra.compose.database.model.MantraChapter import press.mantra.compose.database.model.MantraChapter
import press.mantra.compose.database.model.MantraChunk import press.mantra.compose.database.model.MantraChunk
import press.mantra.compose.database.model.MantraDialect import press.mantra.compose.database.model.MantraDialect
import press.mantra.compose.database.model.MantraTranslationArtifactVersion
import press.mantra.compose.database.model.MantraTranslationChapter
import press.mantra.compose.database.model.MantraTranslationChunk
import press.mantra.compose.database.model.MarmotInnerEvent import press.mantra.compose.database.model.MarmotInnerEvent
import press.mantra.compose.database.model.intermdiate.LocalChatRoom import press.mantra.compose.database.model.intermdiate.LocalChatRoom
import press.mantra.compose.nostr.nip30303.ArtifactEvent import press.mantra.compose.nostr.nip30303.ArtifactEvent
@@ -18,6 +21,9 @@ import press.mantra.compose.nostr.nip30303.ArtifactVersionEvent
import press.mantra.compose.nostr.nip30303.ChapterEvent import press.mantra.compose.nostr.nip30303.ChapterEvent
import press.mantra.compose.nostr.nip30303.ChunkEvent import press.mantra.compose.nostr.nip30303.ChunkEvent
import press.mantra.compose.nostr.nip30303.DialectEvent import press.mantra.compose.nostr.nip30303.DialectEvent
import press.mantra.compose.nostr.nip30303.TranslationArtifactVersionEvent
import press.mantra.compose.nostr.nip30303.TranslationChapterEvent
import press.mantra.compose.nostr.nip30303.TranslationChunkEvent
import press.mantra.compose.nostr.nip30303.tags.ArtifactIdTag import press.mantra.compose.nostr.nip30303.tags.ArtifactIdTag
import press.mantra.compose.repository.MantraRepository.Companion.DEFAULT_LICENSE import press.mantra.compose.repository.MantraRepository.Companion.DEFAULT_LICENSE
import press.mantra.compose.repository.MantraRepository.Companion.DEFAULT_VISIBILITY import press.mantra.compose.repository.MantraRepository.Companion.DEFAULT_VISIBILITY
@@ -303,6 +309,130 @@ abstract class MantraDao(
} }
} }
open suspend fun addTranslationArtifactVersion(
artifactId: String,
dialectId: String,
chatRoomId: String,
userPublicKey: HexKey,
): MarmotInnerEvent? {
val artifact = database.mantraArtifactDao().getArtifactById(artifactId) ?: return null
val version = database.mantraArtifactVersionDao()
.getArtifactVersionsByArtifactId(artifactId)
.firstOrNull() ?: return null
val dialect = database.mantraDialectDao().getDialectById(dialectId) ?: return null
// The translation is named after its dialect, and inherits the source
// artifact's visibility/license.
val translationVersionTemplate = TranslationArtifactVersionEvent.build(
artifactVersionId = version.id,
dialectId = dialectId,
name = dialect.name,
visibility = artifact.visibility,
license = artifact.license,
)
val translationVersion = MantraTranslationArtifactVersion.fromTranslationArtifactVersionEventTemplate(
translationArtifactVersionEventTemplate = translationVersionTemplate,
chatRoomId = chatRoomId,
userPublicKey = userPublicKey,
) ?: return null
return try {
database.mantraTranslationArtifactVersionDao().upsert(translationVersion)
val translationArtifactVersionInnerEvent = MarmotInnerEvent(
id = translationVersion.id,
publicKey = translationVersion.publicKey,
kind = TranslationArtifactVersionEvent.KIND,
createdAt = translationVersion.createdAt,
tags = translationVersionTemplate.tags,
content = translationVersionTemplate.content,
chatRoomId = translationVersion.chatRoomId,
)
sendMarmotInnerEvent(
chatRoomId = chatRoomId,
userPublicKey = userPublicKey,
text = "Added ${dialect.name} translation",
marmotInnerEvent = translationArtifactVersionInnerEvent
)
// Mirror the source structure: a translation chapter per chapter and
// an (untranslated) translation chunk per chunk.
val chapters = database.mantraChapterDao().getChaptersByArtifactVersionId(version.id)
chapters.forEach { chapter ->
val translationChapterTemplate = TranslationChapterEvent.build(
translationArtifactVersionId = translationVersion.id,
chapterId = chapter.id,
index = chapter.index,
)
val translationChapter = MantraTranslationChapter.fromTranslationChapterEventTemplate(
translationChapterEventTemplate = translationChapterTemplate,
chatRoomId = chatRoomId,
userPublicKey = userPublicKey,
) ?: return@forEach
database.mantraTranslationChapterDao().upsert(translationChapter)
val translationChapterInnerEvent = MarmotInnerEvent(
id = translationChapter.id,
publicKey = translationChapter.publicKey,
kind = TranslationChapterEvent.KIND,
createdAt = translationChapter.createdAt,
tags = translationChapterTemplate.tags,
content = translationChapterTemplate.content,
chatRoomId = translationChapter.chatRoomId,
)
sendMarmotInnerEvent(
chatRoomId = chatRoomId,
userPublicKey = userPublicKey,
text = "Prepared ${dialect.name} translation of the chapter ${chapter.name}",
marmotInnerEvent = translationChapterInnerEvent
)
// TODO: Don't scaffold translation chunks?
val chunks = database.mantraChunkDao().getChunksByChapterId(chapter.id)
chunks.forEach { chunk ->
val translationChunkTemplate = TranslationChunkEvent.build(
translationChapterId = translationChapter.id,
chunkId = chunk.id,
index = chunk.index,
text = "", // Untranslated scaffold; filled in during authoring.
)
val translationChunk = MantraTranslationChunk.fromTranslationChunkEventTemplate(
translationChunkEventTemplate = translationChunkTemplate,
chatRoomId = chatRoomId,
userPublicKey = userPublicKey,
) ?: return@forEach
database.mantraTranslationChunkDao().upsert(translationChunk)
val translationChunkInnerEvent = MarmotInnerEvent(
id = translationChunk.id,
publicKey = translationChunk.publicKey,
kind = TranslationChunkEvent.KIND,
createdAt = translationChunk.createdAt,
tags = translationChunkTemplate.tags,
content = translationChunkTemplate.content,
chatRoomId = translationChunk.chatRoomId,
)
database.marmotInnerEventDao().upsert(
translationChunkInnerEvent
)
sendMarmotInnerEvent(
chatRoomId = chatRoomId,
userPublicKey = userPublicKey,
text = "Prepared translation chunk ${chunk.index}",
marmotInnerEvent = translationChunkInnerEvent
)
}
}
translationArtifactVersionInnerEvent
} catch (error: Throwable) {
logger.e("Failed to add translation for artifact $artifactId", error)
null
}
}
private suspend fun sendMarmotInnerEvent( private suspend fun sendMarmotInnerEvent(
localChatRoom: LocalChatRoom, localChatRoom: LocalChatRoom,
text: String, text: String,
@@ -14,13 +14,8 @@ import press.mantra.compose.database.model.MantraTranslationChapter
import press.mantra.compose.database.model.MantraTranslationChunk import press.mantra.compose.database.model.MantraTranslationChunk
import press.mantra.compose.database.model.MarmotInnerEvent import press.mantra.compose.database.model.MarmotInnerEvent
import press.mantra.compose.database.model.intermdiate.LocalChatRoom import press.mantra.compose.database.model.intermdiate.LocalChatRoom
import press.mantra.compose.nostr.nip30303.ChapterEvent
import press.mantra.compose.nostr.nip30303.ChunkEvent
import press.mantra.compose.nostr.nip30303.TranslationArtifactVersionEvent
import press.mantra.compose.nostr.nip30303.TranslationChapterEvent
import press.mantra.compose.nostr.nip30303.TranslationChunkEvent import press.mantra.compose.nostr.nip30303.TranslationChunkEvent
import press.mantra.compose.repository.MantraRepository import press.mantra.compose.repository.MantraRepository
import press.mantra.compose.text.Markdown
class DatabaseMantraRepository( class DatabaseMantraRepository(
val database: MantraDatabase, val database: MantraDatabase,
@@ -44,109 +39,18 @@ class DatabaseMantraRepository(
override suspend fun getChaptersForArtifact(artifactId: String): List<MantraChapter> = override suspend fun getChaptersForArtifact(artifactId: String): List<MantraChapter> =
database.mantraChapterDao().getChaptersByArtifactId(artifactId) database.mantraChapterDao().getChaptersByArtifactId(artifactId)
override suspend fun addTranslation( override suspend fun addTranslationArtifactVersion(
artifactId: String, artifactId: String,
dialectId: String, dialectId: String,
chatRoomId: String, chatRoomId: String,
userPublicKey: HexKey, userPublicKey: HexKey,
): MantraTranslationArtifactVersion? { ): MarmotInnerEvent? {
val artifact = database.mantraArtifactDao().getArtifactById(artifactId) ?: return null return database.mantraDao().addTranslationArtifactVersion(
val version = database.mantraArtifactVersionDao() artifactId = artifactId,
.getArtifactVersionsByArtifactId(artifactId)
.firstOrNull() ?: return null
val dialect = database.mantraDialectDao().getDialectById(dialectId) ?: return null
// The translation is named after its dialect, and inherits the source
// artifact's visibility/license.
val translationVersionTemplate = TranslationArtifactVersionEvent.build(
artifactVersionId = version.id,
dialectId = dialectId, dialectId = dialectId,
name = dialect.name,
visibility = artifact.visibility,
license = artifact.license,
)
val translationVersion = MantraTranslationArtifactVersion.fromTranslationArtifactVersionEventTemplate(
translationArtifactVersionEventTemplate = translationVersionTemplate,
chatRoomId = chatRoomId, chatRoomId = chatRoomId,
userPublicKey = userPublicKey, userPublicKey = userPublicKey
) ?: return null )
return try {
database.mantraTranslationArtifactVersionDao().upsert(translationVersion)
database.marmotInnerEventDao().upsert(
MarmotInnerEvent(
id = translationVersion.id,
publicKey = translationVersion.publicKey,
kind = TranslationArtifactVersionEvent.KIND,
createdAt = translationVersion.createdAt,
tags = translationVersionTemplate.tags,
content = translationVersionTemplate.content,
chatRoomId = translationVersion.chatRoomId,
)
)
// Mirror the source structure: a translation chapter per chapter and
// an (untranslated) translation chunk per chunk.
val chapters = database.mantraChapterDao().getChaptersByArtifactVersionId(version.id)
chapters.forEach { chapter ->
val translationChapterTemplate = TranslationChapterEvent.build(
translationArtifactVersionId = translationVersion.id,
chapterId = chapter.id,
index = chapter.index,
)
val translationChapter = MantraTranslationChapter.fromTranslationChapterEventTemplate(
translationChapterEventTemplate = translationChapterTemplate,
chatRoomId = chatRoomId,
userPublicKey = userPublicKey,
) ?: return@forEach
database.mantraTranslationChapterDao().upsert(translationChapter)
database.marmotInnerEventDao().upsert(
MarmotInnerEvent(
id = translationChapter.id,
publicKey = translationChapter.publicKey,
kind = TranslationChapterEvent.KIND,
createdAt = translationChapter.createdAt,
tags = translationChapterTemplate.tags,
content = translationChapterTemplate.content,
chatRoomId = translationChapter.chatRoomId,
)
)
val chunks = database.mantraChunkDao().getChunksByChapterId(chapter.id)
chunks.forEach { chunk ->
val translationChunkTemplate = TranslationChunkEvent.build(
translationChapterId = translationChapter.id,
chunkId = chunk.id,
index = chunk.index,
text = "", // Untranslated scaffold; filled in during authoring.
)
val translationChunk = MantraTranslationChunk.fromTranslationChunkEventTemplate(
translationChunkEventTemplate = translationChunkTemplate,
chatRoomId = chatRoomId,
userPublicKey = userPublicKey,
) ?: return@forEach
database.mantraTranslationChunkDao().upsert(translationChunk)
database.marmotInnerEventDao().upsert(
MarmotInnerEvent(
id = translationChunk.id,
publicKey = translationChunk.publicKey,
kind = TranslationChunkEvent.KIND,
createdAt = translationChunk.createdAt,
tags = translationChunkTemplate.tags,
content = translationChunkTemplate.content,
chatRoomId = translationChunk.chatRoomId,
)
)
}
}
translationVersion
} catch (error: Throwable) {
logger.e("Failed to add translation for artifact $artifactId", error)
null
}
} }
override suspend fun getChapter(id: String): MantraChapter? = override suspend fun getChapter(id: String): MantraChapter? =
@@ -60,12 +60,12 @@ interface MantraRepository {
* MantraTranslationChunk (empty text) for each existing chunk. Returns null * MantraTranslationChunk (empty text) for each existing chunk. Returns null
* when the artifact has no version to translate. * when the artifact has no version to translate.
*/ */
suspend fun addTranslation( suspend fun addTranslationArtifactVersion(
artifactId: String, artifactId: String,
dialectId: String, dialectId: String,
chatRoomId: String, chatRoomId: String,
userPublicKey: HexKey, userPublicKey: HexKey,
): MantraTranslationArtifactVersion? ): MarmotInnerEvent?
/** /**
* Add a chapter (markdown [originalText]) to the artifact's latest version. * Add a chapter (markdown [originalText]) to the artifact's latest version.
@@ -150,12 +150,12 @@ interface MantraRepository {
override suspend fun getTranslationChunks(translationChapterId: String): List<MantraTranslationChunk> = emptyList() override suspend fun getTranslationChunks(translationChapterId: String): List<MantraTranslationChunk> = emptyList()
override suspend fun addTranslation( override suspend fun addTranslationArtifactVersion(
artifactId: String, artifactId: String,
dialectId: String, dialectId: String,
chatRoomId: String, chatRoomId: String,
userPublicKey: HexKey, userPublicKey: HexKey,
): MantraTranslationArtifactVersion? = null ): MarmotInnerEvent? = null
override suspend fun addChapter( override suspend fun addChapter(
artifactId: String, artifactId: String,
@@ -50,36 +50,36 @@ import press.mantra.compose.ui.composable.navigation.routes.ArtifactDetailRoute
import press.mantra.compose.ui.composable.navigation.routes.Route import press.mantra.compose.ui.composable.navigation.routes.Route
import press.mantra.compose.ui.composable.widgets.LoadingDataIndicator import press.mantra.compose.ui.composable.widgets.LoadingDataIndicator
import press.mantra.compose.ui.theme.TorchTheme import press.mantra.compose.ui.theme.TorchTheme
import press.mantra.compose.ui.view.model.AddTranslationViewModel import press.mantra.compose.ui.view.model.AddTranslationArtifactVersionViewModel
import press.mantra.compose.ui.view.state.AddTranslationUIState import press.mantra.compose.ui.view.state.AddTranslationArtifactVersionUIState
@OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class) @OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class)
@Composable @Composable
fun AddTranslationScreen( fun AddTranslationArtifactVersionScreen(
activeUserPublicKey: HexKey, activeUserPublicKey: HexKey,
artifactId: String, artifactId: String,
chatRoomId: String, chatRoomId: String,
relayHint: String?, relayHint: String?,
initialAddTranslationUIState: AddTranslationUIState = AddTranslationUIState.Loading, initialAddTranslationArtifactVersionUIState: AddTranslationArtifactVersionUIState = AddTranslationArtifactVersionUIState.Loading,
mantraRepository: MantraRepository, mantraRepository: MantraRepository,
chatRepository: ChatRepository, chatRepository: ChatRepository,
onNavigateToRoute: (Route) -> Unit, onNavigateToRoute: (Route) -> Unit,
onNavigateBack: () -> Unit, onNavigateBack: () -> Unit,
) { ) {
val addTranslationViewModel: AddTranslationViewModel = viewModel( val addTranslationArtifactVersionViewModel: AddTranslationArtifactVersionViewModel = viewModel(
factory = AddTranslationViewModel.factory( factory = AddTranslationArtifactVersionViewModel.factory(
activeUserPublicKey = activeUserPublicKey, activeUserPublicKey = activeUserPublicKey,
artifactId = artifactId, artifactId = artifactId,
chatRoomId = chatRoomId, chatRoomId = chatRoomId,
relayHint = relayHint, relayHint = relayHint,
initialAddTranslationUIState = initialAddTranslationUIState, initialAddTranslationArtifactVersionUIState = initialAddTranslationArtifactVersionUIState,
mantraRepository = mantraRepository, mantraRepository = mantraRepository,
chatRepository = chatRepository chatRepository = chatRepository
) )
) )
when (val addTranslationUIState = addTranslationViewModel.addTranslationUIState) { when (val addTranslationUIState = addTranslationArtifactVersionViewModel.addTranslationArtifactVersionUIState) {
is AddTranslationUIState.Error -> { is AddTranslationArtifactVersionUIState.Error -> {
Column( Column(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally horizontalAlignment = Alignment.CenterHorizontally
@@ -89,7 +89,7 @@ fun AddTranslationScreen(
} }
} }
is AddTranslationUIState.Loaded -> { is AddTranslationArtifactVersionUIState.Loaded -> {
val dialectNameFieldState = rememberTextFieldState() val dialectNameFieldState = rememberTextFieldState()
val dialectCountryFieldState = rememberTextFieldState() val dialectCountryFieldState = rememberTextFieldState()
val dialectLanguageFieldState = rememberTextFieldState() val dialectLanguageFieldState = rememberTextFieldState()
@@ -118,7 +118,7 @@ fun AddTranslationScreen(
floatingActionButton = { floatingActionButton = {
ExtendedFloatingActionButton( ExtendedFloatingActionButton(
onClick = { onClick = {
addTranslationViewModel.addTranslation( addTranslationArtifactVersionViewModel.addTranslation(
localChatRoom = addTranslationUIState.localChatRoom, localChatRoom = addTranslationUIState.localChatRoom,
existingDialectId = selectedDialectId, existingDialectId = selectedDialectId,
dialectNameField = dialectNameFieldState, dialectNameField = dialectNameFieldState,
@@ -228,7 +228,7 @@ fun AddTranslationScreen(
} }
} }
AddTranslationUIState.Loading -> { AddTranslationArtifactVersionUIState.Loading -> {
Column( Column(
modifier = Modifier.fillMaxWidth().padding(20.dp), modifier = Modifier.fillMaxWidth().padding(20.dp),
horizontalAlignment = Alignment.CenterHorizontally, horizontalAlignment = Alignment.CenterHorizontally,
@@ -247,23 +247,23 @@ fun AddTranslationScreen(
} }
LaunchedEffect(true) { LaunchedEffect(true) {
if (initialAddTranslationUIState == AddTranslationUIState.Loading) { if (initialAddTranslationArtifactVersionUIState == AddTranslationArtifactVersionUIState.Loading) {
addTranslationViewModel.initiateAddTranslation() addTranslationArtifactVersionViewModel.initiateAddTranslation()
} }
} }
} }
@Preview @Preview
@Composable @Composable
private fun AddTranslationScreenPreview() { private fun AddTranslationArtifactVersionScreenPreview() {
TorchTheme { TorchTheme {
Surface(modifier = Modifier.fillMaxSize()) { Surface(modifier = Modifier.fillMaxSize()) {
AddTranslationScreen( AddTranslationArtifactVersionScreen(
activeUserPublicKey = "", activeUserPublicKey = "",
artifactId = "artifactId", artifactId = "artifactId",
chatRoomId = "chatRoomId", chatRoomId = "chatRoomId",
relayHint = null, relayHint = null,
initialAddTranslationUIState = AddTranslationUIState.Loaded( initialAddTranslationArtifactVersionUIState = AddTranslationArtifactVersionUIState.Loaded(
localChatRoom = LocalChatRoom( localChatRoom = LocalChatRoom(
chatRoom = ChatRoom( chatRoom = ChatRoom(
id = "", id = "",
@@ -99,7 +99,7 @@ import press.mantra.compose.ui.composable.navigation.routes.TranslationChapterRo
import press.mantra.compose.ui.composable.navigation.routes.TranslationArtifactVersionDetailRoute import press.mantra.compose.ui.composable.navigation.routes.TranslationArtifactVersionDetailRoute
import press.mantra.compose.ui.composable.ArtifactDetailScreen import press.mantra.compose.ui.composable.ArtifactDetailScreen
import press.mantra.compose.ui.composable.AddChapterScreen import press.mantra.compose.ui.composable.AddChapterScreen
import press.mantra.compose.ui.composable.AddTranslationScreen import press.mantra.compose.ui.composable.AddTranslationArtifactVersionScreen
import press.mantra.compose.ui.composable.ChapterDetailScreen import press.mantra.compose.ui.composable.ChapterDetailScreen
import press.mantra.compose.ui.composable.TranslateChunkScreen import press.mantra.compose.ui.composable.TranslateChunkScreen
import press.mantra.compose.ui.composable.TranslationChapterScreen import press.mantra.compose.ui.composable.TranslationChapterScreen
@@ -803,7 +803,7 @@ fun MantraNavHost(
composable<AddTranslationRoute> { backStackEntry -> composable<AddTranslationRoute> { backStackEntry ->
val route = backStackEntry.toRoute<AddTranslationRoute>() val route = backStackEntry.toRoute<AddTranslationRoute>()
AddTranslationScreen( AddTranslationArtifactVersionScreen(
activeUserPublicKey = route.activeUserPublicKey, activeUserPublicKey = route.activeUserPublicKey,
artifactId = route.artifactId, artifactId = route.artifactId,
chatRoomId = route.chatRoomId, chatRoomId = route.chatRoomId,
@@ -16,24 +16,22 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.IO import kotlinx.coroutines.IO
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import press.mantra.compose.database.model.ChatRoom
import press.mantra.compose.database.model.intermdiate.LocalChatRoom import press.mantra.compose.database.model.intermdiate.LocalChatRoom
import press.mantra.compose.repository.ChatRepository import press.mantra.compose.repository.ChatRepository
import press.mantra.compose.repository.MantraRepository import press.mantra.compose.repository.MantraRepository
import press.mantra.compose.repository.MarmotRepository import press.mantra.compose.ui.view.state.AddTranslationArtifactVersionUIState
import press.mantra.compose.ui.view.state.AddTranslationUIState
class AddTranslationViewModel( class AddTranslationArtifactVersionViewModel(
val artifactId: String, val artifactId: String,
val chatRoomId: String, val chatRoomId: String,
val activeUserPublicKey: HexKey, val activeUserPublicKey: HexKey,
val relayHint: String?, val relayHint: String?,
initialAddTranslationUIState: AddTranslationUIState, initialAddTranslationArtifactVersionUIState: AddTranslationArtifactVersionUIState,
val mantraRepository: MantraRepository, val mantraRepository: MantraRepository,
val chatRepository: ChatRepository, val chatRepository: ChatRepository,
): ViewModel() { ): ViewModel() {
var addTranslationUIState: AddTranslationUIState by mutableStateOf(initialAddTranslationUIState) var addTranslationArtifactVersionUIState: AddTranslationArtifactVersionUIState by mutableStateOf(initialAddTranslationArtifactVersionUIState)
private set private set
private val logger = Logger.withTag(TAG) private val logger = Logger.withTag(TAG)
@@ -44,10 +42,10 @@ class AddTranslationViewModel(
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
val artifact = mantraRepository.getArtifact(artifactId) val artifact = mantraRepository.getArtifact(artifactId)
val localChatRoom = chatRepository.getChatRoomByIdentifier(chatRoomId) val localChatRoom = chatRepository.getChatRoomByIdentifier(chatRoomId)
addTranslationUIState = if (artifact == null || localChatRoom == null) { addTranslationArtifactVersionUIState = if (artifact == null || localChatRoom == null) {
AddTranslationUIState.Error("Couldn't find the artifact") AddTranslationArtifactVersionUIState.Error("Couldn't find the artifact")
} else { } else {
AddTranslationUIState.Loaded( AddTranslationArtifactVersionUIState.Loaded(
artifact = artifact, artifact = artifact,
localChatRoom = localChatRoom, localChatRoom = localChatRoom,
dialects = mantraRepository.getDialects(chatRoomId), dialects = mantraRepository.getDialects(chatRoomId),
@@ -96,10 +94,10 @@ class AddTranslationViewModel(
userPublicKey = activeUserPublicKey, userPublicKey = activeUserPublicKey,
)?.id ?: return@runCatching null )?.id ?: return@runCatching null
} else { } else {
existingDialectId!! existingDialectId
} }
mantraRepository.addTranslation( mantraRepository.addTranslationArtifactVersion(
artifactId = artifactId, artifactId = artifactId,
dialectId = dialectId, dialectId = dialectId,
chatRoomId = chatRoomId, chatRoomId = chatRoomId,
@@ -136,17 +134,17 @@ class AddTranslationViewModel(
artifactId: String, artifactId: String,
chatRoomId: String, chatRoomId: String,
relayHint: String?, relayHint: String?,
initialAddTranslationUIState: AddTranslationUIState = AddTranslationUIState.Loading, initialAddTranslationArtifactVersionUIState: AddTranslationArtifactVersionUIState = AddTranslationArtifactVersionUIState.Loading,
mantraRepository: MantraRepository, mantraRepository: MantraRepository,
chatRepository: ChatRepository chatRepository: ChatRepository
): ViewModelProvider.Factory = viewModelFactory { ): ViewModelProvider.Factory = viewModelFactory {
initializer { initializer {
AddTranslationViewModel( AddTranslationArtifactVersionViewModel(
activeUserPublicKey = activeUserPublicKey, activeUserPublicKey = activeUserPublicKey,
artifactId = artifactId, artifactId = artifactId,
chatRoomId = chatRoomId, chatRoomId = chatRoomId,
relayHint = relayHint, relayHint = relayHint,
initialAddTranslationUIState = initialAddTranslationUIState, initialAddTranslationArtifactVersionUIState = initialAddTranslationArtifactVersionUIState,
mantraRepository = mantraRepository, mantraRepository = mantraRepository,
chatRepository = chatRepository chatRepository = chatRepository
) )
@@ -4,16 +4,16 @@ import press.mantra.compose.database.model.MantraArtifact
import press.mantra.compose.database.model.MantraDialect import press.mantra.compose.database.model.MantraDialect
import press.mantra.compose.database.model.intermdiate.LocalChatRoom import press.mantra.compose.database.model.intermdiate.LocalChatRoom
sealed interface AddTranslationUIState { sealed interface AddTranslationArtifactVersionUIState {
data class Loaded( data class Loaded(
val localChatRoom: LocalChatRoom, val localChatRoom: LocalChatRoom,
val artifact: MantraArtifact, val artifact: MantraArtifact,
val dialects: List<MantraDialect> = emptyList(), val dialects: List<MantraDialect> = emptyList(),
): AddTranslationUIState ): AddTranslationArtifactVersionUIState
data class Error( data class Error(
val message: String val message: String
): AddTranslationUIState ): AddTranslationArtifactVersionUIState
data object Loading: AddTranslationUIState data object Loading: AddTranslationArtifactVersionUIState
} }