improved runtime-data

This commit is contained in:
antelle 2021-05-24 16:37:41 +02:00
parent f64c146d2c
commit d85cf24f8a
No known key found for this signature in database
GPG Key ID: 63C9777AAB7C563C
3 changed files with 108 additions and 5 deletions

View File

@ -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;
}
}

View File

@ -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];

View File

@ -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);
});
});