UIChatPrivateView.lua 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469
  1. local UIChatPrivateView = require("UIChat/UIChatPrivateView_Generate")
  2. local NickNameCtr = require("Common/NickNameCtr")
  3. local curSelectedIdx
  4. local curSelectedHead
  5. local curSelectedUid
  6. local regexPattern = "%[e%d+%]"
  7. local emojiFormat = "[e%s]"
  8. local lastClickLogTime
  9. local lastClickNum
  10. function UIChatPrivateView:OnAwake(data)
  11. self.controller = require("UIChat/UIChatPrivateCtr")
  12. self.controller:Init(self)
  13. self.controller:SetData(data)
  14. end
  15. function UIChatPrivateView:AddEventListener()
  16. ManagerContainer.LuaEventMgr:RegisterUIEvent(self.uiData.name, UIEventNames.REFRESH_PRIVATE_CHAT, function(idx, uid)
  17. --self.inputField.inputField.text = ""
  18. --if curSelectedIdx == nil then
  19. -- self:RefreshPrivateTargets()
  20. --end
  21. --if curSelectedIdx ~= idx then return end
  22. --self:RefreshCurTargetPrivateChats(idx)
  23. local needRefreshHeads, needRefreshChats = false, false
  24. if curSelectedUid ~= uid or curSelectedIdx ~= idx then
  25. needRefreshHeads = true
  26. else
  27. needRefreshChats = true
  28. end
  29. if uid == nil then
  30. curSelectedIdx = 1
  31. end
  32. if needRefreshHeads then
  33. self:RefreshLeftHeads()
  34. else
  35. if needRefreshChats then
  36. self:RefreshCurTargetPrivateChats(curSelectedIdx)
  37. end
  38. end
  39. end)
  40. ManagerContainer.LuaEventMgr:RegisterUIEvent(self.uiData.name, UIEventNames.REFRESH_PRIVATE_BRIEFINFO, function(briefInfo)
  41. self:RefreshLeftHeads()
  42. --self:RefreshTargetBrief(briefInfo)
  43. end)
  44. end
  45. function UIChatPrivateView:FillContent(data, uiBase)
  46. self.uiBase = uiBase
  47. local gameObject = self.uiBase:GetRoot()
  48. if gameObject ~= nil then
  49. self.gameObject = gameObject
  50. self.transform = gameObject.transform
  51. end
  52. self:InitGenerate(self.transform, data)
  53. self:OnceInit()
  54. self:Init()
  55. end
  56. function UIChatPrivateView:OnceInit()
  57. self:InitEmojiPanel()
  58. self:InitPrivatePanel()
  59. end
  60. function UIChatPrivateView:Init()
  61. self.headItemLuaList = {}
  62. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.PRIVATER_CHAT_BTN_DISPLAY, false)
  63. local data = self.controller:GetData()
  64. curSelectedIdx = data
  65. lastClickLogTime = nil
  66. lastClickNum = nil
  67. self:RefreshPrivateTargets()
  68. self.inputField.inputField.characterLimit = Constant.CHAT_BYTE_LIMIT
  69. end
  70. function UIChatPrivateView:InitPrivatePanel()
  71. local loopGridViewInitParam = SuperScrollView.LoopGridViewInitParam.CopyDefaultInitParam()
  72. loopGridViewInitParam.mSnapVecThreshold = 9999
  73. self.scrollView.loopListView:InitListView(0, function(gridView, itemIndex)
  74. return self:RefreshPrivateChats(gridView, itemIndex)
  75. end)
  76. end
  77. function UIChatPrivateView:InitEmojiPanel()
  78. local emojis = ManagerContainer.CfgMgr:GetEmojiCfg()
  79. CommonUtil.LoopGridViewEleCreateNoItem(self,
  80. self.emojiWindow.loopVerticalScrollRect,
  81. emojis,
  82. 0,
  83. self, function (owner, go, idx, logicData)
  84. local textTrans = go.transform:Find("Text")
  85. local text = textTrans:GetComponent(Enum.TypeInfo.SymbolText)
  86. local index = idx
  87. if idx < 10 then
  88. index = "0"..idx
  89. end
  90. text.text = string.format(emojiFormat, index)
  91. local uiTrigger = textTrans:GetComponent(Enum.TypeInfo.UIEventTriggerListener)
  92. uiTrigger.onClick = function()
  93. self:OnEmojiClick(idx)
  94. end
  95. uiTrigger.onBeginDrag = function()
  96. self.emojiWindow.loopVerticalScrollRect:OnBeginDrag(UIEventTriggerListener.currentEventData)
  97. end
  98. uiTrigger.onDrag = function()
  99. self.emojiWindow.loopVerticalScrollRect:OnDrag(UIEventTriggerListener.currentEventData)
  100. end
  101. uiTrigger.onEndDrag = function()
  102. self.emojiWindow.loopVerticalScrollRect:OnEndDrag(UIEventTriggerListener.currentEventData)
  103. end
  104. end)
  105. end
  106. function UIChatPrivateView:OnEmojiClick(idx)
  107. local count = 0
  108. for k, v in string.gmatch(self.inputField.inputField.text, regexPattern) do
  109. count = count + 1
  110. end
  111. if count >= 5 then
  112. ManagerContainer.LuaUIMgr:ErrorNoticeDisplay("ChatError2")
  113. return
  114. end
  115. if idx < 10 then
  116. idx = "0"..idx
  117. end
  118. self.inputField.inputField.text = self.inputField.inputField.text..string.format(emojiFormat, idx)
  119. end
  120. function UIChatPrivateView:RefreshPrivateTargets()
  121. local privateChats = ManagerContainer.DataMgr.ChatData:GetPrivateSortChatDatas()
  122. self.empty:SetActive(#privateChats == 0)
  123. self.exist:SetActive(#privateChats > 0)
  124. if #privateChats > 0 and curSelectedIdx == nil then
  125. curSelectedIdx = 1
  126. end
  127. if curSelectedIdx ~= nil then
  128. self.controller:QueryAllPrivateBriefInfo()
  129. --self:RefreshLeftHeads()
  130. self:RefreshCurTargetPrivateChats(curSelectedIdx)
  131. end
  132. end
  133. function UIChatPrivateView:RefreshLeftHeads()
  134. local privateChats = ManagerContainer.DataMgr.ChatData:GetPrivateSortChatDatas()
  135. CommonUtil.LoopGridViewEleCreateNoItem(self,
  136. self.headList.loopVerticalScrollRect,
  137. privateChats,
  138. 0,
  139. self, self.UpdatePrivateTargets)
  140. end
  141. function UIChatPrivateView:UpdatePrivateTargets(go, idx, logicData)
  142. local transform = go.transform
  143. local toggle = transform:GetComponent(Enum.TypeInfo.Toggle)
  144. local on = transform:Find("On")
  145. local off = transform:Find("Off")
  146. -- local frameImage = transform:Find("Image"):GetComponent(Enum.TypeInfo.Image)
  147. -- local headImage = transform:Find("Head"):GetComponent(Enum.TypeInfo.Image)
  148. local headItem = transform:Find("HeadBox/HeadItem")
  149. local redPoint = transform:Find("RedPoint")
  150. local Closed = transform:Find("Closed")
  151. local closedBtn = Closed:GetComponent(Enum.TypeInfo.Button)
  152. local nameText = transform:Find("Name"):GetComponent(Enum.TypeInfo.Text)
  153. on.gameObject:SetActive(curSelectedIdx == idx + 1)
  154. off.gameObject:SetActive(curSelectedIdx ~= idx + 1)
  155. Closed.gameObject:SetActive(curSelectedIdx == idx + 1)
  156. local jobIcon = nil
  157. if logicData.fromData.jobId ~= nil then
  158. local jobCfg = ManagerContainer.CfgMgr:GetJobDataById(logicData.fromData.jobId)
  159. if jobCfg ~= nil then
  160. jobIcon = jobCfg.JobIcon;
  161. end
  162. end
  163. local tempData = {HeadIcon = logicData.fromData.imgId, ProfessionIcon = jobIcon, Level = logicData.fromData.level, IsHero = true};
  164. local headItemLua = CommonUtil.BindGridViewItem2Lua(self, "HeadItem", headItem.gameObject)
  165. CommonUtil.SetPlayerHeadAndFrame(self,headItemLua,tempData,false,logicData.fromData.headFrameId)
  166. headItemLua.head.image.raycastTarget = false
  167. CommonUtil.SetTotalChildrenGray(headItem.gameObject, logicData.fromData.onlineState == false)
  168. redPoint.gameObject:SetActive(curSelectedIdx ~= idx + 1 and logicData.isNew)
  169. go.name = logicData.fromData.uid
  170. if curSelectedIdx == idx + 1 then
  171. curSelectedHead = go
  172. curSelectedUid = logicData.fromData.uid
  173. logicData.isNew = false
  174. local needQuery = ManagerContainer.DataMgr.ChatData:NeedQueryOfflinePrivateInfo(logicData.fromData)
  175. if needQuery then
  176. self.controller:SendOfflinePrivateChatQuery(logicData.fromData.uid)
  177. else
  178. self:RefreshCurTargetPrivateChats(curSelectedIdx)
  179. end
  180. --self.controller:QueryPrivateBriefInfo(logicData.fromData.uid)
  181. end
  182. nameText.text = CommonUtil.GetVaildNickName(logicData.fromData.nickname)
  183. self.uiBase:AddButtonUniqueEventListener(closedBtn,self, self.OnTargetCloseClick, idx + 1)
  184. self.uiBase:AddToggleUniqueEventListener(toggle, self, self.OnPrivateTargetSelected, idx + 1)
  185. end
  186. function UIChatPrivateView:OnPrivateTargetSelected(toggle, params, result)
  187. if not result then return end
  188. local idx = params[0]
  189. if not idx or curSelectedIdx == idx then return end
  190. local privateChats = ManagerContainer.DataMgr.ChatData:GetPrivateSortChatDatas()
  191. local fromData = privateChats[idx].fromData
  192. curSelectedUid = fromData.uid
  193. curSelectedIdx = idx
  194. curSelectedHead = toggle.gameObject
  195. self:RefreshLeftHeads()
  196. end
  197. function UIChatPrivateView:OnTargetCloseClick(button, params)
  198. local idx = params[0]
  199. ManagerContainer.DataMgr.ChatData:RemovePrivateChatData(idx)
  200. curSelectedIdx = 1
  201. local privateChats = ManagerContainer.DataMgr.ChatData:GetPrivateSortChatDatas()
  202. if #privateChats == 0 then
  203. curSelectedIdx = nil
  204. self:RefreshPrivateTargets()
  205. else
  206. self:RefreshLeftHeads()
  207. end
  208. end
  209. function UIChatPrivateView:RefreshTargetBrief(briefInfo)
  210. local privateChats = ManagerContainer.DataMgr.ChatData:GetPrivateSortChatDatas()
  211. local curTargetFromData = privateChats[curSelectedIdx].fromData
  212. if briefInfo.uid ~= curTargetFromData.uid then return end
  213. --curTargetFromData = briefInfo
  214. local nameText = curSelectedHead.transform:Find("Name"):GetComponent(Enum.TypeInfo.Text)
  215. nameText.text = CommonUtil.GetVaildNickName(briefInfo.nickname)
  216. local jobIcon = nil
  217. if curTargetFromData.jobId ~= nil then
  218. local jobCfg = ManagerContainer.CfgMgr:GetJobDataById(curTargetFromData.jobId)
  219. if jobCfg ~= nil then
  220. jobIcon = jobCfg.JobIcon;
  221. end
  222. end
  223. local headTrans = curSelectedHead.transform:Find("HeadBox/HeadItem")
  224. local tempData = {HeadIcon = curTargetFromData.imgId, ProfessionIcon = jobIcon, Level = curTargetFromData.level, IsHero = true};
  225. local headItemLua = CommonUtil.GetBindGridViewItem2Lua(self, "HeadItem", headTrans.gameObject)
  226. CommonUtil.SetPlayerHeadAndFrame(self,headItemLua,tempData,false,curTargetFromData.headFrameId)
  227. CommonUtil.SetTotalChildrenGray(headItemLua.gameObject, curTargetFromData.onlineState == false)
  228. end
  229. function UIChatPrivateView:RefreshCurTargetPrivateChats(idx)
  230. local privateChats = ManagerContainer.DataMgr.ChatData:GetPrivateSortChatDatas()
  231. if curSelectedHead ~= nil then
  232. local fromData = privateChats[idx].fromData
  233. local nameText = curSelectedHead.transform:Find("Name"):GetComponent(Enum.TypeInfo.Text)
  234. nameText.text = CommonUtil.GetVaildNickName(fromData.nickname)
  235. end
  236. --self.controller:QueryPrivateBriefInfo(privateChats[idx].fromData.uid)
  237. local datas = privateChats[idx].chats
  238. local max = #datas
  239. self.scrollView.loopListView:SetListItemCount(max, true)
  240. --self.scrollView.loopListView:FinishSnapImmediately()
  241. self.scrollView.loopListView:MovePanelToItemIndex(max - 1, 0)
  242. --local scrollView = self.scrollView
  243. --CommonUtil.LoopGridViewEleCreateNew(self,
  244. -- scrollView.loopVerticalScrollRect,
  245. -- nil,
  246. -- datas,
  247. -- 0,
  248. -- self, self.RefreshPrivateChats)
  249. --
  250. --if #datas > 0 then
  251. -- scrollView.loopVerticalScrollRect:MoveTo(#datas - 1)
  252. --end
  253. end
  254. function UIChatPrivateView:RefreshPrivateChats(gridView, itemIndex)
  255. local item = gridView:NewListViewItem(Enum.PrefabNames.PrivateChatItem)
  256. local itemLua = CommonUtil.BindGridViewItem2Lua(self, Enum.PrefabNames.PrivateChatItem, item.gameObject)
  257. local privateChats = ManagerContainer.DataMgr.ChatData:GetPrivateSortChatDatas()
  258. local datas = privateChats[curSelectedIdx]
  259. local lastChat = datas.chats[itemIndex]
  260. local logicData = {lastChat, datas.chats[itemIndex + 1]}
  261. CommonUtil.UpdateItemPrefab(self, itemLua, logicData)
  262. return item
  263. end
  264. --function UIChatPrivateView:RefreshPrivateChats(itemlua, idx)
  265. -- local privateChats = ManagerContainer.DataMgr.ChatData:GetPrivateSortChatDatas()
  266. -- local datas = privateChats[curSelectedIdx]
  267. -- local lastChat = datas.chats[idx]
  268. -- local logicData = {lastChat, datas.chats[idx + 1]}
  269. -- CommonUtil.UpdateItemPrefab(self, itemlua, logicData)
  270. --end
  271. function UIChatPrivateView:RemoveEventListener()
  272. ManagerContainer.LuaEventMgr:Unregister(self.uiData.name)
  273. end
  274. function UIChatPrivateView:OnBtnClose(button, params)
  275. if self.emojiWindow.activeSelf then
  276. self:OnEmojiBgClick()
  277. return
  278. end
  279. self:UIClose()
  280. end
  281. function UIChatPrivateView:OnClickBtnLog(button, params)
  282. local curTime = ManagerContainer.LuaTimerMgr:CurLuaServerTime()
  283. if not lastClickLogTime or (curTime - lastClickLogTime) > 15000 then
  284. lastClickLogTime = curTime
  285. lastClickNum = 0
  286. end
  287. if not lastClickNum then
  288. lastClickNum = 0
  289. end
  290. lastClickNum = lastClickNum + 1
  291. if lastClickNum >= 30 then
  292. lastClickNum = 0
  293. ManagerContainer.LuaUIMgr:ErrorNoticeDisplay('Egg1')
  294. end
  295. end
  296. function UIChatPrivateView:OnEmojiBgClick(button, params)
  297. self.emojiWindow:SetActive(not self.emojiWindow.activeSelf)
  298. end
  299. function UIChatPrivateView:OnInputChanged(content)
  300. local temp = self.inputField.inputField.text
  301. --local length = StringUtil.GetTextLeng(self.inputField.inputField.textComponent, temp)
  302. --LogError(length)
  303. --if string.len(temp) > Constant.CHAT_BYTE_LIMIT then
  304. --temp = string.sub(temp, 0, Constant.CHAT_BYTE_LIMIT)
  305. --end
  306. temp = string.gsub(temp, "#h", "")
  307. temp = string.gsub(temp, "#t", "")
  308. temp = string.gsub(temp, "#", "")
  309. temp = StringUtil.FilterEmoji(temp)
  310. self.inputField.inputField.text = temp
  311. end
  312. function UIChatPrivateView:OnSendClick(button, params)
  313. if self.emojiWindow.activeSelf then
  314. self:OnEmojiBgClick()
  315. end
  316. local _openCreateName = NickNameCtr:NeedOpenCreate()
  317. if _openCreateName then
  318. NickNameCtr:OpenNickNamePage(true);
  319. return;
  320. end
  321. local emojis = ManagerContainer.CfgMgr:GetEmojiCfg()
  322. for k, v in string.gmatch(self.inputField.inputField.text, regexPattern) do
  323. local num = tonumber(string.match(k, '%d+'))
  324. if num >= #emojis then
  325. self.inputField.inputField.text = string.gsub(self.inputField.inputField.text, k, "")
  326. end
  327. end
  328. if self.inputField.inputField.text == "[]" then
  329. self.inputField.inputField.text = ""
  330. end
  331. if self.inputField.inputField.text == "" then
  332. ManagerContainer.LuaUIMgr:ErrorNoticeDisplay("ChatContentEmpty")
  333. return
  334. end
  335. local privateChats = ManagerContainer.DataMgr.ChatData:GetPrivateSortChatDatas()
  336. local datas = privateChats[curSelectedIdx]
  337. local content = self.inputField.inputField.text
  338. local level = ManagerContainer.DataMgr.UserData:GetRoleLv()
  339. if SDKMgr.Instance:CheckSpeech(level, ChannelType.PRIVATE, content) then
  340. self.controller:SendPrivateChat(content, datas.fromData.uid)
  341. self.inputField.inputField.text = ""
  342. else
  343. ManagerContainer.LuaUIMgr:ErrorNoticeDisplay("ShieldTips01")
  344. end
  345. end
  346. function UIChatPrivateView:AddUIEventListener()
  347. ManagerContainer.LuaEventMgr:RegisterUIEvent(self.uiData.name)
  348. self.uiBase:AddButtonEventListener(self.AnyBtn.button, self, self.OnBtnClose)
  349. self.uiBase:AddButtonEventListener(self.btnClose.button, self, self.OnBtnClose)
  350. self.uiBase:AddButtonUniqueEventListener(self.btnLog.button, self, self.OnClickBtnLog)
  351. self.uiBase:AddButtonEventListener(self.btnSend.button,self, self.OnSendClick)
  352. self.uiBase:AddButtonEventListener(self.btnEmoji.button, self, self.OnEmojiBgClick)
  353. self.uiBase:AddInputFileEventListener(self.inputField.inputField, function(input, content)
  354. self:OnInputChanged(content)
  355. end)
  356. self.scrollView.uIEventTriggerListener.onClick = function()
  357. if self.emojiWindow.activeSelf then
  358. self:OnEmojiBgClick()
  359. return
  360. end
  361. end
  362. end
  363. function UIChatPrivateView:OnHide()
  364. end
  365. function UIChatPrivateView:OnShow(data)
  366. self.controller:SetData(data)
  367. self:Init()
  368. end
  369. function UIChatPrivateView:OnClose()
  370. CommonUtil.ClearGridViewItem(self,"HeadItem")
  371. local privateChats = ManagerContainer.DataMgr.ChatData:GetPrivateSortChatDatas()
  372. if #privateChats > 0 then
  373. local logicData = privateChats[curSelectedIdx]
  374. if logicData then
  375. logicData.isNew = false
  376. end
  377. end
  378. ManagerContainer.DataMgr.ChatData:CheckHasNewPrivateChat()
  379. ManagerContainer.DataMgr.ChatData:SavePrivateDatas()
  380. end
  381. function UIChatPrivateView:OnDispose()
  382. self.emojiWindow:SetActive(false)
  383. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.PRIVATER_CHAT_BTN_DISPLAY, true)
  384. curSelectedIdx = nil
  385. curSelectedHead = nil
  386. curSelectedUid = nil
  387. lastClickLogTime = nil
  388. lastClickNum = nil
  389. self.scrollView.uIEventTriggerListener.onClick = nil
  390. self.scrollView.loopListView:Dispose()
  391. self.emojiWindow.loopVerticalScrollRect:ClearCells()
  392. end
  393. return UIChatPrivateView