Skip to content

Commit 61e33a9

Browse files
committed
refactor: Improve error handling and fix typo
This commit improves error handling for `RateLimitException` across several features and corrects a typo. - **refactor(error)**: Implemented consistent error handling for `RateLimitException`. - The Apps, Search, Details, and Developer Profile screens now display a specific error message to the user when a GitHub API rate limit is exceeded. - **fix(starred)**: Corrected a typo in the `StarredRepos` feature, renaming `OnSingInClick` to `OnSignInClick` for consistency. - **chore(di)**: Removed a large block of commented-out Koin module definitions from `SharedModules.kt` to clean up the codebase.
1 parent 4fdca84 commit 61e33a9

8 files changed

Lines changed: 20 additions & 196 deletions

File tree

composeApp/src/commonMain/kotlin/zed/rainxch/githubstore/app/di/SharedModules.kt

Lines changed: 1 addition & 188 deletions
Original file line numberDiff line numberDiff line change
@@ -18,191 +18,4 @@ val mainModule: Module = module {
1818
authenticationState = get()
1919
)
2020
}
21-
}
22-
23-
//val authModule: Module = module {
24-
// // Repository
25-
// single<AuthenticationRepository> {
26-
// AuthenticationRepositoryImpl(tokenDataSource = get())
27-
// }
28-
//
29-
// // ViewModel
30-
// viewModel {
31-
// AuthenticationViewModel(
32-
// authenticationRepository = get(),
33-
// browserHelper = get(),
34-
// clipboardHelper = get(),
35-
// scope = get()
36-
// )
37-
// }
38-
//}
39-
40-
//val homeModule: Module = module {
41-
// // Repository
42-
// single<HomeRepository> {
43-
// HomeRepositoryImpl(
44-
// githubNetworkClient = get(),
45-
// platform = get(),
46-
// appStateManager = get(),
47-
// cachedDataSource = get()
48-
// )
49-
// }
50-
//
51-
// single<CachedTrendingDataSource> {
52-
// CachedTrendingDataSource(
53-
// platform = get()
54-
// )
55-
// }
56-
//
57-
// // ViewModel
58-
// viewModel {
59-
// HomeViewModel(
60-
// homeRepository = get(),
61-
// installedAppsRepository = get(),
62-
// platform = get(),
63-
// syncInstalledAppsUseCase = get(),
64-
// favouritesRepository = get(),
65-
// starredRepository = get()
66-
// )
67-
// }
68-
//}
69-
//
70-
//val searchModule: Module = module {
71-
// // Repository
72-
// single<SearchRepository> {
73-
// SearchRepositoryImpl(
74-
// githubNetworkClient = get(),
75-
// appStateManager = get()
76-
// )
77-
// }
78-
//
79-
//
80-
// // ViewModel
81-
// viewModel {
82-
// SearchViewModel(
83-
// searchRepository = get(),
84-
// installedAppsRepository = get(),
85-
// syncInstalledAppsUseCase = get(),
86-
// favouritesRepository = get(),
87-
// starredRepository = get()
88-
// )
89-
// }
90-
//}
91-
//val favouritesModule: Module = module {
92-
// // ViewModel
93-
// viewModel {
94-
// FavouritesViewModel(
95-
// favouritesRepository = get()
96-
// )
97-
// }
98-
//}
99-
//
100-
//val detailsModule: Module = module {
101-
// // Repository
102-
// single<DetailsRepository> {
103-
// DetailsRepositoryImpl(
104-
// github = get(),
105-
// appStateManager = get(),
106-
// localizationManager = get()
107-
// )
108-
// }
109-
//
110-
// // ViewModel
111-
// viewModel { params ->
112-
// DetailsViewModel(
113-
// repositoryId = params.get(),
114-
// detailsRepository = get(),
115-
// downloader = get<Downloader>(),
116-
// installer = get<Installer>(),
117-
// platform = get(),
118-
// helper = get(),
119-
// installedAppsRepository = get(),
120-
// favouritesRepository = get(),
121-
// packageMonitor = get<zed.rainxch.core.data.services.PackageMonitor>(),
122-
// syncInstalledAppsUseCase = get(),
123-
// starredRepository = get()
124-
// )
125-
// }
126-
//}
127-
//val repoAuthorModule: Module = module {
128-
// // Repository
129-
// single<DeveloperProfileRepository> {
130-
// DeveloperProfileRepositoryImpl(
131-
// httpClient = get(),
132-
// platform = get(),
133-
// installedAppsDao = get(),
134-
// favouritesRepository = get()
135-
// )
136-
// }
137-
//
138-
// // ViewModel
139-
// viewModel { params ->
140-
// DeveloperProfileViewModel(
141-
// repository = get(),
142-
// favouritesRepository = get(),
143-
// username = params.get(),
144-
// )
145-
// }
146-
//}
147-
//
148-
//val settingsModule: Module = module {
149-
// // Repository
150-
// single<SettingsRepository> {
151-
// SettingsRepositoryImpl(
152-
// tokenDataSource = get()
153-
// )
154-
// }
155-
//
156-
// // ViewModel
157-
// viewModel {
158-
// SettingsViewModel(
159-
// browserHelper = get(),
160-
// themesRepository = get(),
161-
// settingsRepository = get()
162-
// )
163-
// }
164-
//}
165-
//val starredReposModule: Module = module {
166-
// // Repository
167-
// single<StarredRepository> {
168-
// _root_ide_package_.zed.rainxch.core.data.repository.StarredRepositoryImpl(
169-
// httpClient = get(),
170-
// starredRepoDao = get(),
171-
// installedAppsDao = get(),
172-
// platform = get()
173-
// )
174-
// }
175-
//
176-
// // ViewModel
177-
// viewModel {
178-
// StarredReposViewModel(
179-
// starredRepository = get(),
180-
// favouritesRepository = get(),
181-
// tokenDataSource = get()
182-
// )
183-
// }
184-
//}
185-
//
186-
//val appsModule: Module = module {
187-
// // Repository
188-
// single<AppsRepository> {
189-
// AppsRepositoryImpl(
190-
// appLauncher = get(),
191-
// appsRepository = get()
192-
// )
193-
// }
194-
//
195-
// // ViewModel
196-
// viewModel {
197-
// AppsViewModel(
198-
// appsRepository = get(),
199-
// installedAppsRepository = get(),
200-
// installer = get(),
201-
// downloader = get(),
202-
// packageMonitor = get(),
203-
// detailsRepository = get(),
204-
// platform = get(),
205-
// syncInstalledAppsUseCase = get()
206-
// )
207-
// }
208-
//}
21+
}

feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsViewModel.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,9 +290,12 @@ class AppsViewModel(
290290
cleanupUpdate(app.packageName, app.latestAssetName)
291291
updateAppState(app.packageName, UpdateState.Idle)
292292
throw e
293-
} catch (e: RateLimitException) {
293+
} catch (_: RateLimitException) {
294294
logger.debug("Rate limited during update for ${app.packageName}")
295295
updateAppState(app.packageName, UpdateState.Idle)
296+
_events.send(
297+
AppsEvent.ShowError(getString(Res.string.rate_limit_exceeded))
298+
)
296299
} catch (e: Exception) {
297300
logger.error("Update failed for ${app.packageName}: ${e.message}")
298301
cleanupUpdate(app.packageName, app.latestAssetName)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ class DetailsViewModel(
255255
logger.error("Rate limited: ${e.message}")
256256
_state.value = _state.value.copy(
257257
isLoading = false,
258-
errorMessage = null
258+
errorMessage = getString(Res.string.rate_limit_exceeded)
259259
)
260260
} catch (t: Throwable) {
261261
logger.error("Details load failed: ${t.message}")

feature/dev-profile/presentation/src/commonMain/kotlin/zed/rainxch/devprofile/presentation/DeveloperProfileViewModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ class DeveloperProfileViewModel(
113113
it.copy(
114114
isLoading = false,
115115
isLoadingRepos = false,
116-
errorMessage = e.message ?: "Unexpected error"
116+
errorMessage = e.message
117117
)
118118
}
119119

feature/search/presentation/src/commonMain/kotlin/zed/rainxch/search/presentation/SearchViewModel.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,15 @@ class SearchViewModel(
227227
it.copy(isLoading = false, isLoadingMore = false)
228228
}
229229
} catch (e: RateLimitException) {
230-
logger.debug("Rate limit exceed: ${e.message}")
230+
logger.debug("Rate limit exceeded: ${e.message}")
231+
_state.update {
232+
it.copy(
233+
isLoading = false,
234+
isLoadingMore = false,
235+
errorMessage = e.message
236+
)
237+
}
238+
231239
} catch (e: CancellationException) {
232240
logger.debug("Search cancelled (expected): ${e.message}")
233241
} catch (e: Exception) {

feature/starred/presentation/src/commonMain/kotlin/zed/rainxch/starred/presentation/StarredReposAction.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ sealed interface StarredReposAction {
66
data object OnNavigateBackClick : StarredReposAction
77
data object OnRefresh : StarredReposAction
88
data object OnRetrySync : StarredReposAction
9-
data object OnSingInClick : StarredReposAction
9+
data object OnSignInClick : StarredReposAction
1010
data object OnDismissError : StarredReposAction
1111
data class OnRepositoryClick(val repository: StarredRepositoryUi) : StarredReposAction
1212
data class OnDeveloperProfileClick(val username: String) : StarredReposAction

feature/starred/presentation/src/commonMain/kotlin/zed/rainxch/starred/presentation/StarredReposRoot.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ fun StarredReposRoot(
7070
StarredReposAction.OnNavigateBackClick -> onNavigateBack()
7171
is StarredReposAction.OnRepositoryClick -> onNavigateToDetails(action.repository.repoId)
7272
is StarredReposAction.OnDeveloperProfileClick -> onNavigateToDeveloperProfile(action.username)
73-
StarredReposAction.OnSingInClick -> onNavigateToAuthentication()
73+
StarredReposAction.OnSignInClick -> onNavigateToAuthentication()
7474
else -> viewModel.onAction(action)
7575
}
7676
}
@@ -108,7 +108,7 @@ fun StarredScreen(
108108
icon = Icons.Default.Star,
109109
actionText = stringResource(Res.string.sign_in_with_github),
110110
onActionClick = {
111-
onAction(StarredReposAction.OnSingInClick)
111+
onAction(StarredReposAction.OnSignInClick)
112112
},
113113
modifier = Modifier.align(Alignment.Center)
114114
)

feature/starred/presentation/src/commonMain/kotlin/zed/rainxch/starred/presentation/StarredReposViewModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ class StarredReposViewModel (
136136
// Handled in composable
137137
}
138138

139-
is StarredReposAction.OnSingInClick -> {
139+
is StarredReposAction.OnSignInClick -> {
140140
// Handled in composable
141141
}
142142

0 commit comments

Comments
 (0)