all repos — h3 @ 27341c470a6e198ec42dc525683381285d76fd00

A tiny, extremely minimalist JavaScript microframework.

example/assets/js/modules.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
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 }));
};

export default [
  todos,
  error,
  pages,
];