Skip to content

Commit

Permalink
fix: ls
Browse files Browse the repository at this point in the history
  • Loading branch information
crashmax-dev committed Apr 9, 2024
1 parent 8c54da2 commit 1d5b140
Showing 1 changed file with 19 additions and 13 deletions.
32 changes: 19 additions & 13 deletions src/features/todo-list/model.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { action, atom, parseAtoms } from '@reatom/framework'
import { withLocalStorage } from '@reatom/persist-web-storage'
import { action, atom, parseAtoms, withInit } from '@reatom/framework'
import type { AtomMut, ParseAtoms } from '@reatom/framework'

export const inputAtom = atom('', 'inputAtom')
Expand All @@ -9,22 +8,29 @@ interface Todo {
completed: AtomMut<boolean>
}

const TODOS_STORAGE_KEY = 'todos'

function fromLocalStorage() {
const snap = localStorage.getItem(TODOS_STORAGE_KEY)
if (!snap) return []
const todos: ParseAtoms<Todo[]> = JSON.parse(snap)
return todos.map((todo) => getTodoItem(todo.title, todo.completed))
}

const toLocalStorage = action((ctx) => {
const todos = JSON.stringify(parseAtoms(ctx, todosAtom))
localStorage.setItem(TODOS_STORAGE_KEY, todos)
}, 'toLocalStorage')

export const todosAtom = atom<Todo[]>([], 'todosAtom').pipe(
withLocalStorage({
key: 'todos',
toSnapshot: parseAtoms,
fromSnapshot: (_, snapshotTodos) => {
return (snapshotTodos as ParseAtoms<Todo>[]).map((todo) =>
getTodoItem(todo.title, todo.completed)
)
}
})
withInit(fromLocalStorage)
)

todosAtom.onChange((_, todos) => console.log('todos', todos))
todosAtom.onChange(toLocalStorage)

function getTodoItem(title: string, completed: boolean): Todo {
const completedAtom = atom(completed, `completed#${title}`)
completedAtom.onChange(toLocalStorage)

return {
title,
completed: completedAtom
Expand Down

0 comments on commit 1d5b140

Please sign in to comment.