LOCKING盒子版
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

162 lines
4.4 KiB

  1. import { useCallback, useEffect, useState } from 'react';
  2. import {
  3. firstCharToLowerCase,
  4. firstCharToUpperCase,
  5. isClient,
  6. Subject,
  7. } from '@/utils/tool';
  8. import { API, DATA } from '@/services/API';
  9. import dayjs from 'dayjs';
  10. import { throttle } from 'lodash';
  11. import { fetchApi } from './request';
  12. import storage from './storage';
  13. // // let workspacePath = '';
  14. // // 暂时不用 待定
  15. // export function useWorkspacePath() {
  16. // const ctx = useState('');
  17. // // const setPath = useCallback((value: string) => {
  18. // // setThePath(value);
  19. // // workspacePath = value;
  20. // // }, [setThePath]);
  21. // useEffect(() => {
  22. // // 获取当前使用的路径; 这里的接口需要做一层防抖
  23. // }, []);
  24. // return ctx;
  25. // }
  26. class FileMessageManager extends Subject {
  27. public list: DATA.SocketFileMsg[] = [];
  28. // 主键 taskId
  29. public fileMap = new Map();
  30. addFileMsg(message: DATA.SocketFileMsg) {
  31. this.fileMap.set(message.taskId, message);
  32. this.list = [message].concat(this.list);
  33. this.notifyObservers(this.list);
  34. }
  35. updateFileMsg(message: DATA.SocketFileMsg) {
  36. this.fileMap.set(message.taskId, message);
  37. this.list = this.list.map((msg) =>
  38. msg.taskId === message.taskId ? message : msg,
  39. );
  40. this.notifyObservers(this.list);
  41. }
  42. receiveMessage(messageStr: string) {
  43. try {
  44. const message = firstCharToLowerCase(
  45. JSON.parse(messageStr),
  46. ) as DATA.SocketFileMsg;
  47. // 数据处理
  48. message.taskCreateDate = dayjs((message.taskCreateUnixTime || 0) * 1000);
  49. // 给消息窗口使用
  50. message.taskCreateDateStr =
  51. message.taskCreateDate.format('YY/MM/DD HH:mm:ss');
  52. const existMsg = this.fileMap.get(message.taskId);
  53. if (existMsg) {
  54. this.updateFileMsg(message);
  55. } else {
  56. this.addFileMsg(message);
  57. }
  58. } catch (e) {
  59. console.error('message 解析失败:', e, messageStr);
  60. }
  61. }
  62. }
  63. export const fileMng = new FileMessageManager();
  64. export const msgNotifySubject = new Subject();
  65. msgNotifySubject.addObserver((upperNotifyMessage) => {
  66. if (!isClient) {
  67. return;
  68. }
  69. const message = transformNotifyMessage(upperNotifyMessage);
  70. if (!message) {
  71. return;
  72. }
  73. window.ipcRenderer.invoke('notify', message);
  74. });
  75. function transformNotifyMessage(notifyMessage: any) {
  76. try {
  77. if (!notifyMessage.parameter) return null;
  78. const fileMsg = firstCharToLowerCase(
  79. JSON.parse(notifyMessage.parameter),
  80. ) as DATA.SocketFileMsg;
  81. fileMsg.originData = notifyMessage.parameter;
  82. fileMsg.notifyType = notifyMessage.type;
  83. fileMsg.notifyMessage = notifyMessage.body;
  84. // 数据处理
  85. fileMsg.taskCreateDate = dayjs((notifyMessage.unixTime || 0) * 1000);
  86. // 给消息窗口使用
  87. fileMsg.taskCreateDateStr =
  88. fileMsg.taskCreateDate.format('YY/MM/DD HH:mm:ss');
  89. return fileMsg;
  90. } catch (e) {
  91. console.error('transformNotifyMessage 解析失败:', e, notifyMessage);
  92. return null;
  93. }
  94. }
  95. export function useSocketMessages() {
  96. const [list, setList] = useState(fileMng.list);
  97. useEffect(() => {
  98. fileMng.addObserver(setList);
  99. return () => {
  100. fileMng.removeObserver(setList);
  101. };
  102. }, []);
  103. return list;
  104. }
  105. export function useNotificationMessages() {
  106. const [list, setList] = useState<Array<DATA.SocketFileMsg>>([]);
  107. const fetchMessages = useCallback(
  108. throttle(async () => {
  109. const accountId = storage.get('accountId');
  110. const [headList, hisList] = await Promise.all<
  111. API.ResponseData<any[]>,
  112. API.ResponseData<any[]>
  113. >([
  114. fetchApi('lockingmsg/queryLockingMsgListByFilter', {
  115. userId: accountId,
  116. status: 1,
  117. }),
  118. fetchApi('lockingmsg/queryLockingMsgListByFilter', {
  119. userId: accountId,
  120. status: 2,
  121. }),
  122. ]);
  123. const finalList = headList.data
  124. ?.reverse()
  125. .concat((hisList.data || []).reverse())
  126. .reduce((arr, notifyMessage) => {
  127. const message = transformNotifyMessage(notifyMessage);
  128. if (!message) return arr;
  129. arr.push(message);
  130. return arr;
  131. }, []) as DATA.SocketFileMsg[];
  132. setList(finalList);
  133. }, 500),
  134. [],
  135. );
  136. console.log(list);
  137. useEffect(() => {
  138. msgNotifySubject.addObserver(fetchMessages);
  139. return () => {
  140. msgNotifySubject.removeObserver(fetchMessages);
  141. };
  142. }, []);
  143. useEffect(() => {
  144. fetchMessages();
  145. }, []);
  146. return list;
  147. }