export const toggleTodoAtom = Atom.optimisticFn(allTodosAtom, {
reducer: (todos, id: TodoId) =>
Option.match(HashMap.get(todos, id), {
onSome: (todo) => HashMap.set(todos, id, { ...todo, completed: !todo.completed }),
onNone: () => todos,
}),
fn: (set) =>
ApiClient.runtime.fn((id) =>
Effect.gen(function* () {
const todos = yield* Atom.get(allTodosAtom)
const todo = HashMap.get(todos, id)
if (Option.isSome(todo)) {
const client = yield* ApiClient
const updatedTodo = yield* client.todos.updateTodoCompleted({
path: { id },
payload: !todo.value.completed,
})
set(HashMap.set(todos, id, updatedTodo))
}
}),
),
})
export const toggleTodoAtom = Atom.optimisticFn(allTodosAtom, {
reducer: (todos, id: TodoId) =>
Option.match(HashMap.get(todos, id), {
onSome: (todo) => HashMap.set(todos, id, { ...todo, completed: !todo.completed }),
onNone: () => todos,
}),
fn: (set) =>
ApiClient.runtime.fn((id) =>
Effect.gen(function* () {
const todos = yield* Atom.get(allTodosAtom)
const todo = HashMap.get(todos, id)
if (Option.isSome(todo)) {
const client = yield* ApiClient
const updatedTodo = yield* client.todos.updateTodoCompleted({
path: { id },
payload: !todo.value.completed,
})
set(HashMap.set(todos, id, updatedTodo))
}
}),
),
})