Skip to content

Commit

Permalink
update the swift and kotlin side to support types
Browse files Browse the repository at this point in the history
  • Loading branch information
nplasterer committed Dec 7, 2023
1 parent ada1c44 commit ed1d791
Show file tree
Hide file tree
Showing 7 changed files with 77 additions and 24 deletions.
2 changes: 1 addition & 1 deletion android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ repositories {
dependencies {
implementation project(':expo-modules-core')
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${getKotlinVersion()}"
implementation "org.xmtp:android:0.6.19"
implementation "org.xmtp:android:0.6.20"
implementation 'com.google.code.gson:gson:2.10.1'
implementation 'com.facebook.react:react-native:0.71.3'
implementation "com.daveanthonythomas.moshipack:moshipack:1.0.1"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import com.google.gson.JsonParser
import com.google.protobuf.kotlin.toByteString
import expo.modules.kotlin.modules.Module
import expo.modules.kotlin.modules.ModuleDefinition
import expo.modules.xmtpreactnativesdk.wrappers.ConsentWrapper
import expo.modules.xmtpreactnativesdk.wrappers.ConsentWrapper.Companion.consentStateToString
import expo.modules.xmtpreactnativesdk.wrappers.ContentJson
import expo.modules.xmtpreactnativesdk.wrappers.ConversationWrapper
import expo.modules.xmtpreactnativesdk.wrappers.DecodedMessageWrapper
Expand Down Expand Up @@ -557,20 +559,13 @@ class XMTPModule : Module() {

AsyncFunction("consentList") { clientAddress: String ->
val client = clients[clientAddress] ?: throw XMTPException("No client")
client.contacts.consentList.entries.map { "${it.key}: ${consentStateToString(it.value)}" }
client.contacts.consentList.entries.map { ConsentWrapper.encode(it.value) }
}
}

//
// Helpers
//
private fun consentStateToString(state: ConsentState): String {
return when (state) {
ConsentState.ALLOWED -> "allowed"
ConsentState.DENIED -> "denied"
ConsentState.UNKNOWN -> "unknown"
}
}

private fun findConversation(
clientAddress: String,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package expo.modules.xmtpreactnativesdk.wrappers

import com.google.gson.GsonBuilder
import org.xmtp.android.library.ConsentListEntry
import org.xmtp.android.library.ConsentState
import org.xmtp.android.library.codecs.description
import org.xmtp.android.library.messages.DecryptedMessage

class ConsentWrapper {

companion object {
fun encode(model: ConsentListEntry): String {
val gson = GsonBuilder().create()
val message = encodeMap(model)
return gson.toJson(message)
}

fun encodeMap(model: ConsentListEntry): Map<String, Any> = mapOf(
"type" to model.entryType.name.lowercase(),
"value" to model.value.lowercase(),
"state" to consentStateToString(model.consentType),
)

fun consentStateToString(state: ConsentState): String {
return when (state) {
ConsentState.ALLOWED -> "allowed"
ConsentState.DENIED -> "denied"
ConsentState.UNKNOWN -> "unknown"
}
}
}
}
8 changes: 4 additions & 4 deletions example/ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -411,15 +411,15 @@ PODS:
- GenericJSON (~> 2.0)
- Logging (~> 1.0.0)
- secp256k1.swift (~> 0.1)
- XMTP (0.7.1-alpha0):
- XMTP (0.7.2-alpha0):
- Connect-Swift (= 0.3.0)
- GzipSwift
- web3.swift
- XMTPRust (= 0.3.7-beta0)
- XMTPReactNative (0.1.0):
- ExpoModulesCore
- MessagePacker
- XMTP (= 0.7.1-alpha0)
- XMTP (= 0.7.2-alpha0)
- XMTPRust (0.3.7-beta0)
- Yoga (1.14.0)

Expand Down Expand Up @@ -668,8 +668,8 @@ SPEC CHECKSUMS:
secp256k1.swift: a7e7a214f6db6ce5db32cc6b2b45e5c4dd633634
SwiftProtobuf: b02b5075dcf60c9f5f403000b3b0c202a11b6ae1
web3.swift: 2263d1e12e121b2c42ffb63a5a7beb1acaf33959
XMTP: 36069f94fc0485a0e6fe7a9fd5debc7ba816002c
XMTPReactNative: 40f71f1405e0ba3fcd4311382a236e7748ce1301
XMTP: 4930b80dc99a6a8ebcf1f292a162c1f316f78c50
XMTPReactNative: 68c723488857950d10fc8ee969de0baae8f9b2ca
XMTPRust: 8848a2ba761b2c961d666632f2ad27d1082faa93
Yoga: 065f0b74dba4832d6e328238de46eb72c5de9556

Expand Down
31 changes: 31 additions & 0 deletions ios/Wrappers/ConsentWrapper.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import Foundation
import XMTP

// Wrapper around XMTP.Conversation to allow passing these objects back into react native.
struct ConsentWrapper {
static func encodeToObj(_ entry: XMTP.ConsentListEntry) throws -> [String: Any] {
return [
"type": entry.entryType,
"value": entry.value,
"state": consentStateToString(state: entry.consentType),
]
}

static func encode(_ entry: XMTP.ConsentListEntry) throws -> String {
let obj = try encodeToObj(entry)
let data = try JSONSerialization.data(withJSONObject: obj)
guard let result = String(data: data, encoding: .utf8) else {
throw WrapperError.encodeError("could not encode consent")
}
return result
}

static func consentStateToString(state: ConsentState) -> String {
switch state {
case .allowed: return "allowed"
case .denied: return "denied"
case .unknown: return "unknown"
}
}

}
15 changes: 5 additions & 10 deletions ios/XMTPModule.swift
Original file line number Diff line number Diff line change
Expand Up @@ -512,30 +512,25 @@ public class XMTPModule: Module {
guard let conversation = try await findConversation(clientAddress: clientAddress, topic: conversationTopic) else {
throw Error.conversationNotFound(conversationTopic)
}
return consentStateToString(state: await conversation.consentState())
return ConsentWrapper.consentStateToString(state: await conversation.consentState())
}

AsyncFunction("consentList") { (clientAddress: String) -> [String] in
guard let client = await clientsManager.getClient(key: clientAddress) else {
throw Error.noClient
}
let entries = await client.contacts.consentList.entries
return entries.map { "\($0.key): \(consentStateToString(state: $0.value))" }

return try entries.compactMap { entry in
try ConsentWrapper.encode(entry.value)
}
}
}

//
// Helpers
//

func consentStateToString(state: ConsentState) -> String {
switch state {
case .allowed: return "allowed"
case .denied: return "denied"
case .unknown: return "unknown"
}
}

func createClientConfig(env: String, appVersion: String?) -> XMTP.ClientOptions {
// Ensure that all codecs have been registered.
switch env {
Expand Down
2 changes: 1 addition & 1 deletion ios/XMTPReactNative.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,5 @@ Pod::Spec.new do |s|

s.source_files = "**/*.{h,m,swift}"
s.dependency "MessagePacker"
s.dependency "XMTP", "= 0.7.1-alpha0"
s.dependency "XMTP", "= 0.7.2-alpha0"
end

0 comments on commit ed1d791

Please sign in to comment.