example/assets/js/store.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 |
import { createStore } from "./h3.js"; const todos = (store) => { store.on("init", () => ({ todos: [], filteredTodos: [], filter: "" })); store.on("todos/add", (state, data) => { let todos = state.todos; todos.unshift({ key: `todo_${Date.now()}__${data.text}`, // Make todos "unique-enough" to ensure they are processed correctly text: data.text, }); return { todos }; }); store.on("todos/load", () => { const storedTodos = localStorage.getItem("h3_todo_list"); const todos = storedTodos ? JSON.parse(storedTodos) : []; return { todos }; }); store.on("todos/remove", (state, data) => { const todos = state.todos.filter(({ key }) => key !== data.key); return { todos }; }); store.on("todos/toggle", (state, data) => { const todos = state.todos; const todo = state.todos.find((t) => t.key === data.key); todo.done = !todo.done; return { todos }; }); store.on("todos/filter", (state, filter) => { const todos = state.todos; const filteredTodos = todos.filter(({ text }) => text.match(filter)); return { filteredTodos, filter }; }); }; const error = (store) => { store.on("init", () => ({ displayEmptyTodoError: false })); store.on("error/clear", (state) => ({ displayEmptyTodoError: false })); store.on("error/set", (state) => ({ displayEmptyTodoError: true })); }; const pages = (store) => { store.on("init", () => ({ pagesize: 10, page: 1 })); store.on("pages/set", (state, page) => ({ page })); }; const store = createStore([todos, error, pages]); store.dispatch("init"); export default store; |