-
Notifications
You must be signed in to change notification settings - Fork 1
/
data-keeper.js
82 lines (74 loc) · 2.42 KB
/
data-keeper.js
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
78
79
80
81
82
import Storage from './storage.js'
/**
* Its singleton class.
*
* This class is responsible for maintaing the data
* for this application. As the app grows, its UI components
* will also grow. So this instance is useful in centralizing
* the data fetching and updating logic, and also helps
* in separation of concerns.
*/
class DataKeeper {
constructor() {
this.listeners = []
this.keyName = 'todolist'
this.storage = new Storage()
this.data = this.storage.get(this.keyName)
}
callSubscribers() {
this.listeners.map(listener => listener(this.data))
}
/**
* This function whenever called will return
* the latest state of data
*/
get() {
return this.data
}
// It'll add task in todo panel only
addTask({panelName = 'todos', task}) {
if(task && (task.title || task.description)) {
let data = {...this.data}
if(Object.keys(data).length === 0) {
data = {
todos: { name: 'To-Do', tasks: new Array() },
inProgress: { name: 'In-Progress', tasks: new Array() },
done: { name: 'Done', tasks: new Array() }
}
}
const {tasks} = data[panelName]
const newTaskId = tasks.length ? tasks[tasks.length-1].id++ : 11
const updatedTask = {...task, createdAt: new Date().getTime(), id: newTaskId }
tasks.push(updatedTask)
this.data = {...data}
/**
* Write this new data to `this.data` to write it in persistent storage
* and invoke all subscribers about the updated data
*/
this.set(this.data)
return this.data
}
console.error('At least title or description should be filled')
return false
}
set(data) {
this.data = data
this.callSubscribers()
// Update data in localStorage whenever it is updated
this.writeToStorage(this.data)
}
writeToStorage() {
this.storage.set(this.keyName, this.data)
}
subscribe(func) {
if(typeof func !== 'function') {
throw new Error('Expected the lisntener to be function')
}
this.listeners.push(func)
}
unsubscribe(func) {
const idx = this.listeners.indexOf(func)
this.listeners.splice(idx, 1)
}
}
export default new DataKeeper()