diff --git a/app/src/main/java/chat/revolt/api/schemas/Invites.kt b/app/src/main/java/chat/revolt/api/schemas/Invites.kt index fb09c095..7ab6b281 100644 --- a/app/src/main/java/chat/revolt/api/schemas/Invites.kt +++ b/app/src/main/java/chat/revolt/api/schemas/Invites.kt @@ -1,5 +1,9 @@ package chat.revolt.api.schemas +import android.net.Uri +import androidx.core.net.toUri +import chat.revolt.api.REVOLT_APP +import chat.revolt.api.REVOLT_INVITES import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -45,3 +49,16 @@ data class InviteJoined( val channels: List? = null, val server: Server? = null ) + +fun Uri.isInviteUri(): Boolean { + val firstPathSegmentIsInvite = this.pathSegments.firstOrNull() == "invite" + val isAppRevoltChat = this.host == REVOLT_APP.toUri().host + val matchRvltGG = this.host == REVOLT_INVITES.toUri().host + + val matchApp = isAppRevoltChat && firstPathSegmentIsInvite + + val hasEnoughSegments = + if (matchApp) this.pathSegments.size == 2 else this.pathSegments.size == 1 + + return (matchApp || matchRvltGG) && hasEnoughSegments +} \ No newline at end of file diff --git a/app/src/main/java/chat/revolt/components/markdown/MarkdownText.kt b/app/src/main/java/chat/revolt/components/markdown/MarkdownText.kt index d71b7596..251d4276 100644 --- a/app/src/main/java/chat/revolt/components/markdown/MarkdownText.kt +++ b/app/src/main/java/chat/revolt/components/markdown/MarkdownText.kt @@ -1,5 +1,6 @@ package chat.revolt.components.markdown +import android.content.Intent import android.widget.Toast import androidx.browser.customtabs.CustomTabColorSchemeParams import androidx.browser.customtabs.CustomTabsIntent @@ -35,9 +36,11 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.core.net.toUri import chat.revolt.R +import chat.revolt.activities.InviteActivity import chat.revolt.api.REVOLT_FILES import chat.revolt.api.RevoltAPI import chat.revolt.api.routes.custom.fetchEmoji +import chat.revolt.api.schemas.isInviteUri import chat.revolt.callbacks.Action import chat.revolt.callbacks.ActionChannel import chat.revolt.components.generic.RemoteImage @@ -286,6 +289,22 @@ fun MarkdownText(textNode: AstNode, modifier: Modifier = Modifier) { end = offset ).firstOrNull()?.let { annotation -> val url = annotation.item + + try { + val uri = url.toUri() + if (uri.isInviteUri()) { + scope.launch { + Intent(context, InviteActivity::class.java).apply { + data = uri + context.startActivity(this) + } + } + return@handler true + } + } catch (e: Exception) { + // no-op + } + val customTab = CustomTabsIntent.Builder() .setShowTitle(true) .setDefaultColorSchemeParams(