-
+
-
+
@@ -141,7 +141,6 @@ export default {
keys: {
name: this.projectKeyValue
},
- hideload: true,
}).finally(_ => {
this.projectKeyLoading--;
});
diff --git a/resources/assets/js/pages/manage/messenger.vue b/resources/assets/js/pages/manage/messenger.vue
index 31617472b..061a315a4 100644
--- a/resources/assets/js/pages/manage/messenger.vue
+++ b/resources/assets/js/pages/manage/messenger.vue
@@ -9,11 +9,11 @@
v-if="tabActive==='dialog'"
v-model="dialogSearchKey"
ref="searchInput"
- :placeholder="$L(loadDialogs ? '更新中...' : '搜索消息')"
+ :placeholder="$L(loadDialogs > 0 ? '更新中...' : '搜索消息')"
@on-keydown="onKeydown"
clearable>
-
+
@@ -225,6 +225,7 @@ export default {
directives: {longpress},
data() {
return {
+ firstLoad: true,
activeNum: 0,
tabActive: 'dialog',
@@ -286,7 +287,9 @@ export default {
},
activated() {
- this.updateDialogs(1000);
+ this.updateDialogs(this.firstLoad ? 0 : 1000);
+ this.firstLoad = false;
+ //
this.$nextTick(_ => this.activeNum++)
//
if ($A.isEEUiApp) {
@@ -1039,7 +1042,7 @@ export default {
if (timeout > -1) {
this.__updateDialogs = setTimeout(_ => {
if (this.tabActive === 'dialog') {
- this.$store.dispatch("getDialogs", {hideload: true}).catch(() => {});
+ this.$store.dispatch("getDialogAuto").catch(() => {});
}
}, timeout)
}
diff --git a/resources/assets/js/store/actions.js b/resources/assets/js/store/actions.js
index a8cfa6c86..c083aa7d7 100644
--- a/resources/assets/js/store/actions.js
+++ b/resources/assets/js/store/actions.js
@@ -14,6 +14,20 @@ export default {
return new Promise(async resolve => {
let action = null
+ // 清理缓存
+ const clearCache = await $A.IDBString("clearCache")
+ if (clearCache) {
+ if (clearCache === "handle") {
+ action = "handleClearCache"
+ }
+ await $A.IDBRemove("clearCache")
+ await $A.IDBRemove("cacheVersion")
+ }
+ const cacheVersion = await $A.IDBString("cacheVersion")
+ if (cacheVersion !== state.cacheVersion) {
+ await dispatch("handleClearCache")
+ }
+
// 读取缓存
state.clientId = await $A.IDBString("clientId")
state.cacheServerUrl = await $A.IDBString("cacheServerUrl")
@@ -54,21 +68,6 @@ export default {
await $A.IDBSet("clientId", state.clientId)
}
- // 清理缓存
- const clearCache = await $A.IDBString("clearCache")
- if (clearCache) {
- if (clearCache === "handle") {
- action = "handleClearCache"
- }
- await $A.IDBRemove("clearCache")
- await $A.IDBRemove("cacheVersion")
- }
- const cacheVersion = await $A.IDBString("cacheVersion")
- if (cacheVersion !== "v2") {
- await dispatch("handleClearCache")
- await $A.IDBSet("cacheVersion", "v2")
- }
-
// 获取apiKey
dispatch("call", {
url: "users/key/client",
@@ -543,7 +542,7 @@ export default {
window.__getBasicDataKey = tmpKey
//
dispatch("getProjects").catch(() => {});
- dispatch("getDialogs").catch(() => {});
+ dispatch("getDialogAuto").catch(() => {});
dispatch("getDialogTodo", 0).catch(() => {});
dispatch("getReportUnread", 1000);
dispatch("getApproveUnread", 1000);
@@ -845,20 +844,12 @@ export default {
* 清除缓存
* @param state
* @param dispatch
- * @param userInfo
+ * @param userData
* @returns {Promise
}
*/
- handleClearCache({state, dispatch}, userInfo) {
+ handleClearCache({state, dispatch}, userData) {
return new Promise(async resolve => {
try {
- // state
- state.cacheUserBasic = [];
- state.cacheDialogs = [];
- state.cacheProjects = [];
- state.cacheColumns = [];
- state.cacheTasks = [];
- state.callAt = [];
-
// localStorage
const languageType = window.localStorage.getItem("__language:type__");
const keyboardData = window.localStorage.getItem("__keyboard:data__");
@@ -869,19 +860,26 @@ export default {
window.localStorage.setItem("__theme:mode__", themeMode)
// localForage
+ const clientId = await $A.IDBString("clientId")
+ const cacheServerUrl = await $A.IDBString("cacheServerUrl")
+ const cacheProjectParameter = await $A.IDBArray("cacheProjectParameter")
const cacheLoginEmail = await $A.IDBString("cacheLoginEmail");
const cacheFileSort = await $A.IDBJson("cacheFileSort");
+ const cacheTaskBrowse = await $A.IDBArray("cacheTaskBrowse")
+ const cacheEmojis = await $A.IDBArray("cacheEmojis")
+ const userInfo = await $A.IDBJson("userInfo")
await $A.IDBClear();
- await $A.IDBSet("clientId", state.clientId);
- await $A.IDBSet("cacheServerUrl", state.cacheServerUrl);
- await $A.IDBSet("cacheProjectParameter", state.cacheProjectParameter);
+ await $A.IDBSet("clientId", clientId);
+ await $A.IDBSet("cacheServerUrl", cacheServerUrl);
+ await $A.IDBSet("cacheProjectParameter", cacheProjectParameter);
await $A.IDBSet("cacheLoginEmail", cacheLoginEmail);
await $A.IDBSet("cacheFileSort", cacheFileSort);
- await $A.IDBSet("cacheTaskBrowse", state.cacheTaskBrowse);
- await $A.IDBSet("cacheEmojis", state.cacheEmojis);
+ await $A.IDBSet("cacheTaskBrowse", cacheTaskBrowse);
+ await $A.IDBSet("cacheEmojis", cacheEmojis);
+ await $A.IDBSet("cacheVersion", state.cacheVersion)
// userInfo
- dispatch("saveUserInfoBase", $A.isJson(userInfo) ? userInfo : state.userInfo).then(resolve);
+ dispatch("saveUserInfoBase", $A.isJson(userData) ? userData : userInfo).then(resolve);
} catch (e) {
resolve()
}
@@ -1111,7 +1109,9 @@ export default {
}
const callData = $callData('projects', requestData, state)
//
- callData.showLoad() && state.loadProjects++;
+ setTimeout(() => {
+ state.loadProjects++;
+ }, 2000)
dispatch("call", {
url: 'project/lists',
data: callData.get()
@@ -1125,7 +1125,7 @@ export default {
console.warn(e);
reject(e)
}).finally(_ => {
- callData.showLoad() && state.loadProjects--;
+ state.loadProjects--;
});
});
},
@@ -2382,6 +2382,34 @@ export default {
}
},
+ /**
+ * 获取会话列表(避免重复获取)
+ * @param state
+ * @param dispatch
+ * @returns {Promise}
+ */
+ getDialogAuto({state, dispatch}) {
+ return new Promise(function (resolve, reject) {
+ if (state.loadDialogAuto) {
+ reject({msg: 'Loading'});
+ return
+ }
+ setTimeout(_ => {
+ state.loadDialogs++;
+ }, 2000)
+ state.loadDialogAuto = true
+ dispatch("getDialogs")
+ .then(resolve)
+ .catch(reject)
+ .finally(_ => {
+ state.loadDialogs--;
+ state.loadDialogAuto = false
+ })
+ //
+ dispatch("getDialogLatestMsgs").catch(() => {})
+ })
+ },
+
/**
* 获取会话列表
* @param state
@@ -2408,7 +2436,6 @@ export default {
}
const callData = $callData('dialogs', requestData, state)
//
- callData.showLoad() && state.loadDialogs++;
dispatch("call", {
url: 'dialog/lists',
data: callData.get()
@@ -2426,8 +2453,6 @@ export default {
}).catch(e => {
console.warn(e);
reject(e)
- }).finally(_ => {
- callData.showLoad() && state.loadDialogs--;
});
});
},
@@ -2901,6 +2926,61 @@ export default {
});
},
+ /**
+ * 获取最新消息
+ * @param state
+ * @param dispatch
+ * @param requestData
+ * @returns {Promise}
+ */
+ getDialogLatestMsgs({state, dispatch}, requestData = {}) {
+ return new Promise(function (resolve, reject) {
+ if (state.userId === 0) {
+ reject({msg: 'Parameter error'});
+ return;
+ }
+ if (!$A.isJson(requestData)) {
+ requestData = {}
+ }
+ if (typeof requestData.page === "undefined") {
+ requestData.page = 1
+ }
+ if (typeof requestData.pagesize === "undefined") {
+ requestData.pagesize = 20
+ }
+ if (typeof requestData.latest_id === "undefined") {
+ requestData.latest_id = state.loadDialogLatestId
+ }
+ //
+ dispatch("call", {
+ url: 'dialog/msg/latest',
+ data: requestData,
+ }).then(({data}) => {
+ const list = data.data
+ if (list.length === 0) {
+ resolve()
+ return
+ }
+ //
+ const lastId = list[list.length - 1].id;
+ const lastNotExist = state.dialogMsgs.findIndex(({id}) => id == lastId) === -1
+ if (requestData.page === 1) {
+ state.loadDialogLatestId = list[0].id
+ }
+ dispatch("saveDialogMsg", list);
+ //
+ if (data.next_page_url && data.current_page < 5 && lastNotExist) {
+ requestData.page++
+ dispatch("getDialogLatestMsgs", requestData).then(resolve).catch(reject)
+ } else {
+ resolve()
+ }
+ }).catch(e => {
+ reject(e)
+ });
+ })
+ },
+
/**
* 发送已阅消息
* @param state
diff --git a/resources/assets/js/store/state.js b/resources/assets/js/store/state.js
index 123c40e18..278ec85e9 100644
--- a/resources/assets/js/store/state.js
+++ b/resources/assets/js/store/state.js
@@ -6,6 +6,9 @@ export default {
// 客户端ID(希望不变的,除非清除浏览器缓存或者卸载应用)
clientId: "",
+ // 缓存版本号(如果想升级后清除客户端缓存则修改此参数值)
+ cacheVersion: "v3",
+
// 窗口是否激活
windowActive: true,
@@ -52,6 +55,8 @@ export default {
loadUserBasic: false,
loadProjects: 0,
loadDialogs: 0,
+ loadDialogAuto: false,
+ loadDialogLatestId: 0,
floatSpinnerTimer: [],
floatSpinnerLoad: 0,
touchBackInProgress: false,
diff --git a/resources/assets/js/store/utils.js b/resources/assets/js/store/utils.js
index da6167ade..b67cd490d 100644
--- a/resources/assets/js/store/utils.js
+++ b/resources/assets/js/store/utils.js
@@ -11,7 +11,6 @@ function __callData(key, requestData, state) {
const callKey = key + "::" + encodeURIComponent(new URLSearchParams($.sortObject(requestData, [
'page',
'pagesize',
- 'hideload',
'timerange',
])).toString())
const callData = state.callAt.find(item => item.key === callKey) || {}
@@ -61,13 +60,6 @@ function __callData(key, requestData, state) {
})
}
- /**
- * @returns {boolean}
- */
- this.showLoad = () => {
- return !requestData.hideload
- }
-
return this
}