diff --git a/apps/client/src/services/ws.ts b/apps/client/src/services/ws.ts index b873289b4..79f64c598 100644 --- a/apps/client/src/services/ws.ts +++ b/apps/client/src/services/ws.ts @@ -9,7 +9,7 @@ import type { EntityChange } from "../server_types.js"; import { WebSocketMessage } from "@triliumnext/commons"; type MessageHandler = (message: WebSocketMessage) => void; -const messageHandlers: MessageHandler[] = []; +let messageHandlers: MessageHandler[] = []; let ws: WebSocket; let lastAcceptedEntityChangeId = window.glob.maxEntityChangeIdAtLoad; @@ -48,10 +48,14 @@ function logInfo(message: string) { window.logError = logError; window.logInfo = logInfo; -function subscribeToMessages(messageHandler: MessageHandler) { +export function subscribeToMessages(messageHandler: MessageHandler) { messageHandlers.push(messageHandler); } +export function unsubscribeToMessage(messageHandler: MessageHandler) { + messageHandlers = messageHandlers.filter(handler => handler !== messageHandler); +} + // used to serialize frontend update operations let consumeQueuePromise: Promise | null = null; diff --git a/apps/client/src/widgets/collections/NoteList.tsx b/apps/client/src/widgets/collections/NoteList.tsx index af5d831c8..1c82abe90 100644 --- a/apps/client/src/widgets/collections/NoteList.tsx +++ b/apps/client/src/widgets/collections/NoteList.tsx @@ -9,6 +9,8 @@ import ViewModeStorage from "../view_widgets/view_mode_storage"; import CalendarView from "./calendar"; import TableView from "./table"; import BoardView from "./board"; +import { subscribeToMessages, unsubscribeToMessage as unsubscribeFromMessage } from "../../services/ws"; +import { WebSocketMessage } from "@triliumnext/commons"; interface NoteListProps { note?: FNote | null; @@ -137,6 +139,23 @@ function useNoteIds(note: FNote | null | undefined, viewType: ViewTypeOptions | } }) + // Refresh on import. + useEffect(() => { + function onImport(message: WebSocketMessage) { + if (!("taskType" in message) || message.taskType !== "importNotes" || message.type !== "taskSucceeded") return; + const { parentNoteId, importedNoteId } = message.result; + if (parentNoteId && importedNoteId && (parentNoteId === note?.noteId || noteIds.includes(parentNoteId))) { + setNoteIds([ + ...noteIds, + importedNoteId + ]) + } + } + + subscribeToMessages(onImport); + return () => unsubscribeFromMessage(onImport); + }, [ note, noteIds, setNoteIds ]) + return noteIds; }