diff --git a/src/jvmMain/kotlin/com/sunnychung/application/multiplatform/hellohttp/ux/AppTextButton.kt b/src/jvmMain/kotlin/com/sunnychung/application/multiplatform/hellohttp/ux/AppTextButton.kt index db1723b6..ff7cf3b4 100644 --- a/src/jvmMain/kotlin/com/sunnychung/application/multiplatform/hellohttp/ux/AppTextButton.kt +++ b/src/jvmMain/kotlin/com/sunnychung/application/multiplatform/hellohttp/ux/AppTextButton.kt @@ -10,12 +10,19 @@ import androidx.compose.ui.unit.dp import com.sunnychung.application.multiplatform.hellohttp.ux.local.LocalColor @Composable -fun AppTextButton(modifier: Modifier = Modifier, text: String, color: Color = LocalColor.current.text, isEnabled: Boolean = true, onClick: (() -> Unit)?) { +fun AppTextButton( + modifier: Modifier = Modifier, + text: String, + isEnabled: Boolean = true, + color: Color = LocalColor.current.text, + backgroundColor: Color = if (isEnabled) LocalColor.current.backgroundButton else LocalColor.current.disabled, + onClick: (() -> Unit)? +) { AppText( text = text, color = color, modifier = modifier - .background(if (isEnabled) LocalColor.current.backgroundButton else LocalColor.current.disabled) + .background(backgroundColor) .run { if (isEnabled && onClick != null) { this.clickable { onClick() } diff --git a/src/jvmMain/kotlin/com/sunnychung/application/multiplatform/hellohttp/ux/OpenExternalLinkDialogView.kt b/src/jvmMain/kotlin/com/sunnychung/application/multiplatform/hellohttp/ux/OpenExternalLinkDialogView.kt new file mode 100644 index 00000000..b7db0171 --- /dev/null +++ b/src/jvmMain/kotlin/com/sunnychung/application/multiplatform/hellohttp/ux/OpenExternalLinkDialogView.kt @@ -0,0 +1,53 @@ +package com.sunnychung.application.multiplatform.hellohttp.ux + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.CornerSize +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalClipboardManager +import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.unit.dp +import com.sunnychung.application.multiplatform.hellohttp.AppContext +import com.sunnychung.application.multiplatform.hellohttp.ux.local.LocalColor + +@Composable +fun OpenExternalLinkDialogView(url: String, onDismiss: () -> Unit) { + val colour = LocalColor.current + val clipboardManager = LocalClipboardManager.current + val localUriHandler = LocalUriHandler.current + + Column(verticalArrangement = Arrangement.spacedBy(20.dp), horizontalAlignment = Alignment.CenterHorizontally) { + AppText("An external link is going to be opened.") + + AppText( + text = url, + color = colour.highlight, + modifier = Modifier + .background(colour.backgroundInputField, RoundedCornerShape(corner = CornerSize(8.dp))) + .padding(6.dp) + ) + + Column(verticalArrangement = Arrangement.spacedBy(8.dp), horizontalAlignment = Alignment.CenterHorizontally) { + AppTextButton(text = "Copy URL") { + clipboardManager.setText(AnnotatedString(url)) + AppContext.ErrorMessagePromptViewModel.showSuccessMessage("Copied text") + } + AppTextButton(text = "Open in Web Browser") { + localUriHandler.openUri(url) + onDismiss() + } + Spacer(Modifier.height(4.dp)) // 8 dp + 4 dp + 8 dp + AppTextButton(text = "Close", backgroundColor = colour.backgroundStopButton) { + onDismiss() + } + } + } +} diff --git a/src/jvmMain/kotlin/com/sunnychung/application/multiplatform/hellohttp/ux/StatusBarView.kt b/src/jvmMain/kotlin/com/sunnychung/application/multiplatform/hellohttp/ux/StatusBarView.kt index 8572f757..8773cae1 100644 --- a/src/jvmMain/kotlin/com/sunnychung/application/multiplatform/hellohttp/ux/StatusBarView.kt +++ b/src/jvmMain/kotlin/com/sunnychung/application/multiplatform/hellohttp/ux/StatusBarView.kt @@ -2,6 +2,7 @@ package com.sunnychung.application.multiplatform.hellohttp.ux import androidx.compose.foundation.background import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth @@ -24,24 +25,46 @@ fun StatusBarView(modifier: Modifier = Modifier) { val colors = LocalColor.current val metadataManager = AppContext.MetadataManager - var isShowSettingDialog by remember { mutableStateOf(false) } + var showDialog by remember { mutableStateOf(null) } + var openUrl by remember { mutableStateOf("") } Box(modifier = modifier.fillMaxWidth().height(22.dp).background(colors.backgroundLight).padding(horizontal = 4.dp)) { AppText( text = "v${metadataManager.version} (${metadataManager.gitCommitHash})", fontSize = 12.sp, - modifier = Modifier.align( - Alignment.CenterStart - ) + modifier = Modifier.align(Alignment.CenterStart) ) - Row(modifier = Modifier.align(Alignment.CenterEnd).clickable { isShowSettingDialog = true }) { - AppImage(resource = "setting.svg", size = 16.dp, modifier = Modifier.padding(horizontal = 4.dp)) - AppText(text = "Setting & Data", fontSize = 12.sp) + Row(horizontalArrangement = Arrangement.spacedBy(20.dp), modifier = Modifier.align(Alignment.CenterEnd)) { + ClickableIconAndText("question.svg", "User Manual") { + openUrl = "https://sunny-chung.github.io/hello-http/" + showDialog = DialogName.OpenExternalLink + } + ClickableIconAndText("report-issue.svg", "Bug Report or Feature Request") { + openUrl = "https://github.com/sunny-chung/hello-http/issues" + showDialog = DialogName.OpenExternalLink + } + ClickableIconAndText("setting.svg", "Setting & Data") { showDialog = DialogName.Setting } } } - MainWindowDialog(key = "Setting", isEnabled = isShowSettingDialog, onDismiss = { isShowSettingDialog = false }) { - SettingDialogView(closeDialog = { isShowSettingDialog = false }) + MainWindowDialog(key = "Setting", isEnabled = showDialog == DialogName.Setting, onDismiss = { showDialog = null }) { + SettingDialogView(closeDialog = { showDialog = null }) } + + MainWindowDialog(key = "OpenExternalLink", isEnabled = showDialog == DialogName.OpenExternalLink, onDismiss = { showDialog = null }) { + OpenExternalLinkDialogView(url = openUrl, onDismiss = { showDialog = null }) + } +} + +@Composable +fun ClickableIconAndText(imageResource: String, text: String, onClick: () -> Unit) { + Row(modifier = Modifier.clickable { onClick() }) { + AppImage(resource = imageResource, size = 16.dp, modifier = Modifier.padding(horizontal = 4.dp)) + AppText(text = text, fontSize = 12.sp) + } +} + +private enum class DialogName { + Setting, OpenExternalLink } diff --git a/src/jvmMain/resources/image/report-issue.svg b/src/jvmMain/resources/image/report-issue.svg new file mode 100644 index 00000000..9f394f76 --- /dev/null +++ b/src/jvmMain/resources/image/report-issue.svg @@ -0,0 +1,15 @@ + + + + + + + + + \ No newline at end of file