diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/GroupConversationScreen.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/GroupConversationScreen.kt index 642152e4520067fe6f2496712ffcaaaa56567f3f..11fafd1e389e7e15002aad6980d033ba1d24f0b1 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/GroupConversationScreen.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/GroupConversationScreen.kt @@ -68,8 +68,12 @@ fun GroupConversationScreen( ) { Scaffold( topBar = { - GroupConversationHeader(viewModel.groupItem, viewModel.forumSharingViewModel) { - viewModel.deleteGroup(viewModel.groupItem) + viewModel.groupItem.value?.let { groupItem -> + GroupConversationHeader( + groupItem = groupItem, + forumSharingViewModel = viewModel.forumSharingViewModel, + onGroupDelete = viewModel::deleteGroup, + ) } }, content = { padding -> @@ -84,7 +88,7 @@ fun GroupConversationScreen( bottomBar = { val onCloseReply = { viewModel.selectPost(null) } GroupInputComposable(viewModel.selectedPost.value, onCloseReply) { text -> - viewModel.createPost(viewModel.groupItem, text, viewModel.selectedPost.value?.id) + viewModel.createPost(text) } } ) diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ThreadedConversationViewModel.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ThreadedConversationViewModel.kt index 08aa3bbea804179f769b625b394164cca261adea..b1561a4adca2e3009829109591f8be8ad904dbf7 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ThreadedConversationViewModel.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ThreadedConversationViewModel.kt @@ -64,8 +64,8 @@ class ThreadedConversationViewModel @Inject constructor( private val LOG = KotlinLogging.logger {} } - lateinit var groupItem: GroupItem - private set + private val _groupItem = mutableStateOf<GroupItem?>(null) + val groupItem = _groupItem.asState() private lateinit var onPostAdded: (header: ForumPostHeader) -> Unit @@ -77,8 +77,8 @@ class ThreadedConversationViewModel @Inject constructor( @UiExecutor fun setGroupItem(groupItem: GroupItem, onPostAdded: (header: ForumPostHeader) -> Unit) { - this.groupItem = groupItem this.onPostAdded = onPostAdded + _groupItem.value = groupItem _selectedPost.value = null forumSharingViewModel.setGroupId(groupItem.id) loadPosts(groupItem.id) @@ -87,7 +87,7 @@ class ThreadedConversationViewModel @Inject constructor( @UiExecutor override fun eventOccurred(e: Event) { if (e is ForumPostReceivedEvent) { - if (e.groupId == groupItem.id) { + if (e.groupId == _groupItem.value?.id) { val item = ForumPostItem(e.header, e.text) addItem(item, null) } @@ -125,16 +125,18 @@ class ThreadedConversationViewModel @Inject constructor( @UiExecutor @OptIn(DelicateCoroutinesApi::class) - fun createPost(groupItem: GroupItem, text: String, parentId: MessageId?) = GlobalScope.launch { + fun createPost(text: String) = GlobalScope.launch { + val groupId = _groupItem.value?.id ?: return@launch + val parentId = _selectedPost.value?.id val author = runOnDbThreadWithTransaction<LocalAuthor>(false) { txn -> identityManager.getLocalAuthor(txn) } val count = runOnDbThreadWithTransaction<MessageTracker.GroupCount>(false) { txn -> - forumManager.getGroupCount(txn, groupItem.id) + forumManager.getGroupCount(txn, groupId) } val timestamp = max(count.latestMsgTime + 1, clock.currentTimeMillis()) val post = withContext(cryptoDispatcher) { - forumManager.createLocalPost(groupItem.id, text, timestamp, parentId, author) + forumManager.createLocalPost(groupId, text, timestamp, parentId, author) } runOnDbThreadWithTransaction(false) { txn -> val header = forumManager.addLocalPost(txn, post) @@ -172,22 +174,23 @@ class ThreadedConversationViewModel @Inject constructor( item.id } ?: emptyList() - if (readIds.isNotEmpty()) { + val groupId = _groupItem.value?.id + if (readIds.isNotEmpty() && groupId != null) { runOnDbThread { readIds.forEach { id -> - forumManager.setReadFlag(groupItem.id, id, true) + forumManager.setReadFlag(groupId, id, true) } } // we don't attach this to the transaction that actually changes the DB, // but that should be fine for this purpose of just decrementing a counter - eventBus.broadcast(ForumPostReadEvent(groupItem.id, readIds.size)) + eventBus.broadcast(ForumPostReadEvent(groupId, readIds.size)) // TODO replace immutable ThreadItems instead to avoid recomposing whole list val messageTree = (posts.value as? Loaded)?.messageTree ?: return _posts.value = Loaded(messageTree) } } - fun deleteGroup(groupItem: GroupItem) { - forumManager.removeForum((groupItem as ForumItem).forum) + fun deleteGroup() { + _groupItem.value?.let { forumManager.removeForum((it as ForumItem).forum) } } } diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/sharing/ForumSharingViewModel.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/sharing/ForumSharingViewModel.kt index e50df04604937403a673baaed691270384671fb3..4e0a9967a791b985bf9614b7c19782d6c0696bd5 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/sharing/ForumSharingViewModel.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/sharing/ForumSharingViewModel.kt @@ -75,7 +75,7 @@ class ForumSharingViewModel @Inject constructor( private val LOG = KotlinLogging.logger {} } - private lateinit var groupId: GroupId + private var _groupId: GroupId? = null private val _sharingStatus = mutableStateOf(emptyMap<ContactId, SharingStatus>()) private val _shareableSelected = mutableStateOf(emptySet<ContactId>()) @@ -113,8 +113,8 @@ class ForumSharingViewModel @Inject constructor( @UiExecutor fun setGroupId(groupId: GroupId) { - if (this::groupId.isInitialized && groupId == this.groupId) return - this.groupId = groupId + if (_groupId == groupId) return + _groupId = groupId reload() } @@ -140,17 +140,19 @@ class ForumSharingViewModel @Inject constructor( @UiExecutor fun shareForum() = runOnDbThreadWithTransaction(false) { txn -> + val groupId = _groupId ?: return@runOnDbThreadWithTransaction val message = _sharingMessage.value.ifEmpty { null } _shareableSelected.value.forEach { contactId -> forumSharingManager.sendInvitation(txn, groupId, contactId, message) + txn.attach { reload() } } - txn.attach { reload() } } @UiExecutor override fun eventOccurred(e: Event?) { super.eventOccurred(e) + val groupId = _groupId ?: return when { e is ForumInvitationResponseReceivedEvent && e.messageHeader.shareableId == groupId -> { if (e.messageHeader.wasAccepted()) { @@ -182,13 +184,14 @@ class ForumSharingViewModel @Inject constructor( override fun loadContactsWithinTransaction(txn: Transaction) { super.loadContactsWithinTransaction(txn) - if (this::groupId.isInitialized) loadSharingStatus(txn) + if (_groupId != null) loadSharingStatus(txn) } private fun loadSharingStatus(): Unit = runOnDbThreadWithTransaction(true, this::loadSharingStatus) private fun loadSharingStatus(txn: Transaction) { + val groupId = _groupId ?: return val map = contactManager.getContacts(txn).associate { contact -> contact.id to forumSharingManager.getSharingStatus(txn, groupId, contact) }