Merge branch 'claude/admiring-mahavira-a862d1' into artifacts

This commit is contained in:
Kgothatso Ngako
2026-07-26 02:41:29 +02:00
6 changed files with 39 additions and 39 deletions

View File

@@ -43,7 +43,7 @@ import press.mantra.compose.ui.composable.navigation.routes.AddChapterRoute
import press.mantra.compose.ui.composable.navigation.routes.AddTranslationRoute
import press.mantra.compose.ui.composable.navigation.routes.ChapterDetailRoute
import press.mantra.compose.ui.composable.navigation.routes.Route
import press.mantra.compose.ui.composable.navigation.routes.TranslationDetailRoute
import press.mantra.compose.ui.composable.navigation.routes.TranslationArtifactVersionDetailRoute
import press.mantra.compose.ui.composable.widgets.LoadingDataIndicator
import press.mantra.compose.ui.theme.TorchTheme
import press.mantra.compose.ui.view.model.ArtifactDetailViewModel
@@ -233,7 +233,7 @@ fun ArtifactDetailScreen(
Card(
onClick = {
onNavigateToRoute.invoke(
TranslationDetailRoute(
TranslationArtifactVersionDetailRoute(
activeUserPublicKey = activeUserPublicKey,
translationArtifactVersionId = translation.id,
chatRoomId = chatRoomId,

View File

@@ -39,34 +39,34 @@ import press.mantra.compose.ui.composable.navigation.routes.TranslationChapterRo
import press.mantra.compose.ui.composable.widgets.DetailRow
import press.mantra.compose.ui.composable.widgets.LoadingDataIndicator
import press.mantra.compose.ui.theme.TorchTheme
import press.mantra.compose.ui.view.model.TranslationDetailViewModel
import press.mantra.compose.ui.view.state.TranslationDetailUIState
import press.mantra.compose.ui.view.model.TranslationArtifactVersionDetailViewModel
import press.mantra.compose.ui.view.state.TranslationArtifactVersionDetailUIState
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TranslationDetailScreen(
fun TranslationArtifactVersionDetailScreen(
activeUserPublicKey: HexKey,
translationArtifactVersionId: String,
chatRoomId: String,
relayHint: String?,
initialTranslationDetailUIState: TranslationDetailUIState = TranslationDetailUIState.Loading,
initialTranslationArtifactVersionDetailUIState: TranslationArtifactVersionDetailUIState = TranslationArtifactVersionDetailUIState.Loading,
mantraRepository: MantraRepository,
onNavigateToRoute: (Route) -> Unit,
onNavigateBack: () -> Unit,
) {
val translationDetailViewModel: TranslationDetailViewModel = viewModel(
factory = TranslationDetailViewModel.factory(
val translationDetailViewModel: TranslationArtifactVersionDetailViewModel = viewModel(
factory = TranslationArtifactVersionDetailViewModel.factory(
activeUserPublicKey = activeUserPublicKey,
translationArtifactVersionId = translationArtifactVersionId,
chatRoomId = chatRoomId,
relayHint = relayHint,
initialTranslationDetailUIState = initialTranslationDetailUIState,
initialTranslationArtifactVersionDetailUIState = initialTranslationArtifactVersionDetailUIState,
mantraRepository = mantraRepository,
)
)
when (val translationDetailUIState = translationDetailViewModel.translationDetailUIState) {
is TranslationDetailUIState.Error -> {
is TranslationArtifactVersionDetailUIState.Error -> {
Column(
modifier = Modifier.fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally
@@ -76,7 +76,7 @@ fun TranslationDetailScreen(
}
}
is TranslationDetailUIState.Loaded -> {
is TranslationArtifactVersionDetailUIState.Loaded -> {
val translation = translationDetailUIState.translation
Scaffold(
topBar = {
@@ -163,7 +163,7 @@ fun TranslationDetailScreen(
}
}
TranslationDetailUIState.Loading -> {
TranslationArtifactVersionDetailUIState.Loading -> {
Column(
modifier = Modifier.fillMaxWidth().padding(20.dp),
horizontalAlignment = Alignment.CenterHorizontally,
@@ -182,23 +182,23 @@ fun TranslationDetailScreen(
}
LaunchedEffect(true) {
if (initialTranslationDetailUIState == TranslationDetailUIState.Loading) {
translationDetailViewModel.initiateTranslationDetail()
if (initialTranslationArtifactVersionDetailUIState == TranslationArtifactVersionDetailUIState.Loading) {
translationDetailViewModel.initiateTranslationArtifactVersionDetail()
}
}
}
@Preview
@Composable
private fun TranslationDetailScreenPreview() {
private fun TranslationArtifactVersionDetailScreenPreview() {
TorchTheme {
Surface(modifier = Modifier.fillMaxSize()) {
TranslationDetailScreen(
TranslationArtifactVersionDetailScreen(
activeUserPublicKey = "",
translationArtifactVersionId = "translationId",
chatRoomId = "chatRoomId",
relayHint = null,
initialTranslationDetailUIState = TranslationDetailUIState.Loaded(
initialTranslationArtifactVersionDetailUIState = TranslationArtifactVersionDetailUIState.Loaded(
translation = MantraTranslationArtifactVersion(
id = "translationId",
publicKey = "author",

View File

@@ -95,14 +95,14 @@ import press.mantra.compose.ui.composable.navigation.routes.ArtifactDetailRoute
import press.mantra.compose.ui.composable.navigation.routes.ChapterDetailRoute
import press.mantra.compose.ui.composable.navigation.routes.TranslateChunkRoute
import press.mantra.compose.ui.composable.navigation.routes.TranslationChapterRoute
import press.mantra.compose.ui.composable.navigation.routes.TranslationDetailRoute
import press.mantra.compose.ui.composable.navigation.routes.TranslationArtifactVersionDetailRoute
import press.mantra.compose.ui.composable.ArtifactDetailScreen
import press.mantra.compose.ui.composable.AddChapterScreen
import press.mantra.compose.ui.composable.AddTranslationScreen
import press.mantra.compose.ui.composable.ChapterDetailScreen
import press.mantra.compose.ui.composable.TranslateChunkScreen
import press.mantra.compose.ui.composable.TranslationChapterScreen
import press.mantra.compose.ui.composable.TranslationDetailScreen
import press.mantra.compose.ui.composable.TranslationArtifactVersionDetailScreen
@Composable
fun MantraNavHost(
@@ -722,10 +722,10 @@ fun MantraNavHost(
}
)
}
composable<TranslationDetailRoute> { backStackEntry ->
val route = backStackEntry.toRoute<TranslationDetailRoute>()
composable<TranslationArtifactVersionDetailRoute> { backStackEntry ->
val route = backStackEntry.toRoute<TranslationArtifactVersionDetailRoute>()
TranslationDetailScreen(
TranslationArtifactVersionDetailScreen(
activeUserPublicKey = route.activeUserPublicKey,
translationArtifactVersionId = route.translationArtifactVersionId,
chatRoomId = route.chatRoomId,

View File

@@ -3,7 +3,7 @@ package press.mantra.compose.ui.composable.navigation.routes
import kotlinx.serialization.Serializable
@Serializable
data class TranslationDetailRoute(
data class TranslationArtifactVersionDetailRoute(
val activeUserPublicKey: String,
val translationArtifactVersionId: String,
val chatRoomId: String,

View File

@@ -15,29 +15,29 @@ import kotlinx.coroutines.IO
import kotlinx.coroutines.launch
import press.mantra.compose.repository.MantraRepository
import press.mantra.compose.ui.view.state.TranslationChapterProgress
import press.mantra.compose.ui.view.state.TranslationDetailUIState
import press.mantra.compose.ui.view.state.TranslationArtifactVersionDetailUIState
class TranslationDetailViewModel(
class TranslationArtifactVersionDetailViewModel(
val translationArtifactVersionId: String,
val chatRoomId: String,
val activeUserPublicKey: HexKey,
val relayHint: String?,
initialTranslationDetailUIState: TranslationDetailUIState,
initialTranslationArtifactVersionDetailUIState: TranslationArtifactVersionDetailUIState,
val mantraRepository: MantraRepository,
): ViewModel() {
var translationDetailUIState: TranslationDetailUIState by mutableStateOf(initialTranslationDetailUIState)
var translationDetailUIState: TranslationArtifactVersionDetailUIState by mutableStateOf(initialTranslationArtifactVersionDetailUIState)
private set
private val logger = Logger.withTag(TAG)
fun initiateTranslationDetail() {
logger.d("initiateTranslationDetail: $translationArtifactVersionId")
fun initiateTranslationArtifactVersionDetail() {
logger.d("initiateTranslationArtifactVersionDetail: $translationArtifactVersionId")
viewModelScope.launch(Dispatchers.IO) {
val translation = mantraRepository.getTranslation(translationArtifactVersionId)
translationDetailUIState = if (translation == null) {
TranslationDetailUIState.Error("Couldn't find the translation")
TranslationArtifactVersionDetailUIState.Error("Couldn't find the translation")
} else {
val chapters = mantraRepository.getTranslationChapters(translationArtifactVersionId)
.map { chapter ->
@@ -48,7 +48,7 @@ class TranslationDetailViewModel(
translatedChunks = chunks.count { it.text.isNotBlank() },
)
}
TranslationDetailUIState.Loaded(
TranslationArtifactVersionDetailUIState.Loaded(
translation = translation,
chapters = chapters,
)
@@ -57,23 +57,23 @@ class TranslationDetailViewModel(
}
companion object {
private const val TAG = "TranslationDetailViewModel"
private const val TAG = "TranslationArtifactVersionDetailViewModel"
fun factory(
activeUserPublicKey: HexKey,
translationArtifactVersionId: String,
chatRoomId: String,
relayHint: String?,
initialTranslationDetailUIState: TranslationDetailUIState = TranslationDetailUIState.Loading,
initialTranslationArtifactVersionDetailUIState: TranslationArtifactVersionDetailUIState = TranslationArtifactVersionDetailUIState.Loading,
mantraRepository: MantraRepository,
): ViewModelProvider.Factory = viewModelFactory {
initializer {
TranslationDetailViewModel(
TranslationArtifactVersionDetailViewModel(
activeUserPublicKey = activeUserPublicKey,
translationArtifactVersionId = translationArtifactVersionId,
chatRoomId = chatRoomId,
relayHint = relayHint,
initialTranslationDetailUIState = initialTranslationDetailUIState,
initialTranslationArtifactVersionDetailUIState = initialTranslationArtifactVersionDetailUIState,
mantraRepository = mantraRepository,
)
}

View File

@@ -10,15 +10,15 @@ data class TranslationChapterProgress(
val translatedChunks: Int,
)
sealed interface TranslationDetailUIState {
sealed interface TranslationArtifactVersionDetailUIState {
data class Loaded(
val translation: MantraTranslationArtifactVersion,
val chapters: List<TranslationChapterProgress> = emptyList(),
): TranslationDetailUIState
): TranslationArtifactVersionDetailUIState
data class Error(
val message: String
): TranslationDetailUIState
): TranslationArtifactVersionDetailUIState
data object Loading: TranslationDetailUIState
data object Loading: TranslationArtifactVersionDetailUIState
}