From 5bb7b9837214f17d22f4ac73dc2244f11bb11cf7 Mon Sep 17 00:00:00 2001 From: cameronvoell Date: Thu, 16 Jan 2025 22:53:42 -0800 Subject: [PATCH] consent filtering by array --- android/build.gradle | 18 ++++----- .../modules/xmtpreactnativesdk/XMTPModule.kt | 39 +++++++++++-------- .../wrappers/PermissionPolicySetWrapper.kt | 4 +- example/src/tests/groupTests.ts | 4 +- src/index.ts | 4 +- src/lib/Conversations.ts | 4 +- 6 files changed, 40 insertions(+), 33 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 2deea96b..c0016834 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -98,19 +98,19 @@ repositories { dependencies { implementation project(':expo-modules-core') implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${getKotlinVersion()}" - implementation "org.xmtp:android:3.0.21" + implementation "org.xmtp:android:3.0.22" 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" // xmtp-android local testing setup below (comment org.xmtp:android above) // implementation files('/xmtp-android/library/build/outputs/aar/library-debug.aar') // implementation 'com.google.crypto.tink:tink-android:1.8.0' - // implementation 'io.grpc:grpc-kotlin-stub:1.4.1' - // implementation 'io.grpc:grpc-okhttp:1.62.2' - // implementation 'io.grpc:grpc-protobuf-lite:1.62.2' - // implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0' - // implementation 'org.web3j:crypto:4.9.4' - // implementation "net.java.dev.jna:jna:5.14.0@aar" - // api 'com.google.protobuf:protobuf-kotlin-lite:3.22.3' - // api 'org.xmtp:proto-kotlin:3.71.0' + // implementation 'io.grpc:grpc-kotlin-stub:1.4.1' + // implementation 'io.grpc:grpc-okhttp:1.62.2' + // implementation 'io.grpc:grpc-protobuf-lite:1.62.2' + // implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0' + // implementation 'org.web3j:crypto:4.9.4' + // implementation "net.java.dev.jna:jna:5.14.0@aar" + // api 'com.google.protobuf:protobuf-kotlin-lite:3.22.3' + // api 'org.xmtp:proto-kotlin:3.72.4' } diff --git a/android/src/main/java/expo/modules/xmtpreactnativesdk/XMTPModule.kt b/android/src/main/java/expo/modules/xmtpreactnativesdk/XMTPModule.kt index 2e98beed..c678664d 100644 --- a/android/src/main/java/expo/modules/xmtpreactnativesdk/XMTPModule.kt +++ b/android/src/main/java/expo/modules/xmtpreactnativesdk/XMTPModule.kt @@ -176,11 +176,6 @@ class XMTPModule : Module() { a.apply { set(i, v.toByte()) } } val historySyncUrl = authOptions.historySyncUrl - ?: when (authOptions.environment) { - "production" -> "https://message-history.production.ephemera.network/" - "local" -> "http://10.0.2.2:5558" - else -> "https://message-history.dev.ephemera.network/" - } return ClientOptions( api = apiEnvironments(authOptions.environment, authOptions.appVersion), preAuthenticateToInboxCallback = preAuthenticateToInboxCallback, @@ -552,15 +547,15 @@ class XMTPModule : Module() { ).toJson() } - AsyncFunction("listGroups") Coroutine { installationId: String, groupParams: String?, limit: Int?, consentState: String? -> + AsyncFunction("listGroups") Coroutine { installationId: String, groupParams: String?, limit: Int?, consentStates: List? -> withContext(Dispatchers.IO) { logV("listGroups") val client = clients[installationId] ?: throw XMTPException("No client") val params = ConversationParamsWrapper.conversationParamsFromJson(groupParams ?: "") - val consent = consentState?.let { getConsentState(it) } + val consentList = consentStates?.let { getConsentStates(it) } val groups = client.conversations.listGroups( limit = limit, - consentState = consent + consentStates = consentList ) groups.map { group -> GroupWrapper.encode(client, group, params) @@ -568,15 +563,15 @@ class XMTPModule : Module() { } } - AsyncFunction("listDms") Coroutine { installationId: String, groupParams: String?, limit: Int?, consentState: String? -> + AsyncFunction("listDms") Coroutine { installationId: String, groupParams: String?, limit: Int?, consentStates: List? -> withContext(Dispatchers.IO) { logV("listDms") val client = clients[installationId] ?: throw XMTPException("No client") val params = ConversationParamsWrapper.conversationParamsFromJson(groupParams ?: "") - val consent = consentState?.let { getConsentState(it) } + val consentList = consentStates?.let { getConsentStates(it) } val dms = client.conversations.listDms( limit = limit, - consentState = consent + consentStates = consentList ) dms.map { dm -> DmWrapper.encode(client, dm, params) @@ -584,15 +579,15 @@ class XMTPModule : Module() { } } - AsyncFunction("listConversations") Coroutine { installationId: String, conversationParams: String?, limit: Int?, consentState: String? -> + AsyncFunction("listConversations") Coroutine { installationId: String, conversationParams: String?, limit: Int?, consentStates: List? -> withContext(Dispatchers.IO) { logV("listConversations") val client = clients[installationId] ?: throw XMTPException("No client") val params = ConversationParamsWrapper.conversationParamsFromJson(conversationParams ?: "") - val consent = consentState?.let { getConsentState(it) } + val consentList = consentStates?.let { getConsentStates(it) } val conversations = - client.conversations.list(limit = limit, consentState = consent) + client.conversations.list(limit = limit, consentStates = consentList) conversations.map { conversation -> ConversationWrapper.encode(client, conversation, params) } @@ -860,13 +855,13 @@ class XMTPModule : Module() { } } - AsyncFunction("syncAllConversations") Coroutine { installationId: String, consentState: String? -> + AsyncFunction("syncAllConversations") Coroutine { installationId: String, consentStates: List? -> withContext(Dispatchers.IO) { logV("syncAllConversations") val client = clients[installationId] ?: throw XMTPException("No client") - val consent = consentState?.let { getConsentState(it) } + val consentList = consentStates?.let { getConsentStates(it) } val numGroupsSyncedInt: Int = - client.conversations.syncAllConversations(consent).toInt() + client.conversations.syncAllConversations(consentList).toInt() numGroupsSyncedInt } } @@ -1443,6 +1438,16 @@ class XMTPModule : Module() { } } + private fun getConsentStates(stateStrings: List): List { + return stateStrings.map { stateString -> + when (stateString) { + "allowed" -> ConsentState.ALLOWED + "denied" -> ConsentState.DENIED + else -> ConsentState.UNKNOWN + } + } + } + private fun getEntryType(entryString: String): EntryType { return when (entryString) { "address" -> EntryType.ADDRESS diff --git a/android/src/main/java/expo/modules/xmtpreactnativesdk/wrappers/PermissionPolicySetWrapper.kt b/android/src/main/java/expo/modules/xmtpreactnativesdk/wrappers/PermissionPolicySetWrapper.kt index 176b86bb..d2a153c3 100644 --- a/android/src/main/java/expo/modules/xmtpreactnativesdk/wrappers/PermissionPolicySetWrapper.kt +++ b/android/src/main/java/expo/modules/xmtpreactnativesdk/wrappers/PermissionPolicySetWrapper.kt @@ -37,6 +37,7 @@ class PermissionPolicySetWrapper { "updateGroupDescriptionPolicy" to fromPermissionOption(policySet.updateGroupDescriptionPolicy), "updateGroupImagePolicy" to fromPermissionOption(policySet.updateGroupImagePolicy), "updateGroupPinnedFrameUrlPolicy" to fromPermissionOption(policySet.updateGroupPinnedFrameUrlPolicy), + "updateMessageExpirationPolicy" to fromPermissionOption(policySet.updateMessageExpirationPolicy), ) } @@ -50,7 +51,8 @@ class PermissionPolicySetWrapper { updateGroupNamePolicy = createPermissionOptionFromString(jsonObj.get("updateGroupNamePolicy").asString), updateGroupDescriptionPolicy = createPermissionOptionFromString(jsonObj.get("updateGroupDescriptionPolicy").asString), updateGroupImagePolicy = createPermissionOptionFromString(jsonObj.get("updateGroupImagePolicy").asString), - updateGroupPinnedFrameUrlPolicy = createPermissionOptionFromString(jsonObj.get("updateGroupPinnedFrameUrlPolicy").asString) + updateGroupPinnedFrameUrlPolicy = createPermissionOptionFromString(jsonObj.get("updateGroupPinnedFrameUrlPolicy").asString), + updateMessageExpirationPolicy = createPermissionOptionFromString(jsonObj.get("updateMessageExpirationPolicy").asString), ) } diff --git a/example/src/tests/groupTests.ts b/example/src/tests/groupTests.ts index 0dc934bf..df218e9e 100644 --- a/example/src/tests/groupTests.ts +++ b/example/src/tests/groupTests.ts @@ -974,12 +974,12 @@ test('can filter groups by consent', async () => { const boConvosFilteredAllowed = await boClient.conversations.listGroups( {}, undefined, - 'allowed' + ['allowed'] ) const boConvosFilteredUnknown = await boClient.conversations.listGroups( {}, undefined, - 'unknown' + ['unknown'] ) assert( diff --git a/src/index.ts b/src/index.ts index 138befef..f7987ff1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -352,14 +352,14 @@ export async function listGroups< clientInstallationId: InstallationId, opts?: ConversationOptions | undefined, limit?: number | undefined, - consentState?: ConsentState | undefined + consentStates?: ConsentState[] | undefined ): Promise[]> { return ( await XMTPModule.listGroups( clientInstallationId, JSON.stringify(opts), limit, - consentState + consentStates ) ).map((json: string) => { const group = JSON.parse(json) diff --git a/src/lib/Conversations.ts b/src/lib/Conversations.ts index 15f0651e..2b716795 100644 --- a/src/lib/Conversations.ts +++ b/src/lib/Conversations.ts @@ -219,13 +219,13 @@ export default class Conversations< async listGroups( opts?: ConversationOptions | undefined, limit?: number | undefined, - consentState?: ConsentState | undefined + consentStates?: ConsentState[] | undefined ): Promise[]> { return await XMTPModule.listGroups( this.client.installationId, opts, limit, - consentState + consentStates ) }