Selaa lähdekoodia

feat: IM交互优化,用户推荐优化

DoggyZhang 1 kuukausi sitten
vanhempi
sitoutus
f014151d6c

+ 6 - 0
app/src/main/java/com/adealink/weparty/module/im/data/IMLiveData.kt

@@ -0,0 +1,6 @@
+package com.adealink.weparty.module.im.data
+
+import com.adealink.frame.mvvm.livedata.ExtMutableLiveData
+import com.tencent.qcloud.tuikit.timcommon.bean.TUIMessageBean
+
+val sendIMMessageLD = ExtMutableLiveData<TUIMessageBean?>()

+ 1 - 0
module/im/src/main/java/com/adealink/weparty/im/session/SessionFragment.kt

@@ -193,6 +193,7 @@ class SessionFragment : BaseFragment(R.layout.fragment_session) {
             messageList.doOnPreDraw {
                 messageList.scrollToEnd()
             }
+            inputViewModel.notifySoftInputVisible(bottomInset > 0)
             insets
         }
     }

+ 13 - 2
module/im/src/main/java/com/adealink/weparty/im/session/comp/SessionBottomComp.kt

@@ -1,6 +1,7 @@
 package com.adealink.weparty.im.session.comp
 
 import androidx.lifecycle.LifecycleOwner
+import com.adealink.frame.base.Rlt
 import com.adealink.frame.mvvm.view.ViewComponent
 import com.adealink.frame.mvvm.viewmodel.activityViewModels
 import com.adealink.weparty.commonui.ext.gone
@@ -10,6 +11,7 @@ import com.adealink.weparty.im.databinding.LayoutSessionBottomBarBinding
 import com.adealink.weparty.im.session.comp.input.InputAction
 import com.adealink.weparty.im.session.comp.input.InputState
 import com.adealink.weparty.im.session.comp.viewmodel.SessionInputViewModel
+import com.adealink.weparty.module.im.data.sendIMMessageLD
 import com.tencent.qcloud.tuikit.tuichat.bean.ChatInfo
 import com.tencent.qcloud.tuikit.tuichat.presenter.ChatPresenter
 
@@ -62,8 +64,17 @@ class SessionBottomComp(
             }
         }
 
-        inputViewModel.sendMessageResultLD.observe(viewLifecycleOwner) { result ->
-            showFailedToast(result)
+        inputViewModel.sendMessageResultLD.observe(viewLifecycleOwner) { rlt ->
+            showFailedToast(rlt)
+            when (rlt) {
+                is Rlt.Failed -> {
+
+                }
+
+                is Rlt.Success -> {
+                    sendIMMessageLD.postValue(rlt.data)
+                }
+            }
         }
 
     }

+ 8 - 0
module/im/src/main/java/com/adealink/weparty/im/session/comp/SessionBottomInputComp.kt

@@ -318,6 +318,14 @@ class SessionBottomInputComp(
                 }
             }
         }
+
+        sessionInputViewModel.inputVisibleLD.observe(viewLifecycleOwner) { visible ->
+            if (!visible) {
+                if (sessionInputViewModel.inputStateLD.value?.currentState != InputState.STATE_NONE) {
+                    sessionInputViewModel.execute(InputAction.EMPTY_CLICKED)
+                }
+            }
+        }
     }
 
     private fun clickEmoji() {

+ 7 - 0
module/im/src/main/java/com/adealink/weparty/im/session/comp/viewmodel/SessionInputViewModel.kt

@@ -36,6 +36,13 @@ data class SessionInputState(
 
 class SessionInputViewModel : BaseViewModel() {
 
+    val inputVisibleLD = ExtMutableLiveData<Boolean>()
+
+    fun notifySoftInputVisible(visible: Boolean) {
+        inputVisibleLD.send(visible)
+    }
+
+
     val transactionLD = ExtMutableLiveData<InputMachineTransaction>()
     val inputStateLD = MutableLiveData<SessionInputState>()
     private val stateMachine: SessionInputMachine =

+ 1 - 1
module/playmate/src/main/java/com/adealink/weparty/playmate/data/PlaymateData.kt

@@ -98,7 +98,7 @@ data class UserPushListData(
     @SerializedName("gender") val gender: Int = 0, //性别
     @SerializedName("online") val online: Boolean, //
     @SerializedName("newRegister") val newRegister: Boolean, //是否新注册
-    @SerializedName("contacted") val contacted: Boolean, //是否已私聊
+    @SerializedName("contacted") var contacted: Boolean, //是否已私聊
 )
 
 

+ 7 - 0
module/playmate/src/main/java/com/adealink/weparty/playmate/userpush/UserPushFragment.kt

@@ -14,6 +14,7 @@ import com.adealink.weparty.commonui.recycleview.adapter.MultiTypeListAdapter
 import com.adealink.weparty.commonui.recycleview.itemdecoration.VerticalSpaceItemDecoration
 import com.adealink.weparty.commonui.toast.util.showFailedToast
 import com.adealink.weparty.module.im.IM
+import com.adealink.weparty.module.im.data.sendIMMessageLD
 import com.adealink.weparty.module.profile.Profile
 import com.adealink.weparty.playmate.R
 import com.adealink.weparty.playmate.databinding.FragmentUserPushBinding
@@ -88,6 +89,12 @@ class UserPushFragment : BaseFragment(R.layout.fragment_user_push) {
             binding.vRefresh.finishLoadMore()
             showFailedToast(rlt)
         }
+        sendIMMessageLD.observe(viewLifecycleOwner) { msg ->
+            msg ?: return@observe
+            viewModel.notifyContactedChanged(msg.userId) { pos ->
+                listAdapter.notifyItemChanged(pos)
+            }
+        }
     }
 
     private fun goProfile(uid: String) {

+ 15 - 0
module/playmate/src/main/java/com/adealink/weparty/playmate/userpush/viewmodel/UserPushViewModel.kt

@@ -51,4 +51,19 @@ class UserPushViewModel : BaseViewModel() {
     }
 
 
+    fun notifyContactedChanged(uid: String, notifyItemChanged: (position: Int) -> Unit) {
+        viewModelScope.launch {
+            userPushItemList.indexOfFirst { it.data.uid == uid }.let { index ->
+                if (index >= 0) {
+                    val item = userPushItemList.getOrNull(index) ?: return@launch
+                    if (item.data.contacted) {
+                        return@launch
+                    }
+                    item.data.contacted = true
+                    notifyItemChanged.invoke(index)
+                }
+            }
+        }
+    }
+
 }