import { Button, Container, Flex, Heading, Slider, Text } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" import { Effect, SubscriptionRef } from "effect" import { AsyncResult } from "effect/unstable/reactivity" import { Component, Lens, Mutation, Query, View } from "effect-fc-next" import { fetchPost, type Post } from "@/post" import { runtime } from "@/runtime" interface PostResultViewProps { readonly result: AsyncResult.AsyncResult } const PostResultView = (props: PostResultViewProps) => AsyncResult.match(props.result, { onInitial: () => Loading..., onFailure: () => Request failed., onSuccess: result => ( <> {result.value.title} {result.value.body} ), }) const QueryRouteComponent = Component.make("QueryRouteView")(function*() { const [idLens, query, mutation] = yield* Component.useOnMount(() => Effect.gen(function*() { const idLens = Lens.fromSubscriptionRef(yield* SubscriptionRef.make(1)) const query = yield* Query.service({ key: idLens, f: fetchPost, staleTime: "10 seconds", }) const mutation = yield* Mutation.make({ f: fetchPost, }) return [idLens, query, mutation] as const })) const [id] = yield* View.useAll([idLens]) const [queryState, mutationResult] = yield* View.useAll([ query.state, mutation.state, ]) const runPromise = yield* Component.useRunPromise() return ( void runPromise(Lens.set(idLens, value ?? 1)) } /> ) }).pipe( Component.withRuntime(runtime.context), ) export const Route = createFileRoute("/query")({ component: QueryRouteComponent, })