From bd2e2c78bce87423e1c8f14c03e87f4171cacf3e Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Tue, 25 Apr 2023 15:34:46 +0800 Subject: [PATCH 1/4] :art: Partially refresh the interface after data synchronization https://github.com/siyuan-note/siyuan/issues/8098 --- kernel/api/system.go | 19 +++++++++---------- kernel/model/repository.go | 3 ++- kernel/server/serve.go | 2 ++ kernel/util/runtime.go | 20 ++++++++++++++++++++ 4 files changed, 33 insertions(+), 11 deletions(-) diff --git a/kernel/api/system.go b/kernel/api/system.go index 67a8a6691..03adb8363 100644 --- a/kernel/api/system.go +++ b/kernel/api/system.go @@ -182,7 +182,6 @@ func exportLog(c *gin.Context) { } } -var start = true // 是否是启动 func getConf(c *gin.Context) { ret := gulu.Ret.NewResult() defer c.JSON(http.StatusOK, ret) @@ -200,21 +199,21 @@ func getConf(c *gin.Context) { ret.Data = map[string]interface{}{ "conf": maskedConf, - "start": start, + "start": !util.IsUILoaded, } - if start { - start = false + if !util.IsUILoaded { + go func() { + util.WaitForUILoaded() - if model.Conf.Editor.ReadOnly { - // 编辑器启用只读模式时启动后提示用户 https://github.com/siyuan-note/siyuan/issues/7700 - go func() { - time.Sleep(time.Second * 7) + if model.Conf.Editor.ReadOnly { + // 编辑器启用只读模式时启动后提示用户 https://github.com/siyuan-note/siyuan/issues/7700 + time.Sleep(time.Second * 3) if model.Conf.Editor.ReadOnly { util.PushMsg(model.Conf.Language(197), 7000) } - }() - } + } + }() } } diff --git a/kernel/model/repository.go b/kernel/model/repository.go index 59db74a26..552bc6d57 100644 --- a/kernel/model/repository.go +++ b/kernel/model/repository.go @@ -1053,7 +1053,8 @@ func bootSyncRepo() (err error) { if 0 < len(fetchedFiles) { go func() { - time.Sleep(7 * time.Second) // 等待一段时间后前端完成界面初始化后再同步 + util.WaitForUILoaded() // 等待一段时间后前端完成界面初始化后再同步,因为需要推送消息 + syncErr := syncRepo(false, false) if nil != err { logging.LogErrorf("boot background sync repo failed: %s", syncErr) diff --git a/kernel/server/serve.go b/kernel/server/serve.go index d27b596e6..69ce7833a 100644 --- a/kernel/server/serve.go +++ b/kernel/server/serve.go @@ -129,6 +129,8 @@ func Serve(fastMode bool) { } }() + go util.HookUILoaded() + if err = http.Serve(ln, ginServer); nil != err { if !fastMode { logging.LogErrorf("boot kernel failed: %s", err) diff --git a/kernel/util/runtime.go b/kernel/util/runtime.go index d6272adfd..ceea0cbd0 100644 --- a/kernel/util/runtime.go +++ b/kernel/util/runtime.go @@ -40,6 +40,26 @@ import ( const DatabaseVer = "20220501" // 修改表结构的话需要修改这里 +// IsUILoaded 是否已经加载了 UI。 +var IsUILoaded = false + +func WaitForUILoaded() { + for !IsUILoaded { + logging.LogInfof("waiting for UI loading...") + time.Sleep(time.Second) + } +} + +func HookUILoaded() { + for !IsUILoaded { + if 0 < len(SessionsByType("main")) { + IsUILoaded = true + return + } + time.Sleep(time.Second) + } +} + // IsExiting 是否正在退出程序。 var IsExiting = false From 9bfc7846cdf86ef90bea9dc9eefed86931bac8a5 Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Tue, 25 Apr 2023 15:39:57 +0800 Subject: [PATCH 2/4] :art: Partially refresh the interface after data synchronization https://github.com/siyuan-note/siyuan/issues/8098 --- kernel/util/runtime.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kernel/util/runtime.go b/kernel/util/runtime.go index ceea0cbd0..6eac80062 100644 --- a/kernel/util/runtime.go +++ b/kernel/util/runtime.go @@ -46,7 +46,7 @@ var IsUILoaded = false func WaitForUILoaded() { for !IsUILoaded { logging.LogInfof("waiting for UI loading...") - time.Sleep(time.Second) + time.Sleep(200 * time.Millisecond) } } @@ -56,7 +56,7 @@ func HookUILoaded() { IsUILoaded = true return } - time.Sleep(time.Second) + time.Sleep(200 * time.Millisecond) } } From 125700d07511a867f383c166169e33b707a7a2e7 Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Tue, 25 Apr 2023 18:31:22 +0800 Subject: [PATCH 3/4] :art: Partially refresh the interface after data synchronization https://github.com/siyuan-note/siyuan/issues/8098 --- kernel/model/box.go | 4 ---- kernel/model/repository.go | 44 +++++++++++++++++++------------------- kernel/model/sync.go | 5 ++++- 3 files changed, 26 insertions(+), 27 deletions(-) diff --git a/kernel/model/box.go b/kernel/model/box.go index f8c3b0923..e2f79e131 100644 --- a/kernel/model/box.go +++ b/kernel/model/box.go @@ -478,10 +478,6 @@ func genTreeID(tree *parse.Tree) { return } -func ReloadUI() { - task.AppendTask(task.ReloadUI, util.ReloadUI) -} - func FullReindex() { task.AppendTask(task.DatabaseIndexFull, fullReindex) task.AppendTask(task.DatabaseIndexRef, IndexRefs) diff --git a/kernel/model/repository.go b/kernel/model/repository.go index 552bc6d57..b5513013b 100644 --- a/kernel/model/repository.go +++ b/kernel/model/repository.go @@ -1053,8 +1053,6 @@ func bootSyncRepo() (err error) { if 0 < len(fetchedFiles) { go func() { - util.WaitForUILoaded() // 等待一段时间后前端完成界面初始化后再同步,因为需要推送消息 - syncErr := syncRepo(false, false) if nil != err { logging.LogErrorf("boot background sync repo failed: %s", syncErr) @@ -1239,33 +1237,35 @@ func processSyncMergeResult(exit, byHand bool, start time.Time, mergeResult *dej return } - incReindex(upserts, removes) - if !exit { - ReloadUI() + if exit { // 退出时同步不用推送事件 + return } + upsertRootIDs, removeRootIDs := incReindex(upserts, removes) elapsed := time.Since(start) - if !exit { - go func() { - time.Sleep(2 * time.Second) - util.PushStatusBar(fmt.Sprintf(Conf.Language(149), elapsed.Seconds())) + go func() { + util.WaitForUILoaded() + util.BroadcastByType("main", "syncMergeResult", 0, "", + map[string]interface{}{"upsertRootIDs": upsertRootIDs, "removeRootIDs": removeRootIDs}) - if 0 < len(mergeResult.Conflicts) { - syConflict := false - for _, file := range mergeResult.Conflicts { - if strings.HasSuffix(file.Path, ".sy") { - syConflict = true - break - } - } + time.Sleep(2 * time.Second) + util.PushStatusBar(fmt.Sprintf(Conf.Language(149), elapsed.Seconds())) - if syConflict { - // 数据同步发生冲突时在界面上进行提醒 https://github.com/siyuan-note/siyuan/issues/7332 - util.PushMsg(Conf.Language(108), 7000) + if 0 < len(mergeResult.Conflicts) { + syConflict := false + for _, file := range mergeResult.Conflicts { + if strings.HasSuffix(file.Path, ".sy") { + syConflict = true + break } } - }() - } + + if syConflict { + // 数据同步发生冲突时在界面上进行提醒 https://github.com/siyuan-note/siyuan/issues/7332 + util.PushMsg(Conf.Language(108), 7000) + } + } + }() } func logSyncMergeResult(mergeResult *dejavu.MergeResult) { diff --git a/kernel/model/sync.go b/kernel/model/sync.go index 97cb315cf..3719c372a 100644 --- a/kernel/model/sync.go +++ b/kernel/model/sync.go @@ -260,7 +260,7 @@ func checkSync(boot, exit, byHand bool) bool { } // incReindex 增量重建索引。 -func incReindex(upserts, removes []string) { +func incReindex(upserts, removes []string) (upsertRootIDs, removeRootIDs []string) { util.IncBootProgress(3, "Sync reindexing...") msg := fmt.Sprintf(Conf.Language(35)) util.PushStatusBar(msg) @@ -274,6 +274,7 @@ func incReindex(upserts, removes []string) { } id := strings.TrimSuffix(filepath.Base(removeFile), ".sy") + removeRootIDs = append(removeRootIDs, id) block := treenode.GetBlockTree(id) if nil != block { msg = fmt.Sprintf(Conf.Language(39), block.RootID) @@ -316,7 +317,9 @@ func incReindex(upserts, removes []string) { } treenode.IndexBlockTree(tree) sql.UpsertTreeQueue(tree) + upsertRootIDs = append(upsertRootIDs, tree.Root.ID) } + return } func SetCloudSyncDir(name string) { From 40d952e12da306049cb98c0de51ae53e87f7d1ea Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Tue, 25 Apr 2023 18:34:38 +0800 Subject: [PATCH 4/4] :art: Partially refresh the interface after data synchronization https://github.com/siyuan-note/siyuan/issues/8098 --- kernel/model/repository.go | 7 +++++++ kernel/util/runtime.go | 1 - 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/kernel/model/repository.go b/kernel/model/repository.go index b5513013b..e169976db 100644 --- a/kernel/model/repository.go +++ b/kernel/model/repository.go @@ -1245,6 +1245,13 @@ func processSyncMergeResult(exit, byHand bool, start time.Time, mergeResult *dej elapsed := time.Since(start) go func() { util.WaitForUILoaded() + + if util.ContainerAndroid == util.Container || util.ContainerIOS == util.Container { + // 移动端不推送差异详情 + upsertRootIDs = []string{} + removeRootIDs = []string{} + } + util.BroadcastByType("main", "syncMergeResult", 0, "", map[string]interface{}{"upsertRootIDs": upsertRootIDs, "removeRootIDs": removeRootIDs}) diff --git a/kernel/util/runtime.go b/kernel/util/runtime.go index 6eac80062..a4c393b27 100644 --- a/kernel/util/runtime.go +++ b/kernel/util/runtime.go @@ -45,7 +45,6 @@ var IsUILoaded = false func WaitForUILoaded() { for !IsUILoaded { - logging.LogInfof("waiting for UI loading...") time.Sleep(200 * time.Millisecond) } }