package exh.ui.metadata import android.os.Bundle import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.asPaddingValues import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.items import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.core.os.bundleOf import eu.kanade.domain.manga.interactor.GetManga import eu.kanade.domain.manga.model.Manga import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.EmptyScreen import eu.kanade.presentation.components.LoadingScreen import eu.kanade.presentation.components.Scaffold import eu.kanade.presentation.components.ScrollbarLazyColumn import eu.kanade.presentation.util.clickableNoIndication import eu.kanade.presentation.util.plus import eu.kanade.presentation.util.topPaddingValues import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.ui.base.controller.FullComposeController import eu.kanade.tachiyomi.ui.manga.MangaController import eu.kanade.tachiyomi.util.system.copyToClipboard import kotlinx.coroutines.runBlocking import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class MetadataViewController : FullComposeController { constructor(manga: Manga) : super( bundleOf( MangaController.MANGA_EXTRA to manga.id, ), ) { this.manga = manga source = Injekt.get().getOrStub(manga.source) } constructor(mangaId: Long) : this( runBlocking { Injekt.get().await(mangaId)!! }, ) @Suppress("unused") constructor(bundle: Bundle) : this(bundle.getLong(MangaController.MANGA_EXTRA)) var manga: Manga? = null private set var source: Source? = null private set override fun createPresenter(): MetadataViewPresenter { return MetadataViewPresenter(manga!!, source!!) } @Composable override fun ComposeContent() { val state by presenter.state.collectAsState() Scaffold( topBar = { scrollBehavior -> AppBar( title = manga?.title, navigateUp = router::popCurrentController, scrollBehavior = scrollBehavior, ) }, ) { paddingValues -> when (val state = state) { MetadataViewState.Loading -> LoadingScreen() MetadataViewState.MetadataNotFound -> EmptyScreen(R.string.no_results_found) MetadataViewState.SourceNotFound -> EmptyScreen(R.string.source_empty_screen) is MetadataViewState.Success -> { val context = LocalContext.current val items = remember(state.meta) { state.meta.getExtraInfoPairs(context) } ScrollbarLazyColumn( contentPadding = paddingValues + WindowInsets.navigationBars.asPaddingValues() + topPaddingValues, ) { items(items) { (title, text) -> Row( Modifier .fillMaxWidth() .clickableNoIndication( onLongClick = { context.copyToClipboard(title, text) }, onClick = {} ) .padding(vertical = 8.dp), ) { Text( title, modifier = Modifier .width(140.dp) .padding(start = 16.dp), style = MaterialTheme.typography.bodyMedium, ) Text( text, modifier = Modifier .fillMaxWidth() .padding(start = 8.dp, end = 8.dp), style = MaterialTheme.typography.bodyMedium, color = LocalContentColor.current.copy(alpha = 0.7F), ) } } } } } } } }