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.
This commit is contained in:
Atte149 2026-06-27 21:39:32 +03:00
parent aa37826041
commit 0e41718cde

View file

@ -4,17 +4,22 @@ import android.net.Uri
import androidx.activity.compose.BackHandler import androidx.activity.compose.BackHandler
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize 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.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable 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.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.lifecycle.viewmodel.compose.viewModel
import org.dueattendant149.bookreader.MainViewModel
/** @OptIn(ExperimentalMaterial3Api::class)
* Placeholder reader screen wraps the Episteme reader engine.
* In production this delegates to EpubReaderScreen/PdfViewerScreen based on file type.
*/
@Composable @Composable
fun ReaderScreen( fun ReaderScreen(
bookUri: String, bookUri: String,
@ -22,14 +27,76 @@ fun ReaderScreen(
) { ) {
BackHandler { onBackClick() } BackHandler { onBackClick() }
Box( val context = LocalContext.current
modifier = Modifier.fillMaxSize(), val viewModel: MainViewModel = viewModel(
contentAlignment = Alignment.Center, viewModelStoreOwner = context as androidx.lifecycle.ViewModelStoreOwner,
) { )
Text(
text = "Reader: $bookUri", LaunchedEffect(bookUri) {
color = MaterialTheme.colorScheme.onBackground, val uri = Uri.parse(bookUri)
fontSize = 16.sp, 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,
)
}
}
}
} }