Tests
All checks were successful
Lint / lint (push) Successful in 13s

This commit is contained in:
Julien Valverdé
2025-11-25 16:11:03 +01:00
parent 6f50cf2989
commit 4b67552a14

View File

@@ -1,8 +1,8 @@
import { HttpClient, type HttpClientError } from "@effect/platform" import { HttpClient, type HttpClientError } from "@effect/platform"
import { Container, Heading, Slider, Text } from "@radix-ui/themes" import { Button, Container, Flex, Heading, Slider, Text } from "@radix-ui/themes"
import { createFileRoute } from "@tanstack/react-router" import { createFileRoute } from "@tanstack/react-router"
import { Array, Cause, Chunk, Console, Effect, flow, Match, Option, Schema, Stream } from "effect" import { Array, Cause, Chunk, Console, Effect, flow, Match, Option, Schema, Stream } from "effect"
import { Component, ErrorObserver, Query, Subscribable, SubscriptionRef } from "effect-fc" import { Component, ErrorObserver, Query, Result, Subscribable, SubscriptionRef } from "effect-fc"
import { runtime } from "@/runtime" import { runtime } from "@/runtime"
@@ -14,6 +14,8 @@ const Post = Schema.Struct({
}) })
const ResultView = Component.makeUntraced("Result")(function*() { const ResultView = Component.makeUntraced("Result")(function*() {
const runPromise = yield* Component.useRunPromise()
const [idRef, query] = yield* Component.useOnMount(() => Effect.gen(function*() { const [idRef, query] = yield* Component.useOnMount(() => Effect.gen(function*() {
const idRef = yield* SubscriptionRef.make(1) const idRef = yield* SubscriptionRef.make(1)
const key = Stream.zipLatest(Stream.make("posts" as const), idRef.changes) const key = Stream.zipLatest(Stream.make("posts" as const), idRef.changes)
@@ -51,22 +53,30 @@ const ResultView = Component.makeUntraced("Result")(function*() {
return ( return (
<Container> <Container>
<Slider <Flex direction="column" align="center" gap="2">
value={[id]} <Slider
onValueChange={flow(Array.head, Option.getOrThrow, setId)} value={[id]}
/> onValueChange={flow(Array.head, Option.getOrThrow, setId)}
/>
{Match.value(result).pipe( {Match.value(result).pipe(
Match.tag("Running", () => <Text>Loading...</Text>), Match.tag("Running", () => <Text>Loading...</Text>),
Match.tag("Success", result => <> Match.tag("Success", result => <>
<Heading>{result.value.title}</Heading> <Heading>{result.value.title}</Heading>
<Text>{result.value.body}</Text> <Text>{result.value.body}</Text>
</>), {Result.isRefreshing(result) && <Text>Refreshing...</Text>}
Match.tag("Failure", result => </>),
<Text>An error has occured: {result.cause.toString()}</Text> Match.tag("Failure", result =>
), <Text>An error has occured: {result.cause.toString()}</Text>
Match.orElse(() => <></>), ),
)} Match.orElse(() => <></>),
)}
<Flex direction="row" justify="center" align="center" gap="1">
<Button onClick={() => runPromise(query.refresh)}>Refresh</Button>
<Button onClick={() => runPromise(query.refetch)}>Refetch</Button>
</Flex>
</Flex>
</Container> </Container>
) )
}) })