/
usageTracker.ts
77 lines (61 loc) · 1.86 KB
/
usageTracker.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import type { Disposable, Event } from 'vscode';
import { EventEmitter } from 'vscode';
import type { Storage } from './storage';
import { updateRecordValue } from './system/object';
export interface TrackedUsage {
count: number;
firstUsedAt: number;
lastUsedAt: number;
}
export type TrackedUsageKeys = 'graphWebview:shown' | 'timelineWebview:shown' | 'timelineView:shown';
export type UsageChangeEvent = {
/**
* The key of the action/event/feature who's usage was tracked
*/
readonly key: TrackedUsageKeys;
readonly usage?: TrackedUsage;
};
export class UsageTracker implements Disposable {
private _onDidChange = new EventEmitter<UsageChangeEvent | undefined>();
get onDidChange(): Event<UsageChangeEvent | undefined> {
return this._onDidChange.event;
}
constructor(private readonly storage: Storage) {}
dispose(): void {}
get(key: TrackedUsageKeys): TrackedUsage | undefined {
return this.storage.get('usages')?.[key];
}
async reset(key?: TrackedUsageKeys): Promise<void> {
let usages = this.storage.get('usages');
if (usages == null) return;
if (key == null) {
await this.storage.delete('usages');
this._onDidChange.fire(undefined);
return;
}
usages = updateRecordValue(usages, key, undefined);
await this.storage.store('usages', usages);
this._onDidChange.fire({ key: key, usage: undefined });
}
async track(key: TrackedUsageKeys): Promise<void> {
let usages = this.storage.get('usages');
if (usages == null) {
usages = Object.create(null) as NonNullable<typeof usages>;
}
const usedAt = Date.now();
let usage = usages[key];
if (usage == null) {
usage = {
count: 0,
firstUsedAt: usedAt,
lastUsedAt: usedAt,
};
usages[key] = usage;
} else {
usage.count++;
usage.lastUsedAt = usedAt;
}
await this.storage.store('usages', usages);
this._onDidChange.fire({ key: key, usage: usage });
}
}