Output/Gemini1_0/JS/extracted_code/contextual_experiment/update/todoModel.ts (63 lines of code) (raw):
// todoModel.ts
import { EventEmitter } from "events";
import { ITodo } from "./todo";
class TodoModel extends EventEmitter {
public todos: Array<ITodo>;
constructor(key: string) {
super();
this.todos = this.load(key);
}
public subscribe(event: string, callback: Function) {
this.on(event, callback);
}
public addTodo(title: string) {
const id = this.nextId();
const todo = {
id: id,
title: title,
completed: false,
};
this.todos.push(todo);
this.save();
this.emit("add", todo);
}
public toggle(todo: ITodo) {
todo.completed = !todo.completed;
this.save();
this.emit("update", todo);
}
public toggleAll(checked: boolean) {
this.todos.forEach((todo) => {
todo.completed = checked;
});
this.save();
this.emit("updateAll", this.todos);
}
public destroy(todo: ITodo) {
this.todos.splice(this.todos.indexOf(todo), 1);
this.save();
this.emit("destroy", todo);
}
public save(key: string = "react-todos") {
localStorage.setItem(key, JSON.stringify(this.todos));
}
public load(key: string = "react-todos") {
const todos = localStorage.getItem(key);
return todos ? JSON.parse(todos) : [];
}
public clearCompleted() {
const completed = this.todos.filter((todo) => {
return todo.completed;
});
completed.forEach((todo) => {
this.destroy(todo);
});
}
public nextId() {
let max = 0;
this.todos.forEach((todo) => {
max = Math.max(max, todo.id);
});
return max + 1;
}
}
export { TodoModel };