需要启用同步并且同步模式为完全手动同步。功能是点击同步按钮之后临时切换为自动同步,同步完成之后再切换回完全手动同步。
效果是能够在启动或关闭思源时不进行同步,手动同步但不需要选择同步方向。
用来实现这个回帖里的需求: 关于同步机制的一点问题和建议 - fwonce 的回帖
/**
* 完全手动的自动同步
* 需要启用同步并且同步模式为完全手动同步。功能是点击同步按钮之后临时切换为自动同步,同步完成之后再切换回完全手动同步。
* 效果是能够在启动或关闭思源时不进行同步,手动同步但不需要选择同步方向。
* author: Jeffery Chen https://ld246.com/article/1760162950672
*/
(function() {
const maxAttempts = 50;
const interval = 200;
let attempts = 0;
let isProcessing = false;
const fetchPost = async (url, data) => {return await fetch(url, {method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(data)});}
const handleClick = async (event) => {
if (isProcessing) {
// 避免重复处理
event.stopImmediatePropagation();
event.stopPropagation();
return;
}
// 需要启用同步并且同步模式为完全手动同步才继续执行
if (!window.siyuan?.config?.sync?.enabled || window.siyuan?.config?.sync.mode !== 3) return;
// 阻止事件被其他事件处理、阻止事件冒泡
event.stopImmediatePropagation();
event.stopPropagation();
isProcessing = true;
try {
// 切换为自动同步模式
const setMode1 = await fetchPost('/api/sync/setSyncMode', { mode: 1 });
// 如果请求失败,则不继续执行
if (!setMode1.ok) return;
if (window.siyuan?.config?.sync) window.siyuan.config.sync.mode = 1;
// 执行同步
await fetchPost('/api/sync/performSync', {});
// 切换回完全手动同步模式
const setMode3 = await fetchPost('/api/sync/setSyncMode', { mode: 3 });
if (setMode3.ok && window.siyuan?.config?.sync) window.siyuan.config.sync.mode = 3;
} catch (error) {
console.error('Sync error:', error);
} finally {
isProcessing = false;
}
};
// 查询同步按钮并绑定点击事件
const findButtons = () => {
const barSync = document.querySelector('#barSync');
// 找到桌面端的同步按钮 barSync
if (barSync) {
barSync.addEventListener('click', handleClick, {capture: true, passive: false});
// 如果找到 barSync,就不需要继续查找 toolbarSync 和 menuSyncNow
return true;
}
const toolbarSync = document.querySelector('#toolbarSync');
const menuSyncNow = document.querySelector('#menuSyncNow');
// 找到移动端的同步按钮 toolbarSync
toolbarSync?.addEventListener('click', handleClick, {capture: true, passive: false});
// 找到移动端的同步按钮 menuSyncNow
menuSyncNow?.addEventListener('click', handleClick, {capture: true, passive: false});
// 如果同时找到 toolbarSync 和 menuSyncNow,就不需要继续查找 barSync
if (toolbarSync && menuSyncNow) return true;
// 继续尝试
if (++attempts < maxAttempts) setTimeout(findButtons, interval);
return false;
};
findButtons();
})();
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于