diff --git a/androidApp/src/main/kotlin/com/prof18/feedflow/settings/SettingsScreen.kt b/androidApp/src/main/kotlin/com/prof18/feedflow/settings/SettingsScreen.kt index 39a19737..a3f289bb 100644 --- a/androidApp/src/main/kotlin/com/prof18/feedflow/settings/SettingsScreen.kt +++ b/androidApp/src/main/kotlin/com/prof18/feedflow/settings/SettingsScreen.kt @@ -39,6 +39,7 @@ import com.prof18.feedflow.settings.components.BrowserSelectionDialog import com.prof18.feedflow.settings.components.SettingsDivider import com.prof18.feedflow.settings.components.SettingsMenuItem import com.prof18.feedflow.ui.preview.FeedFlowPreview +import com.prof18.feedflow.utils.UserFeedbackReporter import dev.icerock.moko.resources.compose.stringResource import org.koin.androidx.compose.koinViewModel import org.koin.compose.koinInject @@ -101,6 +102,12 @@ fun SettingsScreen( }, navigateBack = navigateBack, onAboutClick = onAboutClick, + onBugReportClick = { + browserManager.openUrl( + url = UserFeedbackReporter.getFeedbackUrl(), + context = context, + ) + }, ) } @@ -114,6 +121,7 @@ private fun SettingsScreenContent( onBrowserSelected: (Browser) -> Unit, navigateBack: () -> Unit, onAboutClick: () -> Unit, + onBugReportClick: () -> Unit, ) { val openFileAction = rememberLauncherForActivityResult( ActivityResultContracts.OpenDocument(), @@ -162,6 +170,7 @@ private fun SettingsScreenContent( openFileAction = openFileAction, createFileAction = createFileAction, onAboutClick = onAboutClick, + onBugReportClick = onBugReportClick, ) } } @@ -190,6 +199,7 @@ private fun SettingsNavBar(navigateBack: () -> Unit) { ) } +@Suppress("LongMethod") @Composable private fun SettingsList( modifier: Modifier = Modifier, @@ -198,6 +208,7 @@ private fun SettingsList( openFileAction: ManagedActivityResultLauncher, Uri?>, createFileAction: ManagedActivityResultLauncher, onAboutClick: () -> Unit, + onBugReportClick: () -> Unit, ) { LazyColumn( modifier = modifier, @@ -252,6 +263,20 @@ private fun SettingsList( SettingsDivider() } + item { + SettingsMenuItem( + text = stringResource( + resource = MR.strings.report_issue_button, + ), + ) { + onBugReportClick() + } + } + + item { + SettingsDivider() + } + item { SettingsMenuItem( text = stringResource( @@ -289,6 +314,7 @@ private fun SettingsScreenPreview() { onBrowserSelected = {}, navigateBack = {}, onAboutClick = {}, + onBugReportClick = {}, ) } } diff --git a/desktopApp/src/jvmMain/kotlin/com/prof18/feedflow/Main.kt b/desktopApp/src/jvmMain/kotlin/com/prof18/feedflow/Main.kt index fbb8b1b9..fd2e4a78 100644 --- a/desktopApp/src/jvmMain/kotlin/com/prof18/feedflow/Main.kt +++ b/desktopApp/src/jvmMain/kotlin/com/prof18/feedflow/Main.kt @@ -55,6 +55,7 @@ import com.prof18.feedflow.presentation.SettingsViewModel import com.prof18.feedflow.ui.style.FeedFlowTheme import com.prof18.feedflow.ui.style.rememberDesktopDarkTheme import com.prof18.feedflow.utils.AppEnvironment +import com.prof18.feedflow.utils.UserFeedbackReporter import com.prof18.feedflow.utils.initSentry import dev.icerock.moko.resources.compose.stringResource import kotlinx.coroutines.launch @@ -182,6 +183,9 @@ fun main() = application { onAboutClick = { aboutDialogState = true }, + onBugReportClick = { + openInBrowser(UserFeedbackReporter.getFeedbackUrl()) + }, ) MainContent( diff --git a/desktopApp/src/jvmMain/kotlin/com/prof18/feedflow/home/MenuBar.kt b/desktopApp/src/jvmMain/kotlin/com/prof18/feedflow/home/MenuBar.kt index c177da83..37e250c2 100644 --- a/desktopApp/src/jvmMain/kotlin/com/prof18/feedflow/home/MenuBar.kt +++ b/desktopApp/src/jvmMain/kotlin/com/prof18/feedflow/home/MenuBar.kt @@ -24,6 +24,7 @@ fun FrameWindowScope.FeedFlowMenuBar( onFeedsListClick: () -> Unit, onClearOldFeedClick: () -> Unit, onAboutClick: () -> Unit, + onBugReportClick: () -> Unit, ) { MenuBar { Menu("File", mnemonic = 'F') { @@ -69,6 +70,13 @@ fun FrameWindowScope.FeedFlowMenuBar( Separator() + Item( + text = stringResource(resource = MR.strings.report_issue_button), + onClick = onBugReportClick, + ) + + Separator() + Item( text = stringResource(resource = MR.strings.about_button), onClick = onAboutClick, diff --git a/iosApp/FeedFlow.xcodeproj/xcshareddata/xcschemes/FeedFlow.xcscheme b/iosApp/FeedFlow.xcodeproj/xcshareddata/xcschemes/FeedFlow.xcscheme index c73e0e3c..a2dff395 100644 --- a/iosApp/FeedFlow.xcodeproj/xcshareddata/xcschemes/FeedFlow.xcscheme +++ b/iosApp/FeedFlow.xcodeproj/xcshareddata/xcschemes/FeedFlow.xcscheme @@ -31,7 +31,7 @@ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum About Open source licenses + Report issue \ No newline at end of file diff --git a/shared/src/commonMobileMain/kotlin/com/prof18/feedflow/logging/FeedFlowLogWriter.kt b/shared/src/commonMobileMain/kotlin/com/prof18/feedflow/logging/FeedFlowLogWriter.kt index 157bfaa0..bb0f950c 100644 --- a/shared/src/commonMobileMain/kotlin/com/prof18/feedflow/logging/FeedFlowLogWriter.kt +++ b/shared/src/commonMobileMain/kotlin/com/prof18/feedflow/logging/FeedFlowLogWriter.kt @@ -1,6 +1,8 @@ package com.prof18.feedflow.logging +import co.touchlab.kermit.ExperimentalKermitApi import co.touchlab.kermit.LogWriter import co.touchlab.kermit.crashlytics.CrashlyticsLogWriter +@OptIn(ExperimentalKermitApi::class) actual fun crashReportingLogWriter(): LogWriter = CrashlyticsLogWriter() diff --git a/shared/src/desktopMain/kotlin/com/prof18/feedflow/logging/SentryLogWriter.kt b/shared/src/desktopMain/kotlin/com/prof18/feedflow/logging/SentryLogWriter.kt index bdbd585a..7b453082 100644 --- a/shared/src/desktopMain/kotlin/com/prof18/feedflow/logging/SentryLogWriter.kt +++ b/shared/src/desktopMain/kotlin/com/prof18/feedflow/logging/SentryLogWriter.kt @@ -15,6 +15,7 @@ class SentryLogWriter( ) : LogWriter() { init { + @Suppress("UseRequire") if (minCrashSeverity != null && minSeverity > minCrashSeverity) { throw IllegalArgumentException( "minSeverity ($minSeverity) cannot be greater than minCrashSeverity ($minCrashSeverity)", diff --git a/shared/src/iosMain/kotlin/com/prof18/feedflow/domain/DateUtils.kt b/shared/src/iosMain/kotlin/com/prof18/feedflow/domain/DateUtils.kt index 836f8dd8..e7baf28e 100644 --- a/shared/src/iosMain/kotlin/com/prof18/feedflow/domain/DateUtils.kt +++ b/shared/src/iosMain/kotlin/com/prof18/feedflow/domain/DateUtils.kt @@ -12,7 +12,7 @@ import platform.Foundation.dateWithTimeIntervalSince1970 import platform.Foundation.timeIntervalSince1970 @Suppress("TooGenericExceptionCaught") -internal actual fun getDateMillisFromString(dateString: String, logger: Logger): Long? { +internal actual fun getDateMillisFromString(dateString: String, logger: Logger?): Long? { val dateFormatter = NSDateFormatter().apply { setDateFormat("E, d MMM yyyy HH:mm:ss Z") setLocale(NSLocale("en_US_POSIX")) @@ -45,7 +45,7 @@ internal actual fun getDateMillisFromString(dateString: String, logger: Logger): if (date == null) { if (exception != null && message != null) { - logger.e(exception) { + logger?.e(exception) { message } } diff --git a/shared/src/iosMain/kotlin/com/prof18/feedflow/logging/FeedFlowLogWriter.kt b/shared/src/iosMain/kotlin/com/prof18/feedflow/logging/FeedFlowLogWriter.kt deleted file mode 100644 index 9949b7cc..00000000 --- a/shared/src/iosMain/kotlin/com/prof18/feedflow/logging/FeedFlowLogWriter.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.prof18.feedflow.logging - -import co.touchlab.kermit.LogWriter -import co.touchlab.kermit.MessageStringFormatter -import co.touchlab.kermit.XcodeSeverityWriter -import com.prof18.feedflow.utils.AppEnvironment - -actual fun feedFlowLogWriter( - appEnvironment: AppEnvironment, - messageStringFormatter: MessageStringFormatter, -): LogWriter = - XcodeSeverityWriter(messageStringFormatter) -// TODO: add crashlytics if not debug diff --git a/website/config.toml b/website/config.toml index 357ad1f0..a1708d70 100644 --- a/website/config.toml +++ b/website/config.toml @@ -16,7 +16,7 @@ theme = "apsho" weight = 2 [[menu.sitemap]] name = "Privacy & Policy" - url = "/privacy" + url = "https://www.prof18.com/feed-flow/pp/privacy-policy-jul23/" weight = 3 [[menu.sitemap]] name = "Report issue"