Bläddra i källkod

:art: 为桌面端添加 `同步模式` 选择 https://github.com/siyuan-note/siyuan/issues/5089

Liang Ding 3 år sedan
förälder
incheckning
b108480450

+ 4 - 0
app/appearance/langs/zh_CN.json

@@ -173,6 +173,10 @@
   "setEmojiTip": "请在 [设置 - 外观] 中添加自定义表情",
   "openSyncTip1": "启用云端同步",
   "openSyncTip2": "从禁用改为启用时建议手动点击同步按钮触发一次同步",
+  "syncMode": "云端同步模式",
+  "syncModeTip": "启用云端同步后可进一步选择同步模式",
+  "syncMode1": "自动同步(数据不再变动后 30 秒进行一次同步)",
+  "syncMode2": "手动同步(仅启动和关闭软件时自动同步一次,其他时候需要手动触发同步)",
   "cloudSync": "云端同步",
   "cloudSyncDir": "云端同步目录",
   "emptyCloudSyncList": "云端同步列表为空",

+ 22 - 0
app/src/config/repos.ts

@@ -325,6 +325,17 @@ ${passwordHTML}
     <span class="fn__space"></span>
     <input type="checkbox" id="reposCloudSyncSwitch"${window.siyuan.config.sync.enabled ? " checked='checked'" : ""} class="b3-switch fn__flex-center">
 </label>
+<label class="fn__flex b3-label">
+    <div class="fn__flex-1">
+        ${window.siyuan.languages.syncMode}
+        <div class="b3-label__text">${window.siyuan.languages.syncModeTip}</div>
+    </div>
+    <span class="fn__space"></span>
+    <select id="syncMode" class="b3-select fn__flex-center fn__size200">
+        <option value="1" ${window.siyuan.config.sync.mode === 1 ? "selected" : ""}>${window.siyuan.languages.syncMode1}</option>
+        <option value="2" ${window.siyuan.config.sync.mode === 2 ? "selected" : ""}>${window.siyuan.languages.syncMode2}</option>
+    </select>
+</label>
 <div class="b3-label">
     <div class="fn__flex">
         <div class="fn__flex-center">${window.siyuan.languages.cloudSync}</div>
@@ -362,6 +373,17 @@ ${passwordHTML}
                 }
             });
         });
+        const syncModeElement = repos.element.querySelector("#syncMode") as HTMLSelectElement;
+        syncModeElement.addEventListener("change", () => {
+            fetchPost("/api/sync/setSyncMode", {mode: parseInt(syncModeElement.value, 10)}, (response) => {
+                if (response.code === 1) {
+                    showMessage(response.msg);
+                    syncModeElement.value = "1";
+                } else {
+                    window.siyuan.config.sync.mode = parseInt(syncModeElement.value, 10);
+                }
+            });
+        });
         const loadingElement = repos.element.querySelector("#reposLoading") as HTMLElement;
         loadingElement.style.width = repos.element.clientWidth + "px";
         loadingElement.style.height = repos.element.clientHeight + "px";

+ 1 - 0
app/src/types/index.d.ts

@@ -242,6 +242,7 @@ declare interface IConfig {
     e2eePasswdMode: number
     sync: {
         enabled: boolean
+        mode: number
         synced: number
         stat: string
         interval: number

+ 1 - 0
kernel/api/router.go

@@ -163,6 +163,7 @@ func ServeAPI(ginServer *gin.Engine) {
 	ginServer.Handle("POST", "/api/backup/removeCloudBackup", model.CheckAuth, model.CheckReadonly, removeCloudBackup)
 
 	ginServer.Handle("POST", "/api/sync/setSyncEnable", model.CheckAuth, setSyncEnable)
+	ginServer.Handle("POST", "/api/sync/setSyncMode", model.CheckAuth, setSyncMode)
 	ginServer.Handle("POST", "/api/sync/setCloudSyncDir", model.CheckAuth, setCloudSyncDir)
 	ginServer.Handle("POST", "/api/sync/createCloudSyncDir", model.CheckAuth, model.CheckReadonly, createCloudSyncDir)
 	ginServer.Handle("POST", "/api/sync/removeCloudSyncDir", model.CheckAuth, model.CheckReadonly, removeCloudSyncDir)

+ 19 - 0
kernel/api/sync.go

@@ -140,6 +140,25 @@ func setSyncEnable(c *gin.Context) {
 	}
 }
 
+func setSyncMode(c *gin.Context) {
+	ret := gulu.Ret.NewResult()
+	defer c.JSON(http.StatusOK, ret)
+
+	arg, ok := util.JsonArg(c, ret)
+	if !ok {
+		return
+	}
+
+	mode := int(arg["mode"].(float64))
+	err := model.SetSyncMode(mode)
+	if nil != err {
+		ret.Code = 1
+		ret.Msg = err.Error()
+		ret.Data = map[string]interface{}{"closeTimeout": 5000}
+		return
+	}
+}
+
 func setCloudSyncDir(c *gin.Context) {
 	ret := gulu.Ret.NewResult()
 	defer c.JSON(http.StatusOK, ret)

+ 2 - 0
kernel/conf/sync.go

@@ -25,6 +25,7 @@ import (
 type Sync struct {
 	CloudName  string `json:"cloudName"`  // 云端同步目录名称
 	Enabled    bool   `json:"enabled"`    // 是否开启同步
+	Mode       int    `json:"mode"`       // 同步模式,0:未设置(为兼容已有配置,initConf 函数中会转换为 1),1:自动,2:手动 https://github.com/siyuan-note/siyuan/issues/5089
 	Uploaded   int64  `json:"uploaded"`   // 最近上传时间
 	Downloaded int64  `json:"downloaded"` // 最近下载时间
 	Synced     int64  `json:"synced"`     // 最近同步时间
@@ -35,6 +36,7 @@ func NewSync() *Sync {
 	return &Sync{
 		CloudName: "main",
 		Enabled:   true,
+		Mode:      1,
 	}
 }
 

+ 3 - 0
kernel/model/conf.go

@@ -214,6 +214,9 @@ func InitConf() {
 			util.LogErrorf("create sync dir [%s] failed: %s", Conf.Sync.GetSaveDir(), err)
 		}
 	}
+	if 0 == Conf.Sync.Mode {
+		Conf.Sync.Mode = 1
+	}
 
 	if nil == Conf.Api {
 		Conf.Api = conf.NewAPI()

+ 9 - 0
kernel/model/sync.go

@@ -513,6 +513,15 @@ func SetSyncEnable(b bool) (err error) {
 	return
 }
 
+func SetSyncMode(mode int) (err error) {
+	syncLock.Lock()
+	defer syncLock.Unlock()
+
+	Conf.Sync.Mode = mode
+	Conf.Save()
+	return
+}
+
 var syncLock = sync.Mutex{}
 
 func syncDirUpsertWorkspaceData(downloadedFiles []string) (err error) {