feat: catch invite urls

Signed-off-by: Infi <infi@infi.sh>
This commit is contained in:
Infi 2024-04-10 00:32:33 +02:00
parent d9b6ebfd95
commit 6f44c03cc0
2 changed files with 36 additions and 0 deletions

View File

@ -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<Channel>? = 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
}

View File

@ -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(