From 0e41718cdec066ebfefede98bb217c7e71435328 Mon Sep 17 00:00:00 2001 From: Atte149 Date: Sat, 27 Jun 2026 21:39:32 +0300 Subject: [PATCH] fix(reader): wire ReaderScreen to Episteme engine via MainViewModel - ReaderScreen now gets MainViewModel from activity scope via viewModel() - Calls viewModel.onFileSelected(uri) to trigger book import/open - Renders EpubReaderScreen for EPUB/FB2/MOBI/etc, PdfViewerScreen for PDF - Shows loading indicator while book is being imported - Shows error message if import fails - ':app:assembleOssDebug' passes, APK deployed. --- .../ui/screens/reader/ReaderScreen.kt | 93 ++++++++++++++++--- 1 file changed, 80 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/dueattendant149/bookreader/ui/screens/reader/ReaderScreen.kt b/app/src/main/java/org/dueattendant149/bookreader/ui/screens/reader/ReaderScreen.kt index 692ba17..7c5ce45 100644 --- a/app/src/main/java/org/dueattendant149/bookreader/ui/screens/reader/ReaderScreen.kt +++ b/app/src/main/java/org/dueattendant149/bookreader/ui/screens/reader/ReaderScreen.kt @@ -4,17 +4,22 @@ import android.net.Uri import androidx.activity.compose.BackHandler import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.sp +import androidx.lifecycle.viewmodel.compose.viewModel +import org.dueattendant149.bookreader.MainViewModel -/** - * Placeholder reader screen — wraps the Episteme reader engine. - * In production this delegates to EpubReaderScreen/PdfViewerScreen based on file type. - */ +@OptIn(ExperimentalMaterial3Api::class) @Composable fun ReaderScreen( bookUri: String, @@ -22,14 +27,76 @@ fun ReaderScreen( ) { BackHandler { onBackClick() } - Box( - modifier = Modifier.fillMaxSize(), - contentAlignment = Alignment.Center, - ) { - Text( - text = "Reader: $bookUri", - color = MaterialTheme.colorScheme.onBackground, - fontSize = 16.sp, - ) + val context = LocalContext.current + val viewModel: MainViewModel = viewModel( + viewModelStoreOwner = context as androidx.lifecycle.ViewModelStoreOwner, + ) + + LaunchedEffect(bookUri) { + val uri = Uri.parse(bookUri) + viewModel.onFileSelected(uri, isFromRecent = false) + } + + val uiState by viewModel.uiState.collectAsState() + + val fileType = uiState.selectedFileType + val isPdf = fileType != null && fileType.name == "PDF" + val isEpub = fileType != null && fileType.name != "PDF" + + Box(modifier = Modifier.fillMaxSize()) { + when { + uiState.isLoading -> { + CircularProgressIndicator( + modifier = Modifier.align(Alignment.Center), + color = MaterialTheme.colorScheme.primary, + ) + } + isEpub && uiState.selectedEpubBook != null -> { + org.dueattendant149.bookreader.epubreader.EpubReaderScreen( + epubBook = uiState.selectedEpubBook!!, + renderMode = uiState.renderMode, + initialLocator = uiState.initialLocator, + initialCfi = uiState.initialCfi, + initialBookmarksJson = uiState.initialBookmarksJson, + isProUser = uiState.isProUser, + coverImagePath = null, + onNavigateBack = { onBackClick() }, + onSavePosition = { _, _, _ -> }, + onBookmarksChanged = { }, + onNavigateToPro = { }, + onRenderModeChange = { }, + customFonts = emptyList(), + onImportFonts = { }, + viewModel = viewModel, + ) + } + isPdf && uiState.selectedPdfUri != null -> { + org.dueattendant149.bookreader.pdf.PdfViewerScreen( + pdfUri = uiState.selectedPdfUri!!, + initialPage = uiState.initialPageInBook, + initialBookmarksJson = uiState.initialBookmarksJson, + isProUser = uiState.isProUser, + onNavigateBack = { onBackClick() }, + onSavePosition = { _, _ -> }, + onBookmarksChanged = { }, + onNavigateToPro = { }, + viewModel = viewModel, + ) + } + uiState.errorMessage != null -> { + Text( + text = uiState.errorMessage!!, + color = MaterialTheme.colorScheme.error, + fontSize = 16.sp, + modifier = Modifier.align(Alignment.Center), + ) + } + else -> { + CircularProgressIndicator( + modifier = Modifier.align(Alignment.Center), + color = MaterialTheme.colorScheme.primary, + ) + } + } } } \ No newline at end of file