import { useCallback, useEffect, useState } from 'react'; import { firstCharToLowerCase, firstCharToUpperCase, isClient, Subject, } from '@/utils/tool'; import { API, DATA } from '@/services/API'; import dayjs from 'dayjs'; import { throttle } from 'lodash'; import { fetchApi } from './request'; import storage from './storage'; // // let workspacePath = ''; // // 暂时不用 待定 // export function useWorkspacePath() { // const ctx = useState(''); // // const setPath = useCallback((value: string) => { // // setThePath(value); // // workspacePath = value; // // }, [setThePath]); // useEffect(() => { // // 获取当前使用的路径; 这里的接口需要做一层防抖 // }, []); // return ctx; // } class FileMessageManager extends Subject { public list: DATA.SocketFileMsg[] = []; // 主键 taskId public fileMap = new Map(); addFileMsg(message: DATA.SocketFileMsg) { this.fileMap.set(message.taskId, message); this.list = [message].concat(this.list); this.notifyObservers(this.list); } updateFileMsg(message: DATA.SocketFileMsg) { this.fileMap.set(message.taskId, message); this.list = this.list.map((msg) => msg.taskId === message.taskId ? message : msg, ); this.notifyObservers(this.list); } receiveMessage(messageStr: string) { try { const message = firstCharToLowerCase( JSON.parse(messageStr), ) as DATA.SocketFileMsg; // 数据处理 message.taskCreateDate = dayjs((message.taskCreateUnixTime || 0) * 1000); // 给消息窗口使用 message.taskCreateDateStr = message.taskCreateDate.format('YY/MM/DD HH:mm:ss'); const existMsg = this.fileMap.get(message.taskId); if (existMsg) { this.updateFileMsg(message); } else { this.addFileMsg(message); } } catch (e) { console.error('message 解析失败:', e, messageStr); } } } export const fileMng = new FileMessageManager(); export const msgNotifySubject = new Subject(); msgNotifySubject.addObserver((upperNotifyMessage) => { if (!isClient) { return; } const message = transformNotifyMessage(upperNotifyMessage); if (!message) { return; } window.ipcRenderer.invoke('notify', message); }); function transformNotifyMessage(notifyMessage: any) { try { if (!notifyMessage.parameter) return null; const fileMsg = firstCharToLowerCase( JSON.parse(notifyMessage.parameter), ) as DATA.SocketFileMsg; fileMsg.originData = notifyMessage.parameter; fileMsg.notifyType = notifyMessage.type; fileMsg.notifyMessage = notifyMessage.body; // 数据处理 fileMsg.taskCreateDate = dayjs((notifyMessage.unixTime || 0) * 1000); // 给消息窗口使用 fileMsg.taskCreateDateStr = fileMsg.taskCreateDate.format('YY/MM/DD HH:mm:ss'); return fileMsg; } catch (e) { console.error('transformNotifyMessage 解析失败:', e, notifyMessage); return null; } } export function useSocketMessages() { const [list, setList] = useState(fileMng.list); useEffect(() => { fileMng.addObserver(setList); return () => { fileMng.removeObserver(setList); }; }, []); return list; } export function useNotificationMessages() { const [list, setList] = useState>([]); const fetchMessages = useCallback( throttle(async () => { const accountId = storage.get('accountId'); const [headList, hisList] = await Promise.all< API.ResponseData, API.ResponseData >([ fetchApi('lockingmsg/queryLockingMsgListByFilter', { userId: accountId, status: 1, }), fetchApi('lockingmsg/queryLockingMsgListByFilter', { userId: accountId, status: 2, }), ]); const finalList = headList.data ?.reverse() .concat((hisList.data || []).reverse()) .reduce((arr, notifyMessage) => { const message = transformNotifyMessage(notifyMessage); if (!message) return arr; arr.push(message); return arr; }, []) as DATA.SocketFileMsg[]; setList(finalList); }, 500), [], ); console.log(list); useEffect(() => { msgNotifySubject.addObserver(fetchMessages); return () => { msgNotifySubject.removeObserver(fetchMessages); }; }, []); useEffect(() => { fetchMessages(); }, []); return list; }