Skip to content

Commit d73711c

Browse files
committed
Snappy back navigation
1 parent 20200b8 commit d73711c

8 files changed

Lines changed: 44 additions & 26 deletions

File tree

composeApp/src/androidMain/kotlin/com/linuxcommandlibrary/app/platform/Platform.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import androidx.compose.runtime.remember
1010
import androidx.compose.ui.graphics.vector.ImageVector
1111
import androidx.compose.ui.platform.LocalContext
1212

13+
actual val isIOS: Boolean = false
1314
actual val showRateAppButton: Boolean = true
1415
actual val showAndroidTerminalTip: Boolean = Build.VERSION.SDK_INT >= 35
1516
actual val backIcon: ImageVector = Icons.AutoMirrored.Filled.ArrowBack

composeApp/src/commonMain/kotlin/com/linuxcommandlibrary/app/App.kt

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.linuxcommandlibrary.app
22

33
import androidx.compose.animation.AnimatedVisibility
4+
import androidx.compose.animation.EnterTransition
5+
import androidx.compose.animation.ExitTransition
46
import androidx.compose.animation.core.tween
57
import androidx.compose.animation.fadeIn
68
import androidx.compose.animation.fadeOut
@@ -18,13 +20,15 @@ import androidx.compose.runtime.getValue
1820
import androidx.compose.runtime.remember
1921
import androidx.compose.ui.Modifier
2022
import androidx.navigation.NavDestination.Companion.hasRoute
23+
import androidx.navigation.NavGraphBuilder
2124
import androidx.navigation.compose.NavHost
2225
import androidx.navigation.compose.composable
2326
import androidx.navigation.compose.currentBackStackEntryAsState
2427
import androidx.navigation.compose.rememberNavController
2528
import androidx.navigation.toRoute
2629
import com.linuxcommandlibrary.app.data.BasicsRepository
2730
import com.linuxcommandlibrary.app.data.CommandsRepository
31+
import com.linuxcommandlibrary.app.platform.isIOS
2832
import com.linuxcommandlibrary.app.platform.rememberOpenAppAction
2933
import com.linuxcommandlibrary.app.ui.composables.BottomBar
3034
import com.linuxcommandlibrary.app.ui.composables.DetailTopBar
@@ -180,10 +184,7 @@ fun LinuxApp(initialDeeplink: String? = null) {
180184
modifier = Modifier
181185
.padding(innerPadding),
182186
) {
183-
NavHost(
184-
navController = navController,
185-
startDestination = initialRoute,
186-
) {
187+
val navGraphBuilder: NavGraphBuilder.() -> Unit = {
187188
composable<Route.Basics> {
188189
val viewModel: BasicCategoriesViewModel = koinInject()
189190
BasicCategoriesScreen(viewModel = viewModel, onNavigate = onNavigate)
@@ -217,6 +218,21 @@ fun LinuxApp(initialDeeplink: String? = null) {
217218
}
218219
}
219220
}
221+
if (isIOS) {
222+
NavHost(
223+
navController = navController,
224+
startDestination = initialRoute,
225+
builder = navGraphBuilder,
226+
)
227+
} else {
228+
NavHost(
229+
navController = navController,
230+
startDestination = initialRoute,
231+
popEnterTransition = { EnterTransition.None },
232+
popExitTransition = { ExitTransition.None },
233+
builder = navGraphBuilder,
234+
)
235+
}
220236

221237
val isSearchVisible = searchState.searchText.isNotEmpty() && !isOnCommandDetail
222238
AnimatedVisibility(

composeApp/src/commonMain/kotlin/com/linuxcommandlibrary/app/platform/Platform.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.linuxcommandlibrary.app.platform
33
import androidx.compose.runtime.Composable
44
import androidx.compose.ui.graphics.vector.ImageVector
55

6+
expect val isIOS: Boolean
67
expect val showRateAppButton: Boolean
78
expect val showAndroidTerminalTip: Boolean
89
expect val backIcon: ImageVector

composeApp/src/desktopMain/kotlin/com/linuxcommandlibrary/app/platform/Platform.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import androidx.compose.material.icons.automirrored.filled.ArrowBack
55
import androidx.compose.runtime.Composable
66
import androidx.compose.ui.graphics.vector.ImageVector
77

8+
actual val isIOS: Boolean = false
89
actual val showRateAppButton: Boolean = false
910
actual val showAndroidTerminalTip: Boolean = false
1011
actual val backIcon: ImageVector = Icons.AutoMirrored.Filled.ArrowBack

composeApp/src/iosMain/kotlin/com/linuxcommandlibrary/app/platform/Platform.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import androidx.compose.material.icons.automirrored.filled.ArrowBackIos
55
import androidx.compose.runtime.Composable
66
import androidx.compose.ui.graphics.vector.ImageVector
77

8+
actual val isIOS: Boolean = true
89
actual val showRateAppButton: Boolean = false
910
actual val showAndroidTerminalTip: Boolean = false
1011
actual val backIcon: ImageVector = Icons.AutoMirrored.Filled.ArrowBackIos

iosApp/iosApp/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
<key>CFBundlePackageType</key>
1818
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
1919
<key>CFBundleShortVersionString</key>
20-
<string>3.6.1</string>
20+
<string>3.6.2</string>
2121
<key>CFBundleVersion</key>
2222
<string>1</string>
2323
<key>LSRequiresIPhoneOS</key>

websiteBuilder/src/main/kotlin/com/linuxcommandlibrary/desktop/MarkdownBuilder.kt

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package com.linuxcommandlibrary.desktop
22

3+
import org.json.JSONObject
34
import java.io.File
45
import java.io.PrintStream
56
import java.net.HttpURLConnection
67
import java.net.URI
7-
import org.json.JSONObject
88

99
/* Copyright 2022 Simon Schubert
1010
*
@@ -175,28 +175,26 @@ class MarkdownBuilder {
175175
stream.close()
176176
}
177177

178-
private fun getPublicSponsors(): Pair<List<Pair<String, String>>, List<Pair<String, String>>> {
179-
return try {
180-
val connection = URI("https://ghs.vercel.app/v3/sponsors/SimonSchubert").toURL()
181-
.openConnection() as HttpURLConnection
182-
connection.connectTimeout = 5000
183-
connection.readTimeout = 5000
184-
185-
val response = JSONObject(connection.inputStream.bufferedReader().readText())
186-
val sponsors = response.getJSONObject("sponsors")
178+
private fun getPublicSponsors(): Pair<List<Pair<String, String>>, List<Pair<String, String>>> = try {
179+
val connection = URI("https://ghs.vercel.app/v3/sponsors/SimonSchubert").toURL()
180+
.openConnection() as HttpURLConnection
181+
connection.connectTimeout = 5000
182+
connection.readTimeout = 5000
187183

188-
fun parseSponsors(array: org.json.JSONArray) = (0 until array.length()).map { i ->
189-
val sponsor = array.getJSONObject(i)
190-
Pair(sponsor.getString("username"), sponsor.getString("avatar"))
191-
}
184+
val response = JSONObject(connection.inputStream.bufferedReader().readText())
185+
val sponsors = response.getJSONObject("sponsors")
192186

193-
Pair(
194-
parseSponsors(sponsors.getJSONArray("current")),
195-
parseSponsors(sponsors.getJSONArray("past")).take(10)
196-
)
197-
} catch (e: Exception) {
198-
println("Failed to fetch sponsors: ${e.message}")
199-
Pair(emptyList(), emptyList())
187+
fun parseSponsors(array: org.json.JSONArray) = (0 until array.length()).map { i ->
188+
val sponsor = array.getJSONObject(i)
189+
Pair(sponsor.getString("username"), sponsor.getString("avatar"))
200190
}
191+
192+
Pair(
193+
parseSponsors(sponsors.getJSONArray("current")),
194+
parseSponsors(sponsors.getJSONArray("past")).take(10),
195+
)
196+
} catch (e: Exception) {
197+
println("Failed to fetch sponsors: ${e.message}")
198+
Pair(emptyList(), emptyList())
201199
}
202200
}

0 commit comments

Comments
 (0)