Merge remote-tracking branch 'origin/master' into addressbook

This commit is contained in:
the-djmaze 2022-08-03 00:51:58 +02:00
commit 983bfbaa1b
85 changed files with 1496 additions and 313 deletions

View file

@ -42,6 +42,7 @@ SaveSettingsStep = {
Notification = {
RequestError: 1,
RequestAborted: 2,
RequestTimeout: 3,
// Global
InvalidToken: 101,

View file

@ -30,11 +30,11 @@ checkResponseError = data => {
oRequests = {},
abort = (sAction, bClearOnly) => {
abort = (sAction, sReason, bClearOnly) => {
if (oRequests[sAction]) {
if (!bClearOnly && oRequests[sAction].abort) {
// oRequests[sAction].__aborted = true;
oRequests[sAction].abort();
oRequests[sAction].abort(sReason || 'AbortError');
}
oRequests[sAction] = null;
@ -43,22 +43,23 @@ abort = (sAction, bClearOnly) => {
},
fetchJSON = (action, sGetAdd, params, timeout, jsonCallback) => {
sGetAdd = pString(sGetAdd);
params = params || {};
if (params instanceof FormData) {
params.set('Action', action);
} else {
params.Action = action;
}
let init = {};
if (window.AbortController) {
abort(action);
const controller = new AbortController();
timeout && setTimeout(() => controller.abort(), timeout);
oRequests[action] = controller;
init.signal = controller.signal;
}
return rl.fetchJSON(getURL(sGetAdd), init, sGetAdd ? null : params).then(jsonCallback);
abort(action);
const controller = new AbortController(),
signal = controller.signal;
oRequests[action] = controller;
// Currently there is no way to combine multiple signals, so AbortSignal.timeout() not possible
timeout && setTimeout(() => abort(action, 'TimeoutError'), timeout);
return rl.fetchJSON(getURL(sGetAdd), {signal: signal}, sGetAdd ? null : params).then(jsonCallback).catch(err => {
err.aborted = signal.aborted;
err.reason = signal.reason;
return Promise.reject(err);
});
};
class FetchError extends Error
@ -71,8 +72,8 @@ class FetchError extends Error
export class AbstractFetchRemote
{
abort(sAction, bClearOnly) {
abort(sAction, bClearOnly);
abort(sAction) {
abort(sAction);
return this;
}
@ -133,7 +134,7 @@ export class AbstractFetchRemote
abortActions.forEach(actionToAbort => abort(actionToAbort));
}
fetchJSON(sAction, sGetAdd,
fetchJSON(sAction, pString(sGetAdd),
params,
undefined === iTimeout ? 30000 : pInt(iTimeout),
data => {
@ -147,7 +148,7 @@ export class AbstractFetchRemote
if (oRequests[sAction].__aborted) {
iError = 2;
}
abort(sAction, true);
abort(sAction, 0, 1);
}
if (!iError && data) {
@ -174,8 +175,11 @@ export class AbstractFetchRemote
}
)
.catch(err => {
console.error(err);
fCallback && fCallback(err.name == 'AbortError' ? 2 : 1);
console.error({fetchError:err});
fCallback && fCallback(
'TimeoutError' == err.reason ? 3 : (err.name == 'AbortError' ? 2 : 1),
err
);
});
}
@ -199,7 +203,7 @@ export class AbstractFetchRemote
this.setTrigger(fTrigger, true);
return fetchJSON(action, '', params, pInt(timeOut, 30000),
data => {
abort(action, true);
abort(action, 0, 1);
if (!data) {
return Promise.reject(new FetchError(Notification.JsonParse));

View file

@ -54,7 +54,7 @@ class RemoteUserFetch extends AbstractFetchRemote {
this.request('MessageList',
fCallback,
params,
30000,
60000, // 60 seconds before aborting
sGetAdd,
bSilent ? [] : ['MessageList']
);

View file

@ -46,6 +46,7 @@ export class UserSettingsGeneral extends AbstractViewSettings {
this.viewHTML = SettingsUserStore.viewHTML;
this.showImages = SettingsUserStore.showImages;
this.removeColors = SettingsUserStore.removeColors;
this.hideDeleted = SettingsUserStore.hideDeleted;
this.useCheckboxesInList = SettingsUserStore.useCheckboxesInList;
this.threadsAllowed = AppUserStore.threadsAllowed;
this.useThreads = SettingsUserStore.useThreads;
@ -92,7 +93,7 @@ export class UserSettingsGeneral extends AbstractViewSettings {
this.addSetting('MessagesPerPage');
this.addSetting('Layout', () => MessagelistUserStore([]));
this.addSettings(['ViewHTML', 'ShowImages', 'UseCheckboxesInList', 'ReplySameFolder',
this.addSettings(['ViewHTML', 'ShowImages', 'HideDeleted', 'UseCheckboxesInList', 'ReplySameFolder',
'DesktopNotifications', 'SoundNotification']);
const fReloadLanguageHelper = (saveSettingsStep) => () => {

View file

@ -171,8 +171,8 @@ MessagelistUserStore.reload = (bDropPagePosition = false, bDropCurrentFolderCach
if (iError) {
if (Notification.RequestAborted !== iError) {
MessagelistUserStore([]);
MessagelistUserStore.error(getNotification(iError));
}
MessagelistUserStore.error(getNotification(iError));
} else {
const collection = MessageCollectionModel.reviveFromJson(oData.Result, bCached);
if (collection) {
@ -387,7 +387,7 @@ MessagelistUserStore.removeMessagesFromList = (
if (MessagelistUserStore.threadUid()) {
if (
messageList.length &&
!!messageList.find(item => !!(item && item.deleted() && item.uid == MessagelistUserStore.threadUid()))
messageList.find(item => item && item.deleted() && item.uid == MessagelistUserStore.threadUid())
) {
const message = messageList.find(item => item && !item.deleted());
let setHash;

View file

@ -35,6 +35,7 @@ export const SettingsUserStore = new class {
useThreads: 0,
replySameFolder: 0,
hideUnsubscribed: 0,
hideDeleted: 1,
autoLogout: 0
});
@ -83,5 +84,6 @@ export const SettingsUserStore = new class {
self.replySameFolder(SettingsGet('ReplySameFolder'));
self.hideUnsubscribed(SettingsGet('HideUnsubscribed'));
self.hideDeleted(SettingsGet('HideDeleted'));
}
};