@uppy/core
Version:
Core module for the extensible JavaScript file upload widget with support for drag&drop, resumable uploads, previews, restrictions, file processing/encoding, remote providers like Instagram, Dropbox, Google Drive, S3 and more :dog:
42 lines (34 loc) • 828 B
JavaScript
import deepFreeze from 'deep-freeze'
/**
* Default store + deepFreeze on setState to make sure nothing is mutated accidentally
*/
class DeepFrozenStore {
constructor() {
this.state = {}
this.callbacks = []
}
getState() {
return this.state
}
setState(patch) {
const prevState = { ...this.state }
const nextState = deepFreeze({ ...this.state, ...patch })
this.state = nextState
this._publish(prevState, nextState, patch)
}
subscribe(listener) {
this.callbacks.push(listener)
return () => {
// Remove the listener.
this.callbacks.splice(this.callbacks.indexOf(listener), 1)
}
}
_publish(...args) {
this.callbacks.forEach((listener) => {
listener(...args)
})
}
}
export default function defaultStore() {
return new DeepFrozenStore()
}