0.1.4 #5

Merged
Thilawyn merged 67 commits from next into master 2025-10-02 18:18:23 +02:00
8 changed files with 37 additions and 32 deletions
Showing only changes of commit 11dfcdaf85 - Show all commits

View File

@@ -17,10 +17,16 @@
"types": "./dist/index.d.ts", "types": "./dist/index.d.ts",
"default": "./dist/index.js" "default": "./dist/index.js"
}, },
"./*": { "./*": [
"types": "./dist/*.d.ts", {
"default": "./dist/*.js" "types": "./dist/*/index.d.ts",
} "default": "./dist/*/index.js"
},
{
"types": "./dist/*.d.ts",
"default": "./dist/*.js"
}
]
}, },
"scripts": { "scripts": {
"build": "tsc", "build": "tsc",

View File

@@ -1,7 +1,7 @@
import { Callout, Flex, Spinner, TextField } from "@radix-ui/themes" import { Callout, Flex, Spinner, TextField } from "@radix-ui/themes"
import { Array, Option } from "effect" import { Array, Option } from "effect"
import { Component, Form } from "effect-fc" import { Component, Form } from "effect-fc"
import { useSubscribables } from "effect-fc/hooks" import { useSubscribables } from "effect-fc/Hooks"
export interface TextFieldFormInputProps export interface TextFieldFormInputProps

View File

@@ -1,7 +1,8 @@
import { Callout, Flex, TextArea, TextAreaProps } from "@radix-ui/themes" /** biome-ignore-all lint/correctness/useHookAtTopLevel: effect-fc HOC */
import { Array, Equivalence, Option, ParseResult, Schema, Struct } from "effect" import { Callout, Flex, TextArea, type TextAreaProps } from "@radix-ui/themes"
import { Array, type Equivalence, Option, ParseResult, type Schema, Struct } from "effect"
import { Component } from "effect-fc" import { Component } from "effect-fc"
import { useInput } from "effect-fc/hooks" import { useInput } from "effect-fc/Hooks"
import * as React from "react" import * as React from "react"

View File

@@ -1,7 +1,8 @@
/** biome-ignore-all lint/correctness/useHookAtTopLevel: effect-fc HOC */
import { Callout, Checkbox, Flex, TextField } from "@radix-ui/themes" import { Callout, Checkbox, Flex, TextField } from "@radix-ui/themes"
import { Array, Equivalence, Option, ParseResult, Schema, Struct } from "effect" import { Array, type Equivalence, Option, ParseResult, type Schema, Struct } from "effect"
import { Component, Memo } from "effect-fc" import { Component } from "effect-fc"
import { useInput, useOptionalInput } from "effect-fc/hooks" import { useInput, useOptionalInput } from "effect-fc/Hooks"
import * as React from "react" import * as React from "react"
@@ -67,4 +68,4 @@ export const TextFieldInput = <A, R, O extends boolean = false>(options: {
} }
</Flex> </Flex>
) )
}).pipe(Memo.memo) })

View File

@@ -1,10 +1,10 @@
import { TextFieldFormInput } from "@/lib/form/TextFieldFormInput"
import { runtime } from "@/runtime"
import { Button, Container, Flex } from "@radix-ui/themes" import { Button, Container, Flex } from "@radix-ui/themes"
import { createFileRoute } from "@tanstack/react-router" import { createFileRoute } from "@tanstack/react-router"
import { Effect, ParseResult, Schema } from "effect" import { Effect, ParseResult, Schema } from "effect"
import { Component, Form } from "effect-fc" import { Component, Form } from "effect-fc"
import { useContext, useSubscribables } from "effect-fc/hooks" import { useContext, useSubscribables } from "effect-fc/Hooks"
import { TextFieldFormInput } from "@/lib/form/TextFieldFormInput"
import { runtime } from "@/runtime"
const email = Schema.pattern<typeof Schema.String>( const email = Schema.pattern<typeof Schema.String>(

View File

@@ -1,10 +1,10 @@
import { runtime } from "@/runtime"
import { Todos } from "@/todo/Todos"
import { TodosState } from "@/todo/TodosState.service"
import { createFileRoute } from "@tanstack/react-router" import { createFileRoute } from "@tanstack/react-router"
import { Effect } from "effect" import { Effect } from "effect"
import { Component } from "effect-fc" import { Component } from "effect-fc"
import { useContext } from "effect-fc/hooks" import { useContext } from "effect-fc/Hooks"
import { runtime } from "@/runtime"
import { Todos } from "@/todo/Todos"
import { TodosState } from "@/todo/TodosState.service"
const TodosStateLive = TodosState.Default("todos") const TodosStateLive = TodosState.Default("todos")

View File

@@ -1,15 +1,13 @@
import { Box, Button, Flex, IconButton } from "@radix-ui/themes"
import { GetRandomValues, makeUuid4 } from "@typed/id"
import { Chunk, DateTime, Effect, Match, Option, Ref, Runtime, Schema, Stream, SubscriptionRef } from "effect"
import { Component, Hooks } from "effect-fc"
import { FaArrowDown, FaArrowUp } from "react-icons/fa"
import { FaDeleteLeft } from "react-icons/fa6"
import * as Domain from "@/domain" import * as Domain from "@/domain"
import { TextAreaInput } from "@/lib/input/TextAreaInput" import { TextAreaInput } from "@/lib/input/TextAreaInput"
import { TextFieldInput } from "@/lib/input/TextFieldInput" import { TextFieldInput } from "@/lib/input/TextFieldInput"
import { DateTimeUtcFromZonedInput } from "@/lib/schema" import { DateTimeUtcFromZonedInput } from "@/lib/schema"
import { Box, Button, Flex, IconButton } from "@radix-ui/themes"
import { GetRandomValues, makeUuid4 } from "@typed/id"
import { Chunk, DateTime, Effect, Match, Option, Ref, Runtime, Schema, Stream, SubscriptionRef } from "effect"
import { Component, Memo } from "effect-fc"
import { useMemo, useOnce, useSubscribables } from "effect-fc/hooks"
import { Subscribable, SubscriptionSubRef } from "effect-fc/types"
import { FaArrowDown, FaArrowUp } from "react-icons/fa"
import { FaDeleteLeft } from "react-icons/fa6"
import { TodosState } from "./TodosState.service" import { TodosState } from "./TodosState.service"
@@ -35,7 +33,7 @@ export class Todo extends Component.makeUntraced("Todo")(function*(props: TodoPr
const runtime = yield* Effect.runtime() const runtime = yield* Effect.runtime()
const state = yield* TodosState const state = yield* TodosState
const { ref, indexRef, contentRef, completedAtRef } = yield* useMemo(() => Match.value(props).pipe( const { ref, indexRef, contentRef, completedAtRef } = yield* Hooks.useMemo(() => Match.value(props).pipe(
Match.tag("new", () => Effect.Do.pipe( Match.tag("new", () => Effect.Do.pipe(
Effect.bind("ref", () => Effect.andThen(makeTodo, SubscriptionRef.make)), Effect.bind("ref", () => Effect.andThen(makeTodo, SubscriptionRef.make)),
Effect.let("indexRef", () => Subscribable.make({ get: Effect.succeed(-1), changes: Stream.empty })), Effect.let("indexRef", () => Subscribable.make({ get: Effect.succeed(-1), changes: Stream.empty })),
@@ -48,10 +46,9 @@ export class Todo extends Component.makeUntraced("Todo")(function*(props: TodoPr
Effect.let("contentRef", ({ ref }) => SubscriptionSubRef.makeFromPath(ref, ["content"])), Effect.let("contentRef", ({ ref }) => SubscriptionSubRef.makeFromPath(ref, ["content"])),
Effect.let("completedAtRef", ({ ref }) => SubscriptionSubRef.makeFromPath(ref, ["completedAt"])), Effect.let("completedAtRef", ({ ref }) => SubscriptionSubRef.makeFromPath(ref, ["completedAt"])),
// eslint-disable-next-line react-hooks/exhaustive-deps
), [props._tag, props._tag === "edit" ? props.id : undefined]) ), [props._tag, props._tag === "edit" ? props.id : undefined])
const [index, size] = yield* useSubscribables(indexRef, state.sizeSubscribable) const [index, size] = yield* Hooks.useSubscribables(indexRef, state.sizeSubscribable)
const StringTextAreaInputFC = yield* StringTextAreaInput const StringTextAreaInputFC = yield* StringTextAreaInput
const OptionalDateTimeInputFC = yield* OptionalDateTimeInput const OptionalDateTimeInputFC = yield* OptionalDateTimeInput

View File

@@ -1,8 +1,8 @@
import { Todo } from "@/domain"
import { KeyValueStore } from "@effect/platform" import { KeyValueStore } from "@effect/platform"
import { BrowserKeyValueStore } from "@effect/platform-browser" import { BrowserKeyValueStore } from "@effect/platform-browser"
import { Chunk, Console, Effect, Option, Schema, Stream, SubscriptionRef } from "effect" import { Chunk, Console, Effect, Option, Schema, Stream, SubscriptionRef } from "effect"
import { Subscribable, SubscriptionSubRef } from "effect-fc/types" import { Subscribable, SubscriptionSubRef } from "effect-fc"
import { Todo } from "@/domain"
export class TodosState extends Effect.Service<TodosState>()("TodosState", { export class TodosState extends Effect.Service<TodosState>()("TodosState", {