Complete refactor (#123)

This commit is contained in:
Misode
2020-11-23 14:29:16 +01:00
committed by GitHub
parent 0ad33cd88f
commit 982b4728e7
45 changed files with 1162 additions and 1113 deletions

View File

@@ -0,0 +1,14 @@
import { Property } from './Property'
export class LocalStorageProperty extends Property<string> {
constructor(private id: string, fallback: string) {
super(localStorage.getItem(id) ?? fallback)
}
set(value: string) {
super.set(value)
localStorage.setItem(this.id, value)
}
get(): string {
return this.value
}
}

40
src/app/state/Property.ts Normal file
View File

@@ -0,0 +1,40 @@
import { hexId } from "../Utils"
type PropertyWatcher<T> = (value: T, oldValue: T | null) => void
type NamedPropertyWatcher<T> = {
name: string
watcher: PropertyWatcher<T>
}
export class Property<T> {
private watchers: NamedPropertyWatcher<T>[] = []
constructor(public value: T) {}
set(value: T) {
if (this.value === value) return
const oldValue = this.value
this.value = value
this.watchers.forEach(w => w.watcher(this.value, oldValue))
}
get(): T {
return this.value
}
watchRun(watcher: PropertyWatcher<T>, name?: string) {
watcher(this.value, null)
return this.watch(watcher, name)
}
watch(watcher: PropertyWatcher<T>, name?: string) {
name = name ?? hexId()
const w = this.watchers.find(w => w.name === name)
if (w) {
w.watcher = watcher
} else {
this.watchers.push({ name, watcher })
}
return this
}
}