Refactoring

This commit is contained in:
Julien Valverdé
2024-07-13 01:27:39 +02:00
parent d27c64c576
commit d737bda473
4 changed files with 49 additions and 75 deletions

View File

@@ -9,8 +9,6 @@ const TanStackRouterDevtools = process.env.NODE_ENV === "production"
}))) })))
export const Route = createRootRoute({ component: Root })
export function Root() { export function Root() {
return <> return <>
<div className="container mx-auto mt-8"> <div className="container mx-auto mt-8">
@@ -20,3 +18,5 @@ export function Root() {
<Suspense><TanStackRouterDevtools /></Suspense> <Suspense><TanStackRouterDevtools /></Suspense>
</> </>
} }
export const Route = createRootRoute({ component: Root })

View File

@@ -1,9 +1,51 @@
import { Schema as S } from "@effect/schema"
import { createLazyFileRoute } from "@tanstack/react-router" import { createLazyFileRoute } from "@tanstack/react-router"
import { VTodosSubscription } from "../todo/VTodosSubscription" import { JsonifiableTodo } from "@todo-tests/common/data"
import { Option, flow, identity } from "effect"
import { IObservableArray, observable } from "mobx"
import { observer } from "mobx-react-lite"
import { useState } from "react"
import { Todo } from "../data"
import { VTodo } from "../todo/VTodo"
import { trpc } from "../trpc/trpc"
const decodeTodos = flow(
S.decodeSync(
S.mutable(S.Array(
JsonifiableTodo.pipe(S.compose(Todo))
))
),
observable.array,
)
export const Index = observer(() => {
const [todos, setTodos] = useState<IObservableArray<Todo>>(observable.array())
trpc.todos.changes.useSubscription(undefined, {
onData: data => {
setTodos(decodeTodos(data))
}
})
return (
<div className="flex flex-col gap-1 items-stretch">
{todos.map(todo => (
<VTodo
key={Option.match(todo.id, {
onSome: identity,
onNone: () => todo.order,
})}
todo={todo}
/>
))}
</div>
)
})
export const Route = createLazyFileRoute("/")({ component: Index }) export const Route = createLazyFileRoute("/")({ component: Index })
export function Index() {
return <VTodosSubscription />
}

View File

@@ -1,29 +0,0 @@
import { Option, identity } from "effect"
import { IObservableArray } from "mobx"
import { observer } from "mobx-react-lite"
import { Todo } from "../data"
import { VTodo } from "./VTodo"
export interface VTodosProps {
todos: IObservableArray<Todo>
}
/**
* Shows a vertical list of todos
*/
export const VTodos = observer(({ todos }: VTodosProps) => (
<div className="flex flex-col items-stretch gap-1">
{todos.map(todo => (
<VTodo
key={Option.match(todo.id, {
onSome: identity,
onNone: () => todo.order,
})}
todo={todo}
/>
))}
</div>
))

View File

@@ -1,39 +0,0 @@
import { Schema as S } from "@effect/schema"
import { JsonifiableTodo } from "@todo-tests/common/data"
import { flow } from "effect"
import { IObservableArray, observable } from "mobx"
import { observer } from "mobx-react-lite"
import { useState } from "react"
import { Todo } from "../data"
import { trpc } from "../trpc/trpc"
import { VTodos } from "./VTodos"
const decodeTodos = flow(
S.decodeSync(
S.mutable(S.Array(
JsonifiableTodo.pipe(S.compose(Todo))
))
),
observable.array,
)
/**
* Shows a vertical list of todos
*/
export const VTodosSubscription = observer(() => {
const [todos, setTodos] = useState<IObservableArray<Todo>>(observable.array())
trpc.todos.changes.useSubscription(undefined, {
onData: data => {
setTodos(decodeTodos(data))
}
})
return <VTodos todos={todos} />
})