Skip to content

Commit

Permalink
added about section
Browse files Browse the repository at this point in the history
  • Loading branch information
DatL4g committed Jul 11, 2024
1 parent aa8d075 commit c9dbbc4
Show file tree
Hide file tree
Showing 16 changed files with 302 additions and 3 deletions.
10 changes: 10 additions & 0 deletions composeApp/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import com.codingfeline.buildkonfig.compiler.FieldSpec
import com.mikepenz.aboutlibraries.plugin.DuplicateMode
import com.mikepenz.aboutlibraries.plugin.DuplicateRule
import org.jetbrains.compose.desktop.application.dsl.TargetFormat
import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalWasmDsl

Expand Down Expand Up @@ -33,6 +35,13 @@ composeCompiler {
enableNonSkippingGroupOptimization.set(true)
}

aboutLibraries {
includePlatform = true
duplicationMode = DuplicateMode.MERGE
duplicationRule = DuplicateRule.GROUP
excludeFields = arrayOf("generated")
}

buildkonfig {
packageName = artifact

Expand Down Expand Up @@ -114,6 +123,7 @@ kotlin {
implementation(libs.serialization.json)
implementation(libs.serialization.protobuf)
implementation(libs.oidc)
implementation(libs.aboutlibraries)
implementation("dev.datlag.sheets-compose-dialogs:option:2.0.0-SNAPSHOT")

implementation(project(":settings"))
Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -71,4 +71,6 @@
<string name="release_text_2">Das solltest du dir ansehen!</string>
<string name="syncing_enabled">Synchronisieren aktiviert</string>
<string name="pip_unsupported">Bild in Bild ist hier nicht verfügbar.</string>
<string name="open_source_licenses">Open-Source Lizenzen</string>
<string name="open_source_licenses_text">Das ist eine Liste von (allen) Bibliotheken, die in diesem Projekt verwendet werden und deren Lizenzen</string>
</resources>
2 changes: 2 additions & 0 deletions composeApp/src/commonMain/composeResources/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -71,4 +71,6 @@
<string name="release_text_2">You should check it out!</string>
<string name="syncing_enabled">Syncing enabled</string>
<string name="pip_unsupported">Picture in Picture is not available in this screen.</string>
<string name="open_source_licenses">Open-Source Licenses</string>
<string name="open_source_licenses_text">This is a list of (all) libraries used in this project and it's licenses</string>
</resources>
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ data object Constants {
const val SYNCING_DOMAIN = "burningseries.datlag"
const val SYNCING_URL = "https://burningseries.datlag/sync/"

const val SPDX_LICENSE_BASE = "https://spdx.org/licenses/"

data object Sponsor {
const val GITHUB = "https://github.com/sponsors/DatL4g"
const val POLAR = "https://polar.sh/DatL4g"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,7 @@ sealed class DialogConfig {

@Serializable
data class Sync(val id: String) : DialogConfig()

@Serializable
data object About : DialogConfig()
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import dev.datlag.burningseries.other.UserHelper
import dev.datlag.burningseries.settings.Settings
import dev.datlag.burningseries.settings.model.Language
import dev.datlag.burningseries.ui.navigation.DialogComponent
import dev.datlag.burningseries.ui.navigation.screen.home.dialog.about.AboutDialogComponent
import dev.datlag.burningseries.ui.navigation.screen.home.dialog.qrcode.QrCodeDialogComponent
import dev.datlag.burningseries.ui.navigation.screen.home.dialog.release.ReleaseDialogComponent
import dev.datlag.burningseries.ui.navigation.screen.home.dialog.settings.SettingsDialogComponent
Expand Down Expand Up @@ -98,7 +99,10 @@ class HomeScreenComponent(
is DialogConfig.Settings -> SettingsDialogComponent(
componentContext = context,
di = di,
onDismiss = dialogNavigation::dismiss
onDismiss = dialogNavigation::dismiss,
onAbout = {
dialogNavigation.activate(DialogConfig.About)
}
)
is DialogConfig.Release -> ReleaseDialogComponent(
componentContext = context,
Expand All @@ -121,6 +125,11 @@ class HomeScreenComponent(
connectId = config.id,
onDismiss = dialogNavigation::dismiss
)
is DialogConfig.About -> AboutDialogComponent(
componentContext = context,
di = di,
onDismiss = dialogNavigation::dismiss
)
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package dev.datlag.burningseries.ui.navigation.screen.home.dialog.about

import dev.datlag.burningseries.ui.navigation.DialogComponent

interface AboutComponent : DialogComponent {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package dev.datlag.burningseries.ui.navigation.screen.home.dialog.about

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.WindowInsetsSides
import androidx.compose.foundation.layout.asPaddingValues
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.only
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material3.BottomSheetDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.ModalBottomSheet
import androidx.compose.material3.Text
import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.produceState
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import com.mikepenz.aboutlibraries.Libs
import com.mikepenz.aboutlibraries.util.withJson
import dev.datlag.burningseries.LocalEdgeToEdge
import dev.datlag.burningseries.common.merge
import dev.datlag.burningseries.composeapp.generated.resources.Res
import dev.datlag.burningseries.composeapp.generated.resources.open_source_licenses
import dev.datlag.burningseries.composeapp.generated.resources.open_source_licenses_text
import dev.datlag.burningseries.ui.navigation.screen.home.dialog.about.component.LibraryCard
import dev.datlag.tooling.compose.withIOContext
import org.jetbrains.compose.resources.ExperimentalResourceApi
import org.jetbrains.compose.resources.stringResource

@OptIn(ExperimentalMaterial3Api::class, ExperimentalResourceApi::class)
@Composable
fun AboutDialog(component: AboutComponent) {
val sheetState = rememberModalBottomSheetState()
val (insets, bottomPadding) = if (LocalEdgeToEdge.current) {
WindowInsets(
left = 0,
top = 0,
right = 0,
bottom = 0
) to BottomSheetDefaults.windowInsets.only(WindowInsetsSides.Bottom).asPaddingValues()
} else {
BottomSheetDefaults.windowInsets to PaddingValues()
}

ModalBottomSheet(
onDismissRequest = component::dismiss,
windowInsets = insets,
sheetState = sheetState
) {
val libs by produceState<Libs?>(null) {
value = withIOContext {
Libs.Builder().withJson(Res.readBytes("files/aboutlibraries.json")).build()
}
}
val libsList = remember(libs) {
libs?.libraries.orEmpty()
}

LazyColumn(
modifier = Modifier.fillMaxWidth(),
contentPadding = bottomPadding.merge(16.dp),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
item {
Text(
modifier = Modifier.fillParentMaxWidth(),
text = stringResource(Res.string.open_source_licenses),
style = MaterialTheme.typography.headlineMedium,
fontWeight = FontWeight.Bold,
textAlign = TextAlign.Center
)
}
item {
Text(
modifier = Modifier.fillParentMaxWidth().padding(vertical = 16.dp),
text = stringResource(Res.string.open_source_licenses_text),
textAlign = TextAlign.Center
)
}
items(libsList, key = { it.uniqueId }) {
LibraryCard(it)
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package dev.datlag.burningseries.ui.navigation.screen.home.dialog.about

import androidx.compose.runtime.Composable
import com.arkivanov.decompose.ComponentContext
import org.kodein.di.DI

class AboutDialogComponent(
componentContext: ComponentContext,
override val di: DI,
private val onDismiss: () -> Unit
) : AboutComponent, ComponentContext by componentContext {

@Composable
override fun render() {
onRender {
AboutDialog(this)
}
}

override fun dismiss() {
onDismiss()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package dev.datlag.burningseries.ui.navigation.screen.home.dialog.about.component

import androidx.compose.foundation.layout.*
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import com.mikepenz.aboutlibraries.entity.Library
import dev.datlag.burningseries.other.Constants

@OptIn(ExperimentalLayoutApi::class)
@Composable
fun LibraryCard(
library: Library
) {
val uriHandler = LocalUriHandler.current
val website = library.website?.ifBlank { null } ?: library.scm?.url?.ifBlank { null }

ElevatedCard(
onClick = {
if (!website.isNullOrBlank()) {
uriHandler.openUri(website)
}
},
modifier = Modifier.fillMaxWidth(),
enabled = !website.isNullOrBlank(),
) {
Column(
modifier = Modifier.fillMaxWidth().padding(8.dp),
verticalArrangement = Arrangement.spacedBy(2.dp, Alignment.CenterVertically)
) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.spacedBy(4.dp),
verticalAlignment = Alignment.CenterVertically
) {
Text(
modifier = Modifier.weight(1F),
text = library.name,
softWrap = true,
overflow = TextOverflow.Ellipsis,
maxLines = 2,
fontWeight = FontWeight.Medium
)
library.artifactVersion?.let {
Text(
text = it,
style = MaterialTheme.typography.bodySmall
)
}
}
Text(
text = library.organization?.name?.ifBlank { null } ?: library.developers.map { it.name }.joinToString(),
style = MaterialTheme.typography.bodySmall,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
softWrap = true
)
FlowRow(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.spacedBy(8.dp),
verticalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterVertically)
) {
library.licenses.forEach { lic ->
val url = lic.url?.ifBlank { null } ?: lic.spdxId?.ifBlank { null }?.let { "${Constants.SPDX_LICENSE_BASE}$it" }

SuggestionChip(
onClick = {
if (!url.isNullOrBlank()) {
uriHandler.openUri(url)
}
},
enabled = !url.isNullOrBlank(),
label = {
Text(text = lic.name)
},
colors = SuggestionChipDefaults.suggestionChipColors(
containerColor = MaterialTheme.colorScheme.tertiary,
labelColor = MaterialTheme.colorScheme.onTertiary
),
border = null
)
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@ interface SettingsComponent : DialogComponent {
fun setLanguage(language: Language)
fun login()
fun logout()
fun about()
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import androidx.compose.ui.unit.dp
import dev.datlag.burningseries.LocalEdgeToEdge
import dev.datlag.burningseries.common.isFullyExpandedOrTargeted
import dev.datlag.burningseries.common.merge
import dev.datlag.burningseries.ui.navigation.screen.home.dialog.settings.component.AboutSection
import dev.datlag.burningseries.ui.navigation.screen.home.dialog.settings.component.GitHubOwnerSection
import dev.datlag.burningseries.ui.navigation.screen.home.dialog.settings.component.GitHubRepoSection
import dev.datlag.burningseries.ui.navigation.screen.home.dialog.settings.component.InfoSection
Expand Down Expand Up @@ -92,6 +93,12 @@ fun SettingsDialog(component: SettingsComponent) {
item {
GitHubOwnerSection(modifier = Modifier.fillParentMaxWidth())
}
item {
AboutSection(
modifier = Modifier.fillParentMaxWidth(),
onClick = component::about
)
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ import org.publicvalue.multiplatform.oidc.flows.CodeAuthFlow
class SettingsDialogComponent(
componentContext: ComponentContext,
override val di: DI,
private val onDismiss: () -> Unit
private val onDismiss: () -> Unit,
private val onAbout: () -> Unit
) : SettingsComponent, ComponentContext by componentContext {

private val settings by instance<Settings.PlatformAppSettings>()
Expand Down Expand Up @@ -60,4 +61,8 @@ class SettingsDialogComponent(
}
}
}

override fun about() {
onAbout()
}
}
Loading

0 comments on commit c9dbbc4

Please sign in to comment.