diff --git a/src/App.tsx b/src/App.tsx index ba06943..162b096 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -21,12 +21,13 @@ const App = observer(() => {
task.completed = e.target.checked)} /> + onChange={e => task.completed = e.target.checked} /> task.title = e.target.value)} /> + onChange={e => task.title = e.target.value} /> - + + {task.$.title.error}
); })} diff --git a/src/Store.ts b/src/Store.ts index 08e1915..7cf1586 100644 --- a/src/Store.ts +++ b/src/Store.ts @@ -1,15 +1,21 @@ -import { remult } from "remult"; +import { Remult, remult } from "remult"; import { Task } from "./shared/Task"; import { TasksController } from "./shared/TasksController"; -import { makeAutoObservable, runInAction } from 'mobx'; +import { action, createAtom, makeAutoObservable, runInAction } from 'mobx'; import { store } from "./App"; +// Make all remult entities observable mobx items +Remult.entityRefInit = (ref, row) => ref.subscribe(createAtom("entity")); + export class Store { taskRepo = remult.repo(Task); tasks: Task[] = []; hideCompleted = false; constructor() { makeAutoObservable(this); + this.taskRepo.addEventListener({ + deleted: action(task => this.tasks = this.tasks.filter(t => t != task)) + }); } replaceTasks(tasks: Task[]) { this.tasks = tasks; @@ -22,20 +28,15 @@ export class Store { })); } addTask() { - this.tasks.push(new Task()); + this.tasks.push(this.taskRepo.create()); } async saveTask(task: Task) { try { - const savedTask = await this.taskRepo.save(task); - runInAction(() => store.tasks[store.tasks.indexOf(task)] = savedTask); + await task.save(); } catch (error: any) { alert(error.message); } } - async deleteTask(task: Task) { - await this.taskRepo.delete(task); - runInAction(() => this.tasks = this.tasks.filter(t => t !== task)); - } async setAll(completed: boolean) { await TasksController.setAll(completed); this.loadTasks(); diff --git a/src/shared/Task.ts b/src/shared/Task.ts index 720b89d..313645b 100644 --- a/src/shared/Task.ts +++ b/src/shared/Task.ts @@ -1,5 +1,4 @@ -import { makeAutoObservable } from "mobx"; -import { Allow, Entity, Fields, Validators } from "remult"; +import { Allow, Entity, EntityBase, Fields, Validators } from "remult"; import { Roles } from "./Roles"; @Entity("tasks", { @@ -8,10 +7,7 @@ import { Roles } from "./Roles"; allowApiInsert: Roles.admin, allowApiDelete: Roles.admin }) -export class Task { - constructor(){ - makeAutoObservable(this); - } +export class Task extends EntityBase { @Fields.uuid() id!: string;