Skip to content

Commit 0cc2e2a

Browse files
committed
feat(details): prioritize "What's New" section when navigating from updates
This commit introduces a new `isComingFromUpdate` flag to the details screen to improve the user experience when checking for app updates. When this flag is active, the "What's New" (release notes) section is displayed above the "About" (README) section. - **feat(details)**: Added `isComingFromUpdate` parameter to `DetailsViewModel` and `DetailsState`. - **feat(ui)**: Reordered the display of `whatsNew` and `about` sections in `DetailsRoot` based on the `isComingFromUpdate` flag. - **feat(navigation)**: Updated `GithubStoreGraph` and `AppNavigation` to pass the `isComingFromUpdate` flag when navigating from the updates screen. - **refactor(details)**: Simplified `DetailsState` by removing the unused `isTrackable` computed property. - **chore**: Updated Koin view model factory to include the new navigation parameter.
1 parent 4b8b909 commit 0cc2e2a

5 files changed

Lines changed: 88 additions & 50 deletions

File tree

composeApp/src/commonMain/kotlin/zed/rainxch/githubstore/app/navigation/AppNavigation.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ fun AppNavigation(
141141
)
142142
},
143143
viewModel = koinViewModel {
144-
parametersOf(args.repositoryId, args.owner, args.repo)
144+
parametersOf(args.repositoryId, args.owner, args.repo, args.isComingFromUpdate)
145145
}
146146
)
147147
}
@@ -250,7 +250,8 @@ fun AppNavigation(
250250
onNavigateToRepo = { repoId ->
251251
navController.navigate(
252252
GithubStoreGraph.DetailsScreen(
253-
repositoryId = repoId
253+
repositoryId = repoId,
254+
isComingFromUpdate = true
254255
)
255256
)
256257
},

composeApp/src/commonMain/kotlin/zed/rainxch/githubstore/app/navigation/GithubStoreGraph.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ sealed interface GithubStoreGraph {
1717
data class DetailsScreen(
1818
val repositoryId: Long = -1L,
1919
val owner: String = "",
20-
val repo: String = ""
20+
val repo: String = "",
21+
val isComingFromUpdate: Boolean = false,
2122
) : GithubStoreGraph
2223

2324
@Serializable

feature/details/presentation/src/commonMain/kotlin/zed/rainxch/details/presentation/DetailsRoot.kt

Lines changed: 77 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -260,43 +260,84 @@ fun DetailsScreen(
260260
stats(repoStats = stats)
261261
}
262262

263-
state.readmeMarkdown?.let {
264-
about(
265-
readmeMarkdown = state.readmeMarkdown,
266-
readmeLanguage = state.readmeLanguage,
267-
isExpanded = state.isAboutExpanded,
268-
onToggleExpanded = { onAction(DetailsAction.ToggleAboutExpanded) },
269-
collapsedHeight = collapsedSectionHeight,
270-
translationState = state.aboutTranslation,
271-
onTranslateClick = {
272-
onAction(DetailsAction.TranslateAbout(state.deviceLanguageCode))
273-
},
274-
onLanguagePickerClick = {
275-
onAction(DetailsAction.ShowLanguagePicker(TranslationTarget.ABOUT))
276-
},
277-
onToggleTranslation = {
278-
onAction(DetailsAction.ToggleAboutTranslation)
279-
},
280-
)
281-
}
263+
if (state.isComingFromUpdate) {
264+
state.selectedRelease?.let { release ->
265+
whatsNew(
266+
release = release,
267+
isExpanded = state.isWhatsNewExpanded,
268+
onToggleExpanded = { onAction(DetailsAction.ToggleWhatsNewExpanded) },
269+
collapsedHeight = collapsedSectionHeight,
270+
translationState = state.whatsNewTranslation,
271+
onTranslateClick = {
272+
onAction(DetailsAction.TranslateWhatsNew(state.deviceLanguageCode))
273+
},
274+
onLanguagePickerClick = {
275+
onAction(DetailsAction.ShowLanguagePicker(TranslationTarget.WHATS_NEW))
276+
},
277+
onToggleTranslation = {
278+
onAction(DetailsAction.ToggleWhatsNewTranslation)
279+
},
280+
)
281+
}
282282

283-
state.selectedRelease?.let { release ->
284-
whatsNew(
285-
release = release,
286-
isExpanded = state.isWhatsNewExpanded,
287-
onToggleExpanded = { onAction(DetailsAction.ToggleWhatsNewExpanded) },
288-
collapsedHeight = collapsedSectionHeight,
289-
translationState = state.whatsNewTranslation,
290-
onTranslateClick = {
291-
onAction(DetailsAction.TranslateWhatsNew(state.deviceLanguageCode))
292-
},
293-
onLanguagePickerClick = {
294-
onAction(DetailsAction.ShowLanguagePicker(TranslationTarget.WHATS_NEW))
295-
},
296-
onToggleTranslation = {
297-
onAction(DetailsAction.ToggleWhatsNewTranslation)
298-
},
299-
)
283+
state.readmeMarkdown?.let {
284+
about(
285+
readmeMarkdown = state.readmeMarkdown,
286+
readmeLanguage = state.readmeLanguage,
287+
isExpanded = state.isAboutExpanded,
288+
onToggleExpanded = { onAction(DetailsAction.ToggleAboutExpanded) },
289+
collapsedHeight = collapsedSectionHeight,
290+
translationState = state.aboutTranslation,
291+
onTranslateClick = {
292+
onAction(DetailsAction.TranslateAbout(state.deviceLanguageCode))
293+
},
294+
onLanguagePickerClick = {
295+
onAction(DetailsAction.ShowLanguagePicker(TranslationTarget.ABOUT))
296+
},
297+
onToggleTranslation = {
298+
onAction(DetailsAction.ToggleAboutTranslation)
299+
},
300+
)
301+
}
302+
} else {
303+
state.readmeMarkdown?.let {
304+
about(
305+
readmeMarkdown = state.readmeMarkdown,
306+
readmeLanguage = state.readmeLanguage,
307+
isExpanded = state.isAboutExpanded,
308+
onToggleExpanded = { onAction(DetailsAction.ToggleAboutExpanded) },
309+
collapsedHeight = collapsedSectionHeight,
310+
translationState = state.aboutTranslation,
311+
onTranslateClick = {
312+
onAction(DetailsAction.TranslateAbout(state.deviceLanguageCode))
313+
},
314+
onLanguagePickerClick = {
315+
onAction(DetailsAction.ShowLanguagePicker(TranslationTarget.ABOUT))
316+
},
317+
onToggleTranslation = {
318+
onAction(DetailsAction.ToggleAboutTranslation)
319+
},
320+
)
321+
}
322+
323+
state.selectedRelease?.let { release ->
324+
whatsNew(
325+
release = release,
326+
isExpanded = state.isWhatsNewExpanded,
327+
onToggleExpanded = { onAction(DetailsAction.ToggleWhatsNewExpanded) },
328+
collapsedHeight = collapsedSectionHeight,
329+
translationState = state.whatsNewTranslation,
330+
onTranslateClick = {
331+
onAction(DetailsAction.TranslateWhatsNew(state.deviceLanguageCode))
332+
},
333+
onLanguagePickerClick = {
334+
onAction(DetailsAction.ShowLanguagePicker(TranslationTarget.WHATS_NEW))
335+
},
336+
onToggleTranslation = {
337+
onAction(DetailsAction.ToggleWhatsNewTranslation)
338+
},
339+
)
340+
}
300341
}
301342

302343
state.userProfile?.let { userProfile ->

feature/details/presentation/src/commonMain/kotlin/zed/rainxch/details/presentation/DetailsState.kt

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -64,17 +64,9 @@ data class DetailsState(
6464
val isLanguagePickerVisible: Boolean = false,
6565
val languagePickerTarget: TranslationTarget? = null,
6666
val deviceLanguageCode: String = "en",
67-
) {
68-
/**
69-
* True when the app is detected as installed on the system (via assets matching)
70-
* but is NOT yet tracked in our database. Shows the "Track this app" button.
71-
*/
72-
val isTrackable: Boolean
73-
get() = installedApp == null &&
74-
!isLoading &&
75-
repository != null &&
76-
primaryAsset != null
7767

68+
val isComingFromUpdate: Boolean = false,
69+
) {
7870
val filteredReleases: List<GithubRelease>
7971
get() = when (selectedReleaseCategory) {
8072
ReleaseCategory.STABLE -> allReleases.filter { !it.isPrerelease }

feature/details/presentation/src/commonMain/kotlin/zed/rainxch/details/presentation/DetailsViewModel.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,8 @@ class DetailsViewModel(
6767
private val packageMonitor: PackageMonitor,
6868
private val syncInstalledAppsUseCase: SyncInstalledAppsUseCase,
6969
private val translationRepository: TranslationRepository,
70-
private val logger: GitHubStoreLogger
70+
private val logger: GitHubStoreLogger,
71+
private val isComingFromUpdate: Boolean
7172
) : ViewModel() {
7273

7374
private var hasLoadedInitialData = false
@@ -81,6 +82,7 @@ class DetailsViewModel(
8182
.onStart {
8283
if (!hasLoadedInitialData) {
8384
loadInitial()
85+
8486
hasLoadedInitialData = true
8587
}
8688
}
@@ -281,6 +283,7 @@ class DetailsViewModel(
281283
isAppManagerEnabled = isAppManagerEnabled,
282284
installedApp = installedApp,
283285
deviceLanguageCode = translationRepository.getDeviceLanguageCode(),
286+
isComingFromUpdate = isComingFromUpdate,
284287
)
285288

286289
observeInstalledApp(repo.id)

0 commit comments

Comments
 (0)