|
- 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<Array<DATA.SocketFileMsg>>([]);
- const fetchMessages = useCallback(
- throttle(async () => {
- const accountId = storage.get('accountId');
- const [headList, hisList] = await Promise.all<
- API.ResponseData<any[]>,
- API.ResponseData<any[]>
- >([
- 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;
- }
|