import { Container, Flex, Heading, Slider, Text, TextField } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" import { Async, Component, Memoized } from "effect-fc-next" import * as React from "react" import { fetchPost } from "@/post" import { runtime } from "@/runtime" interface AsyncFetchPostViewProps { readonly id: number } const AsyncFetchPostView = Component.make("AsyncFetchPostView")(function*( props: AsyncFetchPostViewProps, ) { const post = yield* Component.useOnChange( () => fetchPost(props.id), [props.id], ) return (
{post.title} {post.body}
) }).pipe( Async.async, Async.withOptions({ defaultFallback: Loading post... }), Memoized.memoized, ) const AsyncRouteComponent = Component.make("AsyncRouteView")(function*() { const [text, setText] = React.useState("Typing here should not trigger a refetch of the post") const [id, setId] = React.useState(1) const AsyncFetchPost = yield* AsyncFetchPostView.use return ( setText(event.currentTarget.value)} /> setId(value ?? 1)} /> Loading post...} /> ) }).pipe( Component.withContext(runtime.context), ) export const Route = createFileRoute("/async")({ component: AsyncRouteComponent, })