1.0 mvp
This commit is contained in:
@@ -1607,12 +1607,15 @@ pub(crate) fn render_editor_island_adapter_script() -> &'static str {
|
||||
const nextBody = nextAggregate?.body || {};
|
||||
const nextPermissions = nextAggregate?.head?.permissions || {};
|
||||
const nextConflictKey = conflictDetectionKeyFromBody(nextBody);
|
||||
const nextTiptapDocument = toTiptapDocument(nextBody.content);
|
||||
const nextSerialized = JSON.stringify(nextTiptapDocument);
|
||||
const contentChanged = nextSerialized !== session.currentSerialized;
|
||||
session.externalChangePending = false;
|
||||
if (!nextConflictKey || !session.lastExternalConflictDetectionKey) {
|
||||
session.lastExternalConflictDetectionKey = nextConflictKey || session.lastExternalConflictDetectionKey;
|
||||
return;
|
||||
if (!contentChanged) return;
|
||||
}
|
||||
if (nextConflictKey === session.lastExternalConflictDetectionKey) return;
|
||||
if (nextConflictKey === session.lastExternalConflictDetectionKey && !contentChanged) return;
|
||||
if (session.hasExternalConflict || sessionHasRecentLocalInput(session) || session.dirty || session.saveTimer || session.saving) {
|
||||
markSessionExternalConflict(session, externalConflictMessage);
|
||||
return;
|
||||
@@ -1620,8 +1623,8 @@ pub(crate) fn render_editor_island_adapter_script() -> &'static str {
|
||||
const nextRevision = Number.isInteger(nextBody.revision) ? nextBody.revision : revisionFromConflictKey(nextConflictKey);
|
||||
session.latestAggregate = nextAggregate;
|
||||
session.title = nextAggregate?.head?.title || session.title;
|
||||
session.currentTiptapDocument = toTiptapDocument(nextBody.content);
|
||||
session.currentSerialized = JSON.stringify(session.currentTiptapDocument);
|
||||
session.currentTiptapDocument = nextTiptapDocument;
|
||||
session.currentSerialized = nextSerialized;
|
||||
session.lastPersistedSerialized = session.currentSerialized;
|
||||
session.revision = nextRevision;
|
||||
session.conflictDetectionKey = nextConflictKey;
|
||||
@@ -1840,8 +1843,38 @@ pub(crate) fn render_editor_island_adapter_script() -> &'static str {
|
||||
});
|
||||
};
|
||||
|
||||
const sessionMatchesDocumentWorkspace = (session, documentId, workspaceId) => {
|
||||
if (!session) return false;
|
||||
const doc = String(documentId || '').trim();
|
||||
const workspace = String(workspaceId || '').trim();
|
||||
if (doc && session.documentId !== doc) return false;
|
||||
if (workspace && session.workspaceId && session.workspaceId !== workspace) return false;
|
||||
return true;
|
||||
};
|
||||
|
||||
const refreshDocumentSessionsFromExternalWrite = (detail, source) => {
|
||||
const documentId = String(detail?.documentId || '').trim();
|
||||
const workspaceId = String(detail?.workspaceId || '').trim();
|
||||
let scheduled = 0;
|
||||
Array.from(documentSessionRegistry.values()).forEach((session) => {
|
||||
if (!sessionMatchesDocumentWorkspace(session, documentId, workspaceId)) return;
|
||||
session.lastExternalChangeSignalAt = Date.now();
|
||||
session.externalChangePending = true;
|
||||
if (session.hasExternalConflict || sessionHasRecentLocalInput(session) || session.dirty || session.saveTimer || session.saving) {
|
||||
markSessionExternalConflict(session, treeExternalConflictMessage);
|
||||
return;
|
||||
}
|
||||
scheduled += 1;
|
||||
scheduleSessionExternalRefresh(session, source || 'mnote-web-external-write');
|
||||
});
|
||||
return scheduled;
|
||||
};
|
||||
|
||||
window.addEventListener('tree:delta', handleTreeExternalChange);
|
||||
window.addEventListener('tree:resync', handleTreeExternalChange);
|
||||
window.addEventListener('mnote:page-ai-tool-write-completed', (event) => {
|
||||
refreshDocumentSessionsFromExternalWrite(event?.detail || {}, 'mnote-hermes-tool');
|
||||
});
|
||||
|
||||
const createDocumentSession = (runtimeDescriptor) => {
|
||||
const pageBody = runtimeDescriptor.aggregate.body || {};
|
||||
@@ -2407,6 +2440,23 @@ pub(crate) fn render_editor_island_adapter_script() -> &'static str {
|
||||
closeSecondaryPane(url instanceof URL ? url : currentUrl());
|
||||
return true;
|
||||
},
|
||||
refreshDocument: async ({ documentId, workspaceId, source } = {}) => {
|
||||
const targets = Array.from(documentSessionRegistry.values()).filter((session) => (
|
||||
sessionMatchesDocumentWorkspace(session, documentId, workspaceId)
|
||||
));
|
||||
await Promise.all(targets.map((session) => refreshSessionFromExternalChange(
|
||||
session,
|
||||
source || 'mnote-web-programmatic-refresh',
|
||||
)));
|
||||
return targets.length;
|
||||
},
|
||||
refreshPrimaryDocument: async ({ documentId, workspaceId, source } = {}) => {
|
||||
const primary = paneViewRegistry.get('primary');
|
||||
if (!primary?.session) return 0;
|
||||
if (!sessionMatchesDocumentWorkspace(primary.session, documentId, workspaceId)) return 0;
|
||||
await refreshSessionFromExternalChange(primary.session, source || 'mnote-web-programmatic-refresh');
|
||||
return 1;
|
||||
},
|
||||
};
|
||||
|
||||
window.addEventListener('pagehide', () => {
|
||||
|
||||
Reference in New Issue
Block a user