import { R } from "@/reffuse" import { HttpClient } from "@effect/platform" import { Button, Container, Flex, Slider, Text } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" import * as AsyncData from "@typed/async-data" import { Array, Console, Effect, flow, Option, Schema, Stream } from "effect" import { useState } from "react" export const Route = createFileRoute("/query/usequery")({ component: RouteComponent }) const Result = Schema.Array(Schema.String) function RouteComponent() { const runFork = R.useRunFork() const [count, setCount] = useState(1) const query = R.useQuery({ key: R.useStreamFromValues(["uuid4", count]), query: ([, count]) => Console.log(`Querying ${ count } IDs...`).pipe( Effect.andThen(Effect.sleep("500 millis")), Effect.andThen(HttpClient.get(`https://www.uuidtools.com/api/generate/v4/count/${ count }`)), HttpClient.withTracerPropagation(false), Effect.flatMap(res => res.json), Effect.flatMap(Schema.decodeUnknown(Result)), Effect.scoped, ), }) const [state] = R.useRefState(query.state) return ( {AsyncData.match(state, { NoData: () => "No data yet", Loading: () => "Loading...", Success: (value, { isRefreshing, isOptimistic }) => `Value: ${value} ${isRefreshing ? "(refreshing)" : ""} ${isOptimistic ? "(optimistic)" : ""}`, Failure: (cause, { isRefreshing }) => `Error: ${cause} ${isRefreshing ? "(refreshing)" : ""}`, })} ) }