diff --git a/composeApp/schemas/at.torch.compose.database.TorchDatabase/1.json b/composeApp/schemas/at.torch.compose.database.TorchDatabase/1.json index 651cd582..9aa2b171 100644 --- a/composeApp/schemas/at.torch.compose.database.TorchDatabase/1.json +++ b/composeApp/schemas/at.torch.compose.database.TorchDatabase/1.json @@ -2,7 +2,7 @@ "formatVersion": 1, "database": { "version": 1, - "identityHash": "6f2020861ae05ebf5290388d73772039", + "identityHash": "8e399a485acb36b98a516cf3d7480d8c", "entities": [ { "tableName": "BroadcastNostrEventReceipt", @@ -608,7 +608,7 @@ }, { "tableName": "ChatRoom", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `userPublicKey` TEXT NOT NULL, `subject` TEXT, `initialGiftWrapPayloadId` INTEGER, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `savedAt` INTEGER NOT NULL, `viewedAt` INTEGER, `deletedAt` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`userPublicKey`) REFERENCES `Profile`(`publicKey`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`initialGiftWrapPayloadId`) REFERENCES `GiftWrapPayload`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `userPublicKey` TEXT NOT NULL, `subject` TEXT, `mlsGroupState` TEXT, `initialGiftWrapPayloadId` INTEGER, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `savedAt` INTEGER NOT NULL, `viewedAt` INTEGER, `deletedAt` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`userPublicKey`) REFERENCES `Profile`(`publicKey`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`initialGiftWrapPayloadId`) REFERENCES `GiftWrapPayload`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", "fields": [ { "fieldPath": "id", @@ -627,6 +627,11 @@ "columnName": "subject", "affinity": "TEXT" }, + { + "fieldPath": "mlsGroupState", + "columnName": "mlsGroupState", + "affinity": "TEXT" + }, { "fieldPath": "initialGiftWrapPayloadId", "columnName": "initialGiftWrapPayloadId", @@ -2869,7 +2874,7 @@ ], "setupQueries": [ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '6f2020861ae05ebf5290388d73772039')" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '8e399a485acb36b98a516cf3d7480d8c')" ] } } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/at/torch/compose/database/dao/NostrDao.kt b/composeApp/src/commonMain/kotlin/at/torch/compose/database/dao/NostrDao.kt index 35c287ad..3961ac25 100644 --- a/composeApp/src/commonMain/kotlin/at/torch/compose/database/dao/NostrDao.kt +++ b/composeApp/src/commonMain/kotlin/at/torch/compose/database/dao/NostrDao.kt @@ -578,6 +578,7 @@ abstract class NostrDao( decryptedGiftWrapPayload } + // TODO: Handle MLS message/groups val chatRoomId = giftWrapPayload.aggregatedParticipantsPublicKey() logger.d("ChatRoomId: $chatRoomId") @@ -596,7 +597,8 @@ abstract class NostrDao( userPublicKey = userPublicKey, subject = decryptedGiftWrapPayload.parseSubject(), createdAt = decryptedGiftWrapPayload.createdAt, - initialGiftWrapPayloadId = giftWrapPayload.id + initialGiftWrapPayloadId = giftWrapPayload.id, + mlsGroupState = null ) ) diff --git a/composeApp/src/commonMain/kotlin/at/torch/compose/ui/composable/ChatRoomCreationScreen.kt b/composeApp/src/commonMain/kotlin/at/torch/compose/ui/composable/ChatRoomCreationScreen.kt index 000d88fd..816fafb4 100644 --- a/composeApp/src/commonMain/kotlin/at/torch/compose/ui/composable/ChatRoomCreationScreen.kt +++ b/composeApp/src/commonMain/kotlin/at/torch/compose/ui/composable/ChatRoomCreationScreen.kt @@ -81,13 +81,13 @@ fun ChatRoomCreationScreen( ), label = { Text( - text = "Name (eg. Alan Turin)", + text = "Name (eg. Group Discussions)", maxLines = 1, ) }, placeholder = { Text( - text = "Enter the name you want to use for your profile", + text = "Enter the name you want to use for your groupd", maxLines = 1, ) }, @@ -100,7 +100,7 @@ fun ChatRoomCreationScreen( ) Text( - text = "This will be the display name for your profile and also important for search.", + text = "This will be the display name for this chat room.", style = MaterialTheme.typography.labelMedium, textAlign = TextAlign.Center ) @@ -125,7 +125,7 @@ fun ChatRoomCreationScreen( ), label = { Text( - text = "Introduce yourself", + text = "What will be discussed in this chat room.", maxLines = 1, ) @@ -145,7 +145,7 @@ fun ChatRoomCreationScreen( ) Text( - text = "This will be shown when people open your profile.", + text = "This will be shown when people open the chat for more details.", style = MaterialTheme.typography.labelMedium, textAlign = TextAlign.Center ) diff --git a/composeApp/src/commonMain/kotlin/at/torch/compose/ui/composable/navigation/TorchNavHost.kt b/composeApp/src/commonMain/kotlin/at/torch/compose/ui/composable/navigation/TorchNavHost.kt index 839fa654..a4415189 100644 --- a/composeApp/src/commonMain/kotlin/at/torch/compose/ui/composable/navigation/TorchNavHost.kt +++ b/composeApp/src/commonMain/kotlin/at/torch/compose/ui/composable/navigation/TorchNavHost.kt @@ -297,9 +297,16 @@ fun TorchNavHost( val route = backStackEntry.toRoute() ChatRoomCreationScreen( - activeUserPublicKey = route.activeUserPublicKey, + activeWalletStateFlow = sovereignWalletViewModel.activeWalletInUI, nostrRepository = databaseNostrRepository, - chatRepository = databaseChatRepository + chatRepository = databaseChatRepository, + onNavigateToChatRoom = { chatRoomResultRoute -> + navController.navigate( + chatRoomResultRoute + ) { + popUpTo(route) + } + } ) } composable { backStackEntry -> diff --git a/composeApp/src/commonMain/kotlin/at/torch/compose/ui/view/model/ChatRoomCreationViewModel.kt b/composeApp/src/commonMain/kotlin/at/torch/compose/ui/view/model/ChatRoomCreationViewModel.kt index e3bed0ae..2edc987b 100644 --- a/composeApp/src/commonMain/kotlin/at/torch/compose/ui/view/model/ChatRoomCreationViewModel.kt +++ b/composeApp/src/commonMain/kotlin/at/torch/compose/ui/view/model/ChatRoomCreationViewModel.kt @@ -20,6 +20,8 @@ import at.torch.compose.ui.view.state.form.ChatRoomCreationFormState import at.torch.compose.ui.view.state.form.CreateProfileFormState import co.touchlab.kermit.Logger import com.vitorpamplona.quartz.marmot.mip01Groups.MarmotGroupData +import com.vitorpamplona.quartz.marmot.mls.crypto.Ed25519 +import com.vitorpamplona.quartz.marmot.mls.crypto.Ed25519KeyPair import com.vitorpamplona.quartz.marmot.mls.group.MlsGroup import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupState import com.vitorpamplona.quartz.nip01Core.core.HexKey @@ -77,31 +79,33 @@ class ChatRoomCreationViewModel( val extras = listOf(metadata.toExtension()) - val group = MlsGroup.create(keyPair.pubKey, keyPair.privKey, extras) + nostrPrivateKey.value.toByteArray().let { privateKey -> + val signingKeyPair = Ed25519.generateKeyPair() +// TODO: Use nostrPrivateKey Ed25519.publicFromPrivate(privateKey).let { ed25519pubKey -> +// Ed25519KeyPair(privateKey, ed25519pubKey) +// } + val group = MlsGroup.create(keyPair.pubKey, signingKeyPair.privateKey, extras) - viewModelScope.launch(Dispatchers.IO) { - val localChatRoom = chatRepository.getOrCreateChatRoom( - chatRoomId = group.groupId.toHex(), - activeUserPublicKey = keyPair.pubKey.toHexKey(), - relayHint = null, - defaultSubject = null, - mlsGroupState = group.saveState().encodeTls().toHex() - ) + viewModelScope.launch(Dispatchers.IO) { + val localChatRoom = chatRepository.getOrCreateChatRoom( + chatRoomId = group.groupId.toHex(), + activeUserPublicKey = keyPair.pubKey.toHexKey(), + relayHint = null, + defaultSubject = null, + mlsGroupState = group.saveState().encodeTls().toHex() + ) - if (localChatRoom == null) { - onNavigateToChatRoom.invoke( - ImplementationPendingRoute("Something went wrong") - ) - } else { - onNavigateToChatRoom.invoke( - ImplementationPendingRoute("Chat Room view ${localChatRoom.chatRoom.id}") - ) + if (localChatRoom == null) { + onNavigateToChatRoom.invoke( + ImplementationPendingRoute("Something went wrong") + ) + } else { + onNavigateToChatRoom.invoke( + ImplementationPendingRoute("Chat Room view ${localChatRoom.chatRoom.id}") + ) + } } - } - - - } }