refactor: extract editor dnd helpers

This commit is contained in:
lix-2026
2026-05-25 03:05:57 +08:00
parent fa3dc76d53
commit 3361a5e1b1
8 changed files with 173 additions and 38 deletions
@@ -167,8 +167,24 @@ function populateSessionConflictDiffPanel(panel, context, deps) {
});
}
function runSessionConflictAction(action, deps) {
deps = deps || {};
if (typeof action !== 'function') return;
try {
var result = action();
if (result && typeof result.then === 'function') {
result.catch(function(error) {
if (typeof deps.onError === 'function') deps.onError(error);
});
}
} catch (error) {
if (typeof deps.onError === 'function') deps.onError(error);
}
}
window.__mnoteDocumentConflictPanelRuntime = {
clearSessionConflictSurface: clearSessionConflictSurface,
createSessionConflictPanel: createSessionConflictPanel,
populateSessionConflictDiffPanel: populateSessionConflictDiffPanel
populateSessionConflictDiffPanel: populateSessionConflictDiffPanel,
runSessionConflictAction: runSessionConflictAction
};
+25 -16
View File
@@ -2122,28 +2122,40 @@ pub(crate) fn render_editor_island_adapter_script() -> &'static str {
await persistSession(session);
};
const runSessionConflictAction = (action, onError) => {
const runtime = window.__mnoteDocumentConflictPanelRuntime;
if (runtime && typeof runtime.runSessionConflictAction === 'function') {
runtime.runSessionConflictAction(action, { onError });
return;
}
try {
const result = action();
if (result && typeof result.then === 'function') result.catch(onError);
} catch (error) {
onError(error);
}
};
const renderSessionConflictSurface = (session, message) => {
clearSessionConflictSurface(session);
sessionViews(session).forEach((view) => {
const host = view.runtimeDescriptor.root.closest('.document-pane') || view.runtimeDescriptor.root;
if (!(host instanceof HTMLElement)) return;
const runtime = window.__mnoteDocumentConflictPanelRuntime;
const handleConflictActionError = (error) => {
setSessionStatus(session, 'external-change-conflict', error instanceof Error ? error.message : String(error));
renderSessionConflictSurface(session, error instanceof Error ? error.message : String(error));
};
let panel = null;
if (runtime && typeof runtime.createSessionConflictPanel === 'function') {
panel = runtime.createSessionConflictPanel(session, message, {
externalConflictMessage,
conflictSourceLabel,
onAcceptDisk: () => {
acceptDiskVersion(session).catch((error) => {
setSessionStatus(session, 'external-change-conflict', error instanceof Error ? error.message : String(error));
renderSessionConflictSurface(session, error instanceof Error ? error.message : String(error));
});
runSessionConflictAction(() => acceptDiskVersion(session), handleConflictActionError);
},
onKeepCurrent: () => {
keepCurrentEditorVersion(session).catch((error) => {
setSessionStatus(session, 'external-change-conflict', error instanceof Error ? error.message : String(error));
renderSessionConflictSurface(session, error instanceof Error ? error.message : String(error));
});
runSessionConflictAction(() => keepCurrentEditorVersion(session), handleConflictActionError);
},
onOpenDiff: (_session, createdPanel) => {
openConflictDiffPanel(session, createdPanel);
@@ -2189,16 +2201,10 @@ pub(crate) fn render_editor_island_adapter_script() -> &'static str {
panel.append(heading, text, meta, actions, diffPanel);
acceptDisk.addEventListener('click', () => {
acceptDiskVersion(session).catch((error) => {
setSessionStatus(session, 'external-change-conflict', error instanceof Error ? error.message : String(error));
renderSessionConflictSurface(session, error instanceof Error ? error.message : String(error));
});
runSessionConflictAction(() => acceptDiskVersion(session), handleConflictActionError);
});
keepCurrent.addEventListener('click', () => {
keepCurrentEditorVersion(session).catch((error) => {
setSessionStatus(session, 'external-change-conflict', error instanceof Error ? error.message : String(error));
renderSessionConflictSurface(session, error instanceof Error ? error.message : String(error));
});
runSessionConflictAction(() => keepCurrentEditorVersion(session), handleConflictActionError);
});
openDiff.addEventListener('click', () => {
openConflictDiffPanel(session, panel);
@@ -5659,6 +5665,9 @@ mod tests {
assert!(DOCUMENT_CONFLICT_PANEL_RUNTIME_JS.contains("onUseCurrent"));
assert!(DOCUMENT_CONFLICT_PANEL_RUNTIME_JS.contains("onUseDisk"));
assert!(DOCUMENT_CONFLICT_PANEL_RUNTIME_JS.contains("onSaveMerge"));
assert!(DOCUMENT_CONFLICT_PANEL_RUNTIME_JS.contains("function runSessionConflictAction"));
assert!(DOCUMENT_CONFLICT_PANEL_RUNTIME_JS
.contains("runSessionConflictAction: runSessionConflictAction"));
}
#[tokio::test]