Skip to content

Commit 1e774ff

Browse files
committed
Add option to not show feed loading error messages
1 parent 44187ba commit 1e774ff

File tree

16 files changed

+123
-6
lines changed

16 files changed

+123
-6
lines changed

androidApp/src/main/kotlin/com/prof18/feedflow/android/settings/syncstorage/SyncAndStorageScreen.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ fun SyncAndStorageScreen(
2121
syncPeriod = state.syncPeriod,
2222
autoDeletePeriod = state.autoDeletePeriod,
2323
refreshFeedsOnLaunch = state.refreshFeedsOnLaunch,
24+
showRssParsingErrors = state.showRssParsingErrors,
2425
onSyncPeriodSelected = { period ->
2526
viewModel.updateSyncPeriod(period)
2627
feedDownloadWorkerEnqueuer.updateWorker(period)
@@ -31,6 +32,9 @@ fun SyncAndStorageScreen(
3132
onRefreshFeedsOnLaunchToggle = { enabled ->
3233
viewModel.updateRefreshFeedsOnLaunch(enabled)
3334
},
35+
onShowRssParsingErrorsToggle = { enabled ->
36+
viewModel.updateShowRssParsingErrors(enabled)
37+
},
3438
onClearDownloadedArticles = {
3539
viewModel.clearDownloadedArticleContent()
3640
},

androidApp/src/main/kotlin/com/prof18/feedflow/android/settings/syncstorage/SyncAndStorageScreenContent.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import androidx.compose.foundation.lazy.LazyColumn
77
import androidx.compose.material.icons.Icons
88
import androidx.compose.material.icons.automirrored.filled.ArrowBack
99
import androidx.compose.material.icons.outlined.DeleteSweep
10+
import androidx.compose.material.icons.outlined.ErrorOutline
1011
import androidx.compose.material.icons.outlined.Image
1112
import androidx.compose.material.icons.outlined.Sync
1213
import androidx.compose.material3.Icon
@@ -41,10 +42,12 @@ internal fun SyncAndStorageScreenContent(
4142
syncPeriod: SyncPeriod,
4243
autoDeletePeriod: AutoDeletePeriod,
4344
refreshFeedsOnLaunch: Boolean,
45+
showRssParsingErrors: Boolean,
4446
navigateBack: () -> Unit,
4547
onSyncPeriodSelected: (SyncPeriod) -> Unit,
4648
onAutoDeletePeriodSelected: (AutoDeletePeriod) -> Unit,
4749
onRefreshFeedsOnLaunchToggle: (Boolean) -> Unit,
50+
onShowRssParsingErrorsToggle: (Boolean) -> Unit,
4851
onClearDownloadedArticles: () -> Unit,
4952
) {
5053
val context = LocalContext.current
@@ -80,6 +83,15 @@ internal fun SyncAndStorageScreenContent(
8083
)
8184
}
8285

86+
item {
87+
SettingSwitchItem(
88+
title = LocalFeedFlowStrings.current.settingsShowRssParsingErrors,
89+
icon = Icons.Outlined.ErrorOutline,
90+
isChecked = showRssParsingErrors,
91+
onCheckedChange = onShowRssParsingErrorsToggle,
92+
)
93+
}
94+
8395
item {
8496
SyncPeriodSelector(
8597
currentPeriod = syncPeriod,
@@ -165,6 +177,8 @@ private fun SyncAndStorageScreenContentPreview() {
165177
onSyncPeriodSelected = {},
166178
onAutoDeletePeriodSelected = {},
167179
onRefreshFeedsOnLaunchToggle = {},
180+
showRssParsingErrors = true,
181+
onShowRssParsingErrorsToggle = {},
168182
onClearDownloadedArticles = {},
169183
)
170184
}

desktopApp/src/jvmMain/kotlin/com/prof18/feedflow/desktop/home/menubar/BehaviorMenu.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,12 @@ internal fun MenuBarScope.BehaviorMenu(
5151
onCheckedChange = callbacks.onRefreshFeedsOnLaunchToggled,
5252
)
5353

54+
CheckboxItem(
55+
text = LocalFeedFlowStrings.current.settingsShowRssParsingErrors,
56+
checked = settingsState.isShowRssParsingErrorsEnabled,
57+
onCheckedChange = callbacks.onShowRssParsingErrorsToggled,
58+
)
59+
5460
Separator()
5561

5662
CheckboxItem(
@@ -113,6 +119,7 @@ internal data class BehaviorMenuCallbacks(
113119
val onSaveReaderModeContentToggled: (Boolean) -> Unit,
114120
val onPrefetchToggle: (Boolean) -> Unit,
115121
val onRefreshFeedsOnLaunchToggled: (Boolean) -> Unit,
122+
val onShowRssParsingErrorsToggled: (Boolean) -> Unit,
116123
val onMarkReadWhenScrollingToggled: (Boolean) -> Unit,
117124
val onReduceMotionToggled: (Boolean) -> Unit,
118125
val onAutoDeletePeriodSelected: (AutoDeletePeriod) -> Unit,

desktopApp/src/jvmMain/kotlin/com/prof18/feedflow/desktop/home/menubar/MenuBar.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ fun FrameWindowScope.FeedFlowMenuBar(
8686
}
8787
},
8888
onRefreshFeedsOnLaunchToggled = menuBarViewModel::updateRefreshFeedsOnLaunch,
89+
onShowRssParsingErrorsToggled = menuBarViewModel::updateShowRssParsingErrors,
8990
onMarkReadWhenScrollingToggled = menuBarViewModel::updateMarkReadWhenScrolling,
9091
onReduceMotionToggled = menuBarViewModel::updateReduceMotionEnabled,
9192
onAutoDeletePeriodSelected = menuBarViewModel::updateAutoDeletePeriod,

i18n/src/commonMain/resources/locale/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,7 @@
224224
<string name="settings_sync_period">Background sync frequency</string>
225225
<string name="settings_sync_period_desc">Choose how often to check for new articles in the background</string>
226226
<string name="settings_refresh_feeds_on_launch">Refresh feeds on app start</string>
227+
<string name="settings_show_rss_parsing_errors">Show feed loading error messages</string>
227228
<string name="settings_sync_period_never">Never</string>
228229
<string name="settings_sync_period_fifteen_minutes">Every 15 minutes</string>
229230
<string name="settings_sync_period_thirty_minutes">Every 30 minutes</string>

iosApp/Source/Settings/SyncStorage/SyncAndStorageScreen.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ struct SyncAndStorageScreen: View {
1313
@State private var settingsState = SyncAndStorageState(
1414
syncPeriod: .oneHour,
1515
autoDeletePeriod: .disabled,
16-
refreshFeedsOnLaunch: true
16+
refreshFeedsOnLaunch: true,
17+
showRssParsingErrors: true
1718
)
1819

1920
var body: some View {
@@ -32,6 +33,10 @@ struct SyncAndStorageScreen: View {
3233
get: { settingsState.refreshFeedsOnLaunch },
3334
set: { vmStoreOwner.instance.updateRefreshFeedsOnLaunch(enabled: $0) }
3435
),
36+
showRssParsingErrors: Binding(
37+
get: { settingsState.showRssParsingErrors },
38+
set: { vmStoreOwner.instance.updateShowRssParsingErrors(enabled: $0) }
39+
),
3540
onClearDownloadedArticles: {
3641
vmStoreOwner.instance.clearDownloadedArticleContent()
3742
}

iosApp/Source/Settings/SyncStorage/SyncAndStorageScreenContent.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ struct SyncAndStorageScreenContent: View {
55
@Binding var syncPeriod: SyncPeriod
66
@Binding var autoDeletePeriod: AutoDeletePeriod
77
@Binding var refreshFeedsOnLaunch: Bool
8+
@Binding var showRssParsingErrors: Bool
89
let onClearDownloadedArticles: () -> Void
910

1011
private let feedFlowStrings = Deps.shared.getStrings()
@@ -16,6 +17,10 @@ struct SyncAndStorageScreenContent: View {
1617
Label(feedFlowStrings.settingsRefreshFeedsOnLaunch, systemImage: "arrow.triangle.2.circlepath")
1718
}
1819

20+
Toggle(isOn: $showRssParsingErrors) {
21+
Label(feedFlowStrings.settingsShowRssParsingErrors, systemImage: "exclamationmark.triangle")
22+
}
23+
1924
Picker(selection: $syncPeriod) {
2025
Text(feedFlowStrings.settingsSyncPeriodNever)
2126
.tag(SyncPeriod.never)

shared/src/commonMain/kotlin/com/prof18/feedflow/shared/data/SettingsRepository.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,12 @@ class SettingsRepository(
135135
internal fun setRefreshFeedsOnLaunch(value: Boolean) =
136136
settings.set(SettingsFields.REFRESH_FEEDS_ON_LAUNCH.name, value)
137137

138+
fun getShowRssParsingErrors(): Boolean =
139+
settings.getBoolean(SettingsFields.SHOW_RSS_PARSING_ERRORS.name, true)
140+
141+
fun setShowRssParsingErrors(value: Boolean) =
142+
settings.set(SettingsFields.SHOW_RSS_PARSING_ERRORS.name, value)
143+
138144
fun getThemeMode(): ThemeMode =
139145
settings.getString(SettingsFields.THEME_MODE.name, ThemeMode.SYSTEM.name)
140146
.let { ThemeMode.valueOf(it) }
@@ -179,5 +185,6 @@ private enum class SettingsFields {
179185
THEME_MODE,
180186
REDUCE_MOTION_ENABLED,
181187
REFRESH_FEEDS_ON_LAUNCH,
188+
SHOW_RSS_PARSING_ERRORS,
182189
NOTIFICATION_MODE,
183190
}

shared/src/commonMain/kotlin/com/prof18/feedflow/shared/domain/feed/FeedFetcherRepository.kt

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ class FeedFetcherRepository internal constructor(
243243
forceRefresh: Boolean,
244244
) {
245245
val allFeedItems = mutableListOf<FeedItem>()
246+
val shouldShowParsingErrors = settingsRepository.getShowRssParsingErrors()
246247

247248
feedSourceUrls
248249
.mapNotNull { feedSource ->
@@ -287,11 +288,13 @@ class FeedFetcherRepository internal constructor(
287288
}
288289
// Mark failure flag on error
289290
databaseHelper.setFeedFetchFailed(feedSource.id, true)
290-
feedStateRepository.emitErrorState(
291-
FeedErrorState(
292-
failingSourceName = feedSource.title,
293-
),
294-
)
291+
if (shouldShowParsingErrors) {
292+
feedStateRepository.emitErrorState(
293+
FeedErrorState(
294+
failingSourceName = feedSource.title,
295+
),
296+
)
297+
}
295298
feedToUpdate.remove(feedSource.url)
296299
updateRefreshCount()
297300
null

shared/src/commonMain/kotlin/com/prof18/feedflow/shared/presentation/MenuBarViewModel.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class MenuBarViewModel internal constructor(
4040
val isSaveReaderModeContentEnabled = settingsRepository.isSaveItemContentOnOpenEnabled()
4141
val isPrefetchArticleContentEnabled = settingsRepository.isPrefetchArticleContentEnabled()
4242
val isRefreshFeedsOnLaunchEnabled = settingsRepository.getRefreshFeedsOnLaunch()
43+
val isShowRssParsingErrorsEnabled = settingsRepository.getShowRssParsingErrors()
4344
val isReduceMotionEnabled = settingsRepository.getReduceMotionEnabled()
4445
val autoDeletePeriod = settingsRepository.getAutoDeletePeriod()
4546
val isCrashReportingEnabled = settingsRepository.getCrashReportingEnabled()
@@ -54,6 +55,7 @@ class MenuBarViewModel internal constructor(
5455
isSaveReaderModeContentEnabled = isSaveReaderModeContentEnabled,
5556
isPrefetchArticleContentEnabled = isPrefetchArticleContentEnabled,
5657
isRefreshFeedsOnLaunchEnabled = isRefreshFeedsOnLaunchEnabled,
58+
isShowRssParsingErrorsEnabled = isShowRssParsingErrorsEnabled,
5759
isReduceMotionEnabled = isReduceMotionEnabled,
5860
autoDeletePeriod = autoDeletePeriod,
5961
isCrashReportingEnabled = isCrashReportingEnabled,
@@ -128,6 +130,15 @@ class MenuBarViewModel internal constructor(
128130
}
129131
}
130132

133+
fun updateShowRssParsingErrors(value: Boolean) {
134+
viewModelScope.launch {
135+
settingsRepository.setShowRssParsingErrors(value)
136+
stateMutableFlow.update {
137+
it.copy(isShowRssParsingErrorsEnabled = value)
138+
}
139+
}
140+
}
141+
131142
fun updateReduceMotionEnabled(value: Boolean) {
132143
viewModelScope.launch {
133144
settingsRepository.setReduceMotionEnabled(value)

0 commit comments

Comments
 (0)