Add and broadcast translation artifact version
We might not want to do translation chunk scaffolding
This commit is contained in:
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,
|
||||||
|
|||||||
+6
-102
@@ -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? =
|
||||||
|
|||||||
+4
-4
@@ -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,
|
||||||
|
|||||||
+17
-17
@@ -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 = "",
|
||||||
+2
-2
@@ -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,
|
||||||
|
|||||||
+12
-14
@@ -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
-4
@@ -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
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user