mirror of https://github.com/keeweb/keeweb.git
improved runtime-data
This commit is contained in:
parent
f64c146d2c
commit
d85cf24f8a
|
@ -2,7 +2,12 @@ import { Model } from 'util/model';
|
|||
import { SettingsStore } from 'comp/settings/settings-store';
|
||||
import { noop } from 'util/fn';
|
||||
import { Logger } from 'util/logger';
|
||||
import { NonFunctionPropertyNames, OptionalBooleanPropertyNames } from 'util/types';
|
||||
import {
|
||||
NonFunctionPropertyNames,
|
||||
OptionalBooleanPropertyNames,
|
||||
OptionalDatePropertyNames,
|
||||
OptionalStringPropertyNames
|
||||
} from 'util/types';
|
||||
|
||||
const logger = new Logger('runtime-data');
|
||||
|
||||
|
@ -10,6 +15,11 @@ let changeListener: () => void;
|
|||
|
||||
class RuntimeData extends Model {
|
||||
skipFolderRightsWarning?: boolean;
|
||||
lastSuccessUpdateCheckDate?: Date;
|
||||
lastUpdateCheckDate?: Date;
|
||||
lastUpdateVersion?: string;
|
||||
lastUpdateVersionReleaseDate?: Date;
|
||||
lastUpdateCheckError?: string;
|
||||
|
||||
async init(): Promise<void> {
|
||||
await this.load();
|
||||
|
@ -43,13 +53,32 @@ class RuntimeData extends Model {
|
|||
}
|
||||
|
||||
set(key: string, value: unknown): boolean {
|
||||
const isSet = this.setInternal(key, value);
|
||||
|
||||
if (isSet === undefined) {
|
||||
const thisRec = this as Record<string, unknown>;
|
||||
thisRec[key] = value;
|
||||
return true;
|
||||
} else {
|
||||
return isSet;
|
||||
}
|
||||
}
|
||||
|
||||
setInternal(key: string, value: unknown): boolean {
|
||||
switch (key as NonFunctionPropertyNames<RuntimeData>) {
|
||||
case 'skipFolderRightsWarning':
|
||||
return this.setBoolean('skipFolderRightsWarning', value);
|
||||
case 'lastSuccessUpdateCheckDate':
|
||||
return this.setDate('lastSuccessUpdateCheckDate', value);
|
||||
case 'lastUpdateCheckDate':
|
||||
return this.setDate('lastUpdateCheckDate', value);
|
||||
case 'lastUpdateVersion':
|
||||
return this.setString('lastUpdateVersion', value);
|
||||
case 'lastUpdateVersionReleaseDate':
|
||||
return this.setDate('lastUpdateVersionReleaseDate', value);
|
||||
case 'lastUpdateCheckError':
|
||||
return this.setString('lastUpdateCheckError', value);
|
||||
}
|
||||
const thisRec = this as Record<string, unknown>;
|
||||
thisRec[key] = value;
|
||||
return true;
|
||||
}
|
||||
|
||||
get(key: string): unknown {
|
||||
|
@ -84,7 +113,50 @@ class RuntimeData extends Model {
|
|||
delete this[key];
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
private setString(
|
||||
key: NonNullable<OptionalStringPropertyNames<RuntimeData>>,
|
||||
value: unknown
|
||||
): boolean {
|
||||
if (typeof value === 'string') {
|
||||
this[key] = value;
|
||||
return true;
|
||||
}
|
||||
if (!value) {
|
||||
delete this[key];
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private setDate(
|
||||
key: NonNullable<OptionalDatePropertyNames<RuntimeData>>,
|
||||
value: unknown
|
||||
): boolean {
|
||||
if (!value) {
|
||||
delete this[key];
|
||||
return true;
|
||||
}
|
||||
if (typeof value === 'string') {
|
||||
const dt = new Date(value);
|
||||
if (dt.getTime()) {
|
||||
this[key] = dt;
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (typeof value === 'number') {
|
||||
this[key] = new Date(value);
|
||||
return true;
|
||||
}
|
||||
if (value instanceof Date) {
|
||||
this[key] = value;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -12,3 +12,11 @@ export type BooleanPropertyNames<T> = {
|
|||
export type OptionalBooleanPropertyNames<T> = {
|
||||
[K in keyof T]: T[K] extends boolean | undefined ? K : never;
|
||||
}[keyof T];
|
||||
|
||||
export type OptionalStringPropertyNames<T> = {
|
||||
[K in keyof T]: T[K] extends string | undefined ? K : never;
|
||||
}[keyof T];
|
||||
|
||||
export type OptionalDatePropertyNames<T> = {
|
||||
[K in keyof T]: T[K] extends Date | undefined ? K : never;
|
||||
}[keyof T];
|
||||
|
|
|
@ -63,4 +63,27 @@ describe('RuntimeData', () => {
|
|||
model.x = 'z';
|
||||
expect(localStorage.getItem('runtimeData')).to.eql('{"x":"y"}');
|
||||
});
|
||||
|
||||
it('sets a date', () => {
|
||||
const dt = new Date();
|
||||
|
||||
RuntimeData.lastUpdateCheckDate = dt;
|
||||
RuntimeData.set('lastUpdateVersionReleaseDate', dt);
|
||||
RuntimeData.set('lastSuccessUpdateCheckDate', dt.toISOString());
|
||||
|
||||
expect(RuntimeData.lastUpdateCheckDate).to.eql(dt);
|
||||
expect(RuntimeData.lastUpdateVersionReleaseDate).to.eql(dt);
|
||||
expect(RuntimeData.lastSuccessUpdateCheckDate).to.eql(dt);
|
||||
|
||||
RuntimeData.lastUpdateCheckDate = undefined;
|
||||
RuntimeData.set('lastUpdateVersionReleaseDate', undefined);
|
||||
RuntimeData.set('lastSuccessUpdateCheckDate', 'boo');
|
||||
|
||||
expect(RuntimeData.lastUpdateCheckDate).to.eql(undefined);
|
||||
expect(RuntimeData.lastUpdateVersionReleaseDate).to.eql(undefined);
|
||||
expect(RuntimeData.lastSuccessUpdateCheckDate).to.eql(dt);
|
||||
|
||||
RuntimeData.set('lastUpdateCheckDate', dt.getTime());
|
||||
expect(RuntimeData.lastUpdateCheckDate).to.eql(dt);
|
||||
});
|
||||
});
|
Loading…
Reference in New Issue