mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-14 21:07:04 +05:30
common: extract htmlToMarkdown
passing style to a composition local
This commit is contained in:
parent
b3fda724ad
commit
4622162d09
6 changed files with 50 additions and 13 deletions
|
@ -9,6 +9,7 @@ import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
|
||||||
import androidx.core.view.WindowCompat
|
import androidx.core.view.WindowCompat
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import dev.msfjarvis.claw.android.ui.LobstersApp
|
import dev.msfjarvis.claw.android.ui.LobstersApp
|
||||||
|
import dev.msfjarvis.claw.common.comments.HTMLConverter
|
||||||
import dev.msfjarvis.claw.common.urllauncher.UrlLauncher
|
import dev.msfjarvis.claw.common.urllauncher.UrlLauncher
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
@ -16,6 +17,7 @@ import javax.inject.Inject
|
||||||
class MainActivity : ComponentActivity() {
|
class MainActivity : ComponentActivity() {
|
||||||
|
|
||||||
@Inject lateinit var urlLauncher: UrlLauncher
|
@Inject lateinit var urlLauncher: UrlLauncher
|
||||||
|
@Inject lateinit var htmlConverter: HTMLConverter
|
||||||
private var webUri: String? = null
|
private var webUri: String? = null
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
@ -25,6 +27,7 @@ class MainActivity : ComponentActivity() {
|
||||||
setContent {
|
setContent {
|
||||||
LobstersApp(
|
LobstersApp(
|
||||||
urlLauncher = urlLauncher,
|
urlLauncher = urlLauncher,
|
||||||
|
htmlConverter = htmlConverter,
|
||||||
) { url -> webUri = url }
|
) { url -> webUri = url }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
package dev.msfjarvis.claw.android.injection
|
||||||
|
|
||||||
|
import dagger.Module
|
||||||
|
import dagger.Provides
|
||||||
|
import dagger.hilt.InstallIn
|
||||||
|
import dagger.hilt.components.SingletonComponent
|
||||||
|
import dev.msfjarvis.claw.common.comments.HTMLConverter
|
||||||
|
import io.github.furstenheim.CopyDown
|
||||||
|
|
||||||
|
@Module
|
||||||
|
@InstallIn(SingletonComponent::class)
|
||||||
|
object HTMLConverterModule {
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
fun provideHTMLConverter() =
|
||||||
|
object : HTMLConverter {
|
||||||
|
private val copydown = CopyDown()
|
||||||
|
|
||||||
|
override fun convertHTMLToMarkdown(html: String): String {
|
||||||
|
return copydown.convert(html)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -31,11 +31,12 @@ import com.google.accompanist.insets.statusBarsPadding
|
||||||
import com.google.accompanist.systemuicontroller.rememberSystemUiController
|
import com.google.accompanist.systemuicontroller.rememberSystemUiController
|
||||||
import dev.msfjarvis.claw.android.viewmodel.ClawViewModel
|
import dev.msfjarvis.claw.android.viewmodel.ClawViewModel
|
||||||
import dev.msfjarvis.claw.common.comments.CommentsPage
|
import dev.msfjarvis.claw.common.comments.CommentsPage
|
||||||
|
import dev.msfjarvis.claw.common.comments.HTMLConverter
|
||||||
|
import dev.msfjarvis.claw.common.comments.LocalHTMLConverter
|
||||||
import dev.msfjarvis.claw.common.posts.PostActions
|
import dev.msfjarvis.claw.common.posts.PostActions
|
||||||
import dev.msfjarvis.claw.common.theme.LobstersTheme
|
import dev.msfjarvis.claw.common.theme.LobstersTheme
|
||||||
import dev.msfjarvis.claw.common.urllauncher.UrlLauncher
|
import dev.msfjarvis.claw.common.urllauncher.UrlLauncher
|
||||||
import dev.msfjarvis.claw.database.local.SavedPost
|
import dev.msfjarvis.claw.database.local.SavedPost
|
||||||
import io.github.furstenheim.CopyDown
|
|
||||||
|
|
||||||
private const val ScrollDelta = 50
|
private const val ScrollDelta = 50
|
||||||
|
|
||||||
|
@ -44,9 +45,9 @@ private const val ScrollDelta = 50
|
||||||
fun LobstersApp(
|
fun LobstersApp(
|
||||||
viewModel: ClawViewModel = viewModel(),
|
viewModel: ClawViewModel = viewModel(),
|
||||||
urlLauncher: UrlLauncher,
|
urlLauncher: UrlLauncher,
|
||||||
|
htmlConverter: HTMLConverter,
|
||||||
setWebUri: (String) -> Unit,
|
setWebUri: (String) -> Unit,
|
||||||
) {
|
) {
|
||||||
val copydown = remember { CopyDown() }
|
|
||||||
val systemUiController = rememberSystemUiController()
|
val systemUiController = rememberSystemUiController()
|
||||||
val scaffoldState = rememberScaffoldState()
|
val scaffoldState = rememberScaffoldState()
|
||||||
val listState = rememberLazyListState()
|
val listState = rememberLazyListState()
|
||||||
|
@ -93,7 +94,11 @@ fun LobstersApp(
|
||||||
}
|
}
|
||||||
LobstersTheme(
|
LobstersTheme(
|
||||||
darkTheme = isSystemInDarkTheme(),
|
darkTheme = isSystemInDarkTheme(),
|
||||||
providedValues = arrayOf(LocalUriHandler provides urlLauncher),
|
providedValues =
|
||||||
|
arrayOf(
|
||||||
|
LocalUriHandler provides urlLauncher,
|
||||||
|
LocalHTMLConverter provides htmlConverter,
|
||||||
|
),
|
||||||
) {
|
) {
|
||||||
ProvideWindowInsets {
|
ProvideWindowInsets {
|
||||||
val useDarkIcons = MaterialTheme.colors.isLight
|
val useDarkIcons = MaterialTheme.colors.isLight
|
||||||
|
@ -134,7 +139,6 @@ fun LobstersApp(
|
||||||
CommentsPage(
|
CommentsPage(
|
||||||
postId = postId,
|
postId = postId,
|
||||||
getDetails = viewModel::getPostComments,
|
getDetails = viewModel::getPostComments,
|
||||||
htmlToMarkdown = { source -> copydown.convert(source) },
|
|
||||||
paddingValues = paddingValues,
|
paddingValues = paddingValues,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,8 +23,8 @@ import dev.msfjarvis.claw.model.LobstersPostDetails
|
||||||
@Composable
|
@Composable
|
||||||
fun CommentsHeader(
|
fun CommentsHeader(
|
||||||
postDetails: LobstersPostDetails,
|
postDetails: LobstersPostDetails,
|
||||||
htmlToMarkdown: (html: String) -> String,
|
|
||||||
) {
|
) {
|
||||||
|
val htmlConverter = LocalHTMLConverter.current
|
||||||
Surface {
|
Surface {
|
||||||
Column(
|
Column(
|
||||||
modifier = Modifier.padding(horizontal = 16.dp, vertical = 4.dp).fillMaxWidth(),
|
modifier = Modifier.padding(horizontal = 16.dp, vertical = 4.dp).fillMaxWidth(),
|
||||||
|
@ -33,7 +33,7 @@ fun CommentsHeader(
|
||||||
PostDetails(
|
PostDetails(
|
||||||
post = postDetails.toDbModel(),
|
post = postDetails.toDbModel(),
|
||||||
)
|
)
|
||||||
MaterialRichText { Markdown(htmlToMarkdown(postDetails.description)) }
|
MaterialRichText { Markdown(htmlConverter.convertHTMLToMarkdown(postDetails.description)) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -41,8 +41,8 @@ fun CommentsHeader(
|
||||||
@Composable
|
@Composable
|
||||||
fun CommentEntry(
|
fun CommentEntry(
|
||||||
comment: Comment,
|
comment: Comment,
|
||||||
htmlToMarkdown: (html: String) -> String,
|
|
||||||
) {
|
) {
|
||||||
|
val htmlConverter = LocalHTMLConverter.current
|
||||||
Divider(color = Color.Gray.copy(0.4f))
|
Divider(color = Color.Gray.copy(0.4f))
|
||||||
Row(modifier = Modifier.wrapContentHeight()) {
|
Row(modifier = Modifier.wrapContentHeight()) {
|
||||||
Column(modifier = Modifier.padding(start = 12.dp, end = 8.dp, top = 4.dp, bottom = 4.dp)) {
|
Column(modifier = Modifier.padding(start = 12.dp, end = 8.dp, top = 4.dp, bottom = 4.dp)) {
|
||||||
|
@ -52,7 +52,7 @@ fun CommentEntry(
|
||||||
contentDescription = "User avatar for ${comment.user.username}",
|
contentDescription = "User avatar for ${comment.user.username}",
|
||||||
)
|
)
|
||||||
MaterialRichText(modifier = Modifier.padding(top = 8.dp)) {
|
MaterialRichText(modifier = Modifier.padding(top = 8.dp)) {
|
||||||
Markdown(htmlToMarkdown(comment.comment))
|
Markdown(htmlConverter.convertHTMLToMarkdown(comment.comment))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,15 +28,14 @@ import dev.msfjarvis.lobsters.ui.comments.NetworkState
|
||||||
@Composable
|
@Composable
|
||||||
private fun CommentsPageInternal(
|
private fun CommentsPageInternal(
|
||||||
details: LobstersPostDetails,
|
details: LobstersPostDetails,
|
||||||
htmlToMarkdown: (html: String) -> String,
|
|
||||||
bottomPadding: Dp,
|
bottomPadding: Dp,
|
||||||
) {
|
) {
|
||||||
LazyColumn(Modifier.padding(bottom = bottomPadding)) {
|
LazyColumn(Modifier.padding(bottom = bottomPadding)) {
|
||||||
item { CommentsHeader(postDetails = details, htmlToMarkdown = htmlToMarkdown) }
|
item { CommentsHeader(postDetails = details) }
|
||||||
|
|
||||||
item { Spacer(modifier = Modifier.height(8.dp)) }
|
item { Spacer(modifier = Modifier.height(8.dp)) }
|
||||||
|
|
||||||
items(details.comments) { item -> CommentEntry(item, htmlToMarkdown) }
|
items(details.comments) { item -> CommentEntry(item) }
|
||||||
|
|
||||||
item { Divider(color = Color.Gray.copy(0.4f)) }
|
item { Divider(color = Color.Gray.copy(0.4f)) }
|
||||||
}
|
}
|
||||||
|
@ -47,7 +46,6 @@ private fun CommentsPageInternal(
|
||||||
fun CommentsPage(
|
fun CommentsPage(
|
||||||
postId: String,
|
postId: String,
|
||||||
getDetails: suspend (String) -> LobstersPostDetails,
|
getDetails: suspend (String) -> LobstersPostDetails,
|
||||||
htmlToMarkdown: (html: String) -> String,
|
|
||||||
paddingValues: PaddingValues,
|
paddingValues: PaddingValues,
|
||||||
) {
|
) {
|
||||||
var postDetails: NetworkState by remember { mutableStateOf(NetworkState.Loading) }
|
var postDetails: NetworkState by remember { mutableStateOf(NetworkState.Loading) }
|
||||||
|
@ -58,7 +56,6 @@ fun CommentsPage(
|
||||||
is NetworkState.Success<*> -> {
|
is NetworkState.Success<*> -> {
|
||||||
CommentsPageInternal(
|
CommentsPageInternal(
|
||||||
(postDetails as NetworkState.Success<LobstersPostDetails>).data,
|
(postDetails as NetworkState.Success<LobstersPostDetails>).data,
|
||||||
htmlToMarkdown,
|
|
||||||
paddingValues.calculateBottomPadding(),
|
paddingValues.calculateBottomPadding(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
package dev.msfjarvis.claw.common.comments
|
||||||
|
|
||||||
|
import androidx.compose.runtime.staticCompositionLocalOf
|
||||||
|
|
||||||
|
/** Defines a contract to convert strings of HTML to Markdown. */
|
||||||
|
fun interface HTMLConverter {
|
||||||
|
fun convertHTMLToMarkdown(html: String): String
|
||||||
|
}
|
||||||
|
|
||||||
|
val LocalHTMLConverter = staticCompositionLocalOf<HTMLConverter> { error("To be provided") }
|
Loading…
Add table
Add a link
Reference in a new issue