From 04c52c5a375b000cc178aba8b9388668e6528b19 Mon Sep 17 00:00:00 2001
From: Taras Smakula <tarassmakula@gmail.com>
Date: Mon, 4 Mar 2024 18:27:33 +0200
Subject: [PATCH] Set power level on create room

---
 .../room/create/CreateRoomDataSource.kt       | 28 +++++---
 .../room/create/CreateRoomDialogFragment.kt   |  4 +-
 .../room/create/CreateRoomViewModel.kt        | 69 ++++++++++++++-----
 3 files changed, 73 insertions(+), 28 deletions(-)

diff --git a/core/src/main/java/org/futo/circles/core/feature/room/create/CreateRoomDataSource.kt b/core/src/main/java/org/futo/circles/core/feature/room/create/CreateRoomDataSource.kt
index f29bb8878..f902c5d10 100644
--- a/core/src/main/java/org/futo/circles/core/feature/room/create/CreateRoomDataSource.kt
+++ b/core/src/main/java/org/futo/circles/core/feature/room/create/CreateRoomDataSource.kt
@@ -6,6 +6,7 @@ import dagger.hilt.android.qualifiers.ApplicationContext
 import org.futo.circles.core.feature.room.RoomRelationsBuilder
 import org.futo.circles.core.feature.workspace.SharedCircleDataSource
 import org.futo.circles.core.feature.workspace.SpacesTreeAccountDataSource
+import org.futo.circles.core.model.AccessLevel
 import org.futo.circles.core.model.Circle
 import org.futo.circles.core.model.CirclesRoom
 import org.futo.circles.core.model.Timeline
@@ -39,18 +40,23 @@ class CreateRoomDataSource @Inject constructor(
         topic: String? = null,
         iconUri: Uri? = null,
         inviteIds: List<String>? = null,
-        isPublicCircle: Boolean = false
+        isPublicCircle: Boolean = false,
+        defaultUserPowerLevel: Int = AccessLevel.User.levelValue
     ): String {
         val id = session.roomService().createRoom(
-            getParams(circlesRoom, name, topic, iconUri, inviteIds)
+            getParams(circlesRoom, name, topic, iconUri, inviteIds, defaultUserPowerLevel)
         )
         circlesRoom.parentAccountDataKey?.let { key ->
             val parentId = spacesTreeAccountDataSource.getRoomIdByKey(key)
             parentId?.let { roomRelationsBuilder.setRelations(id, it) }
         }
         if (circlesRoom is Circle) {
-            val timelineId = createCircleTimeline(id,
-                name ?: circlesRoom.nameId?.let { context.getString(it) }, iconUri, inviteIds
+            val timelineId = createCircleTimeline(
+                id,
+                name ?: circlesRoom.nameId?.let { context.getString(it) },
+                iconUri,
+                inviteIds,
+                defaultUserPowerLevel
             )
             if (isPublicCircle) sharedCircleDataSource.addToSharedCircles(timelineId)
         }
@@ -61,9 +67,11 @@ class CreateRoomDataSource @Inject constructor(
         circleId: String,
         name: String? = null,
         iconUri: Uri? = null,
-        inviteIds: List<String>? = null
+        inviteIds: List<String>? = null,
+        defaultUserPowerLevel: Int = AccessLevel.User.levelValue
     ): String {
-        val timelineId = createRoom(Timeline(), name, null, iconUri, inviteIds)
+        val timelineId =
+            createRoom(Timeline(), name, null, iconUri, inviteIds, false, defaultUserPowerLevel)
         roomRelationsBuilder.setRelations(timelineId, circleId)
         return timelineId
     }
@@ -73,7 +81,8 @@ class CreateRoomDataSource @Inject constructor(
         name: String? = null,
         topic: String? = null,
         iconUri: Uri? = null,
-        inviteIds: List<String>? = null
+        inviteIds: List<String>? = null,
+        defaultUserPowerLevel: Int = AccessLevel.User.levelValue
     ): CreateRoomParams {
         val params = if (circlesRoom.isSpace()) {
             CreateSpaceParams()
@@ -81,7 +90,10 @@ class CreateRoomDataSource @Inject constructor(
             CreateRoomParams().apply {
                 visibility = RoomDirectoryVisibility.PRIVATE
                 historyVisibility = RoomHistoryVisibility.SHARED
-                powerLevelContentOverride = PowerLevelsContent(invite = Role.Moderator.value)
+                powerLevelContentOverride = PowerLevelsContent(
+                    invite = Role.Moderator.value,
+                    usersDefault = defaultUserPowerLevel
+                )
                 enableEncryption()
             }
         }
diff --git a/core/src/main/java/org/futo/circles/core/feature/room/create/CreateRoomDialogFragment.kt b/core/src/main/java/org/futo/circles/core/feature/room/create/CreateRoomDialogFragment.kt
index 0846b1902..ab605d6b6 100644
--- a/core/src/main/java/org/futo/circles/core/feature/room/create/CreateRoomDialogFragment.kt
+++ b/core/src/main/java/org/futo/circles/core/feature/room/create/CreateRoomDialogFragment.kt
@@ -118,7 +118,9 @@ class CreateRoomDialogFragment :
             binding.tilTopic.getText(),
             selectedUsersFragment?.getSelectedUsersIds(),
             roomType,
-            binding.btnPublic.isChecked
+            binding.btnPublic.isChecked,
+            AccessLevel.entries.getOrNull(binding.spUserRole.selectedItemPosition)
+                ?: AccessLevel.User
         )
     }
 
diff --git a/core/src/main/java/org/futo/circles/core/feature/room/create/CreateRoomViewModel.kt b/core/src/main/java/org/futo/circles/core/feature/room/create/CreateRoomViewModel.kt
index cda1c6088..a596c514f 100644
--- a/core/src/main/java/org/futo/circles/core/feature/room/create/CreateRoomViewModel.kt
+++ b/core/src/main/java/org/futo/circles/core/feature/room/create/CreateRoomViewModel.kt
@@ -8,6 +8,7 @@ import org.futo.circles.core.base.SingleEventLiveData
 import org.futo.circles.core.extensions.Response
 import org.futo.circles.core.extensions.createResult
 import org.futo.circles.core.extensions.launchBg
+import org.futo.circles.core.model.AccessLevel
 import org.futo.circles.core.model.Circle
 import org.futo.circles.core.model.CircleRoomTypeArg
 import org.futo.circles.core.model.Gallery
@@ -31,44 +32,74 @@ class CreateRoomViewModel @Inject constructor(
         topic: String,
         inviteIds: List<String>?,
         roomType: CircleRoomTypeArg,
-        isPublicCircle: Boolean
+        isPublicCircle: Boolean,
+        defaultUserAccessLevel: AccessLevel
     ) {
         launchBg {
             val result = createResult {
                 when (roomType) {
-                    CircleRoomTypeArg.Circle -> createCircle(name, inviteIds, isPublicCircle)
-                    CircleRoomTypeArg.Group -> createGroup(name, topic, inviteIds)
-                    CircleRoomTypeArg.Photo -> createGallery(name)
+                    CircleRoomTypeArg.Circle -> createCircle(
+                        name,
+                        inviteIds,
+                        isPublicCircle,
+                        defaultUserAccessLevel
+                    )
+
+                    CircleRoomTypeArg.Group -> createGroup(
+                        name,
+                        topic,
+                        inviteIds,
+                        defaultUserAccessLevel
+                    )
+
+                    CircleRoomTypeArg.Photo -> createGallery(
+                        name,
+                        inviteIds,
+                        defaultUserAccessLevel
+                    )
                 }
             }
             createRoomResponseLiveData.postValue(result)
         }
     }
 
-    private suspend fun createGroup(name: String, topic: String, inviteIds: List<String>?) =
-        dataSource.createRoom(
-            circlesRoom = Group(),
-            iconUri = selectedImageLiveData.value,
-            name = name,
-            topic = topic,
-            inviteIds = inviteIds
-        )
+    private suspend fun createGroup(
+        name: String, topic: String,
+        inviteIds: List<String>?,
+        defaultUserAccessLevel: AccessLevel
+    ) = dataSource.createRoom(
+        circlesRoom = Group(),
+        iconUri = selectedImageLiveData.value,
+        name = name,
+        topic = topic,
+        inviteIds = inviteIds,
+        defaultUserPowerLevel = defaultUserAccessLevel.levelValue
+    )
 
     private suspend fun createCircle(
         name: String,
         inviteIds: List<String>?,
-        isPublicCircle: Boolean
+        isPublicCircle: Boolean,
+        defaultUserAccessLevel: AccessLevel
     ) = dataSource.createRoom(
         circlesRoom = Circle(),
         name = name,
         iconUri = selectedImageLiveData.value,
         inviteIds = inviteIds,
-        isPublicCircle = isPublicCircle
+        isPublicCircle = isPublicCircle,
+        defaultUserPowerLevel = defaultUserAccessLevel.levelValue
     )
 
-    private suspend fun createGallery(name: String) = dataSource.createRoom(
-        circlesRoom = Gallery(),
-        name = name,
-        iconUri = selectedImageLiveData.value
-    )
+    private suspend fun createGallery(
+        name: String,
+        inviteIds: List<String>?,
+        defaultUserAccessLevel: AccessLevel
+    ) =
+        dataSource.createRoom(
+            circlesRoom = Gallery(),
+            name = name,
+            iconUri = selectedImageLiveData.value,
+            inviteIds = inviteIds,
+            defaultUserPowerLevel = defaultUserAccessLevel.levelValue
+        )
 }
\ No newline at end of file
-- 
GitLab