fix: show syncing message consistently

This commit is contained in:
Baptiste Grob
2020-11-23 17:06:23 +01:00
parent b0ccecbd96
commit 8434f598ca
4 changed files with 78 additions and 22 deletions

View File

@@ -22,7 +22,6 @@ import {
STRING_CONFIRM_APP_QUIT_DURING_PASSCODE_REMOVAL, STRING_CONFIRM_APP_QUIT_DURING_PASSCODE_REMOVAL,
STRING_UNSUPPORTED_BACKUP_FILE_VERSION STRING_UNSUPPORTED_BACKUP_FILE_VERSION
} from '@/strings'; } from '@/strings';
import { SyncOpStatus } from '@standardnotes/snjs';
import { PasswordWizardType } from '@/types'; import { PasswordWizardType } from '@/types';
import { BackupFile } from '@standardnotes/snjs'; import { BackupFile } from '@standardnotes/snjs';
import { confirmDialog, alertDialog } from '@/services/alertService'; import { confirmDialog, alertDialog } from '@/services/alertService';
@@ -67,15 +66,18 @@ type AccountMenuState = {
selectedAutoLockInterval: any; selectedAutoLockInterval: any;
showBetaWarning: boolean; showBetaWarning: boolean;
errorReportingEnabled: boolean; errorReportingEnabled: boolean;
syncInProgress: boolean;
syncError: string;
syncPercentage: string;
} }
class AccountMenuCtrl extends PureViewCtrl<{}, AccountMenuState> { class AccountMenuCtrl extends PureViewCtrl<{}, AccountMenuState> {
public appVersion: string public appVersion: string
/** @template */ /** @template */
syncStatus?: SyncOpStatus
private closeFunction?: () => void private closeFunction?: () => void
private removeBetaWarningListener?: IReactionDisposer private removeBetaWarningListener?: IReactionDisposer
private removeSyncObserver?: IReactionDisposer
/* @ngInject */ /* @ngInject */
constructor( constructor(
@@ -130,7 +132,14 @@ class AccountMenuCtrl extends PureViewCtrl<{}, AccountMenuState> {
$onInit() { $onInit() {
super.$onInit(); super.$onInit();
this.syncStatus = this.application!.getSyncStatus(); const sync = this.appState.sync;
this.removeSyncObserver = autorun(() => {
this.setState({
syncInProgress: sync.inProgress,
syncError: sync.errorMessage,
syncPercentage: sync.humanReadablePercentage,
});
})
this.removeBetaWarningListener = autorun(() => { this.removeBetaWarningListener = autorun(() => {
this.setState({ this.setState({
showBetaWarning: this.appState.showBetaWarning showBetaWarning: this.appState.showBetaWarning
@@ -139,6 +148,7 @@ class AccountMenuCtrl extends PureViewCtrl<{}, AccountMenuState> {
} }
deinit() { deinit() {
this.removeSyncObserver?.();
this.removeBetaWarningListener?.(); this.removeBetaWarningListener?.();
super.deinit(); super.deinit();
} }

View File

@@ -10,7 +10,8 @@ import {
SNSmartTag, SNSmartTag,
PayloadSource, PayloadSource,
DeinitSource, DeinitSource,
UuidString UuidString,
SyncOpStatus
} from '@standardnotes/snjs'; } from '@standardnotes/snjs';
import { WebApplication } from '@/ui_models/application'; import { WebApplication } from '@/ui_models/application';
import { Editor } from '@/ui_models/editor'; import { Editor } from '@/ui_models/editor';
@@ -58,6 +59,39 @@ class ActionsMenuState {
} }
} }
export class SyncState {
inProgress = false;
errorMessage?: string;
humanReadablePercentage?: string;
constructor() {
makeObservable(this, {
inProgress: observable,
errorMessage: observable,
humanReadablePercentage: observable,
update: action,
});
}
update(status: SyncOpStatus) {
this.errorMessage = status.error?.message;
this.inProgress = status.syncInProgress;
const stats = status.getStats();
const completionPercentage = stats.uploadCompletionCount === 0
? 0
: stats.uploadCompletionCount / stats.uploadTotalCount;
if (completionPercentage === 0) {
this.humanReadablePercentage = undefined;
} else {
this.humanReadablePercentage = completionPercentage.toLocaleString(
undefined,
{ style: 'percent' }
);
}
}
}
export class AppState { export class AppState {
$rootScope: ng.IRootScopeService; $rootScope: ng.IRootScopeService;
$timeout: ng.ITimeoutService; $timeout: ng.ITimeoutService;
@@ -72,7 +106,8 @@ export class AppState {
userPreferences?: SNUserPrefs; userPreferences?: SNUserPrefs;
multiEditorEnabled = false; multiEditorEnabled = false;
showBetaWarning = false; showBetaWarning = false;
actionsMenu = new ActionsMenuState(); readonly actionsMenu = new ActionsMenuState();
readonly sync = new SyncState();
/* @ngInject */ /* @ngInject */
constructor( constructor(
@@ -263,10 +298,16 @@ export class AppState {
addAppEventObserver() { addAppEventObserver() {
this.unsubApp = this.application.addEventObserver(async (eventName) => { this.unsubApp = this.application.addEventObserver(async (eventName) => {
if (eventName === ApplicationEvent.Started) { switch (eventName) {
this.locked = true; case ApplicationEvent.Started:
} else if (eventName === ApplicationEvent.Launched) { this.locked = true;
this.locked = false; break;
case ApplicationEvent.Launched:
this.locked = false;
break;
case ApplicationEvent.SyncStatusChanged:
this.sync.update(this.application.getSyncStatus());
break;
} }
}); });
} }

View File

@@ -34,6 +34,12 @@
margin-left: 0.3rem; margin-left: 0.3rem;
} }
.sk-horizontal-group {
display: flex;
flex-direction: row;
align-items: center;
}
.sk-panel-section { .sk-panel-section {
&:last-child { &:last-child {
padding-bottom: 1rem; padding-bottom: 1rem;

View File

@@ -136,11 +136,11 @@
!self.state.formData.showRegister` !self.state.formData.showRegister`
) )
.sk-panel-section(ng-if='self.state.user') .sk-panel-section(ng-if='self.state.user')
.sk-notification.danger(ng-if='self.syncStatus.error') .sk-notification.danger(ng-if='self.state.syncError')
.sk-notification-title Sync Unreachable .sk-notification-title Sync Unreachable
.sk-notification-text .sk-notification-text
| Hmm...we can't seem to sync your account. | Hmm...we can't seem to sync your account.
| The reason: {{self.syncStatus.error.message}} | The reason: {{self.state.syncError}}
a.sk-a.info-contrast.sk-bold.sk-panel-row( a.sk-a.info-contrast.sk-bold.sk-panel-row(
href='https://standardnotes.org/help', href='https://standardnotes.org/help',
rel='noopener', rel='noopener',
@@ -150,17 +150,16 @@
.sk-panel-column .sk-panel-column
.sk-h1.sk-bold.wrap {{self.state.user.email}} .sk-h1.sk-bold.wrap {{self.state.user.email}}
.sk-subtitle.subtle.normal {{self.state.server}} .sk-subtitle.subtle.normal {{self.state.server}}
.sk-horizontal-group( .sk-horizontal-group(
delay='1000', delay='1000',
delay-hide='true', delay-hide='true',
show='self.syncStatus.syncOpInProgress || self.syncStatus.needsMoreSync' show='self.state.syncInProgress'
) )
.sk-spinner.small.info .sk-spinner.small.info
.sk-sublabel .sk-sublabel
| {{"Syncing" + (self.syncStatus.total > 0 ? ":" : "")}} | Syncing
span( span(ng-if='self.state.syncPercentage')
ng-if='self.syncStatus.total > 0' | ({{self.state.syncPercentage}})
) {{self.syncStatus.current}}/{{self.syncStatus.total}}
.sk-panel-row .sk-panel-row
a.sk-a.info.sk-panel-row.condensed( a.sk-a.info.sk-panel-row.condensed(
ng-click="self.openPasswordWizard()" ng-click="self.openPasswordWizard()"