@@ -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,6 +53,7 @@ const ResultView = Component.makeUntraced("Result")(function*() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Container>
|
<Container>
|
||||||
|
<Flex direction="column" align="center" gap="2">
|
||||||
<Slider
|
<Slider
|
||||||
value={[id]}
|
value={[id]}
|
||||||
onValueChange={flow(Array.head, Option.getOrThrow, setId)}
|
onValueChange={flow(Array.head, Option.getOrThrow, setId)}
|
||||||
@@ -61,12 +64,19 @@ const ResultView = Component.makeUntraced("Result")(function*() {
|
|||||||
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 =>
|
Match.tag("Failure", result =>
|
||||||
<Text>An error has occured: {result.cause.toString()}</Text>
|
<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>
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user