mirror of
https://github.com/morris/vanilla-todo.git
synced 2025-08-20 21:02:10 +02:00
rename store to controller, update data flow section
This commit is contained in:
69
public/scripts/TodoController.js
Normal file
69
public/scripts/TodoController.js
Normal file
@@ -0,0 +1,69 @@
|
||||
import { TodoLogic } from './TodoLogic.js';
|
||||
|
||||
/**
|
||||
* @param {HTMLElement} el
|
||||
*/
|
||||
export function TodoController(el) {
|
||||
let todoData = TodoLogic.initTodoData();
|
||||
let saveTimeout;
|
||||
|
||||
el.addEventListener('loadTodoData', load);
|
||||
|
||||
for (const action of [
|
||||
'addTodoItem',
|
||||
'checkTodoItem',
|
||||
'editTodoItem',
|
||||
'moveTodoItem',
|
||||
'deleteTodoItem',
|
||||
'addCustomTodoList',
|
||||
'editCustomTodoList',
|
||||
'moveCustomTodoList',
|
||||
'deleteCustomTodoList',
|
||||
'seekDays',
|
||||
'seekToToday',
|
||||
'seekToDate',
|
||||
'seekCustomTodoLists',
|
||||
]) {
|
||||
el.addEventListener(action, (e) => {
|
||||
todoData = TodoLogic[action](todoData, e.detail);
|
||||
update();
|
||||
});
|
||||
}
|
||||
|
||||
function update() {
|
||||
save();
|
||||
|
||||
el.dispatchEvent(
|
||||
new CustomEvent('todoData', {
|
||||
detail: todoData,
|
||||
bubbles: false,
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
function load() {
|
||||
try {
|
||||
if (localStorage?.todo) {
|
||||
todoData = { ...todoData, ...JSON.parse(localStorage.todo) };
|
||||
}
|
||||
} catch (err) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.warn(err);
|
||||
}
|
||||
|
||||
update();
|
||||
}
|
||||
|
||||
function save() {
|
||||
clearTimeout(saveTimeout);
|
||||
|
||||
saveTimeout = setTimeout(() => {
|
||||
try {
|
||||
localStorage.todo = JSON.stringify(todoData);
|
||||
} catch (err) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.warn(err);
|
||||
}
|
||||
}, 100);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user