diff --git a/packages/example/src/routeTree.gen.ts b/packages/example/src/routeTree.gen.ts index fd6ea54..7080a30 100644 --- a/packages/example/src/routeTree.gen.ts +++ b/packages/example/src/routeTree.gen.ts @@ -11,6 +11,7 @@ // Import Routes import { Route as rootRoute } from './routes/__root' +import { Route as TodosImport } from './routes/todos' import { Route as TimeImport } from './routes/time' import { Route as TestsImport } from './routes/tests' import { Route as PromiseImport } from './routes/promise' @@ -24,6 +25,12 @@ import { Route as QueryServiceImport } from './routes/query/service' // Create/Update Routes +const TodosRoute = TodosImport.update({ + id: '/todos', + path: '/todos', + getParentRoute: () => rootRoute, +} as any) + const TimeRoute = TimeImport.update({ id: '/time', path: '/time', @@ -137,6 +144,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof TimeImport parentRoute: typeof rootRoute } + '/todos': { + id: '/todos' + path: '/todos' + fullPath: '/todos' + preLoaderRoute: typeof TodosImport + parentRoute: typeof rootRoute + } '/query/service': { id: '/query/service' path: '/query/service' @@ -171,6 +185,7 @@ export interface FileRoutesByFullPath { '/promise': typeof PromiseRoute '/tests': typeof TestsRoute '/time': typeof TimeRoute + '/todos': typeof TodosRoute '/query/service': typeof QueryServiceRoute '/query/usemutation': typeof QueryUsemutationRoute '/query/usequery': typeof QueryUsequeryRoute @@ -184,6 +199,7 @@ export interface FileRoutesByTo { '/promise': typeof PromiseRoute '/tests': typeof TestsRoute '/time': typeof TimeRoute + '/todos': typeof TodosRoute '/query/service': typeof QueryServiceRoute '/query/usemutation': typeof QueryUsemutationRoute '/query/usequery': typeof QueryUsequeryRoute @@ -198,6 +214,7 @@ export interface FileRoutesById { '/promise': typeof PromiseRoute '/tests': typeof TestsRoute '/time': typeof TimeRoute + '/todos': typeof TodosRoute '/query/service': typeof QueryServiceRoute '/query/usemutation': typeof QueryUsemutationRoute '/query/usequery': typeof QueryUsequeryRoute @@ -213,6 +230,7 @@ export interface FileRouteTypes { | '/promise' | '/tests' | '/time' + | '/todos' | '/query/service' | '/query/usemutation' | '/query/usequery' @@ -225,6 +243,7 @@ export interface FileRouteTypes { | '/promise' | '/tests' | '/time' + | '/todos' | '/query/service' | '/query/usemutation' | '/query/usequery' @@ -237,6 +256,7 @@ export interface FileRouteTypes { | '/promise' | '/tests' | '/time' + | '/todos' | '/query/service' | '/query/usemutation' | '/query/usequery' @@ -251,6 +271,7 @@ export interface RootRouteChildren { PromiseRoute: typeof PromiseRoute TestsRoute: typeof TestsRoute TimeRoute: typeof TimeRoute + TodosRoute: typeof TodosRoute QueryServiceRoute: typeof QueryServiceRoute QueryUsemutationRoute: typeof QueryUsemutationRoute QueryUsequeryRoute: typeof QueryUsequeryRoute @@ -264,6 +285,7 @@ const rootRouteChildren: RootRouteChildren = { PromiseRoute: PromiseRoute, TestsRoute: TestsRoute, TimeRoute: TimeRoute, + TodosRoute: TodosRoute, QueryServiceRoute: QueryServiceRoute, QueryUsemutationRoute: QueryUsemutationRoute, QueryUsequeryRoute: QueryUsequeryRoute, @@ -286,6 +308,7 @@ export const routeTree = rootRoute "/promise", "/tests", "/time", + "/todos", "/query/service", "/query/usemutation", "/query/usequery" @@ -312,6 +335,9 @@ export const routeTree = rootRoute "/time": { "filePath": "time.tsx" }, + "/todos": { + "filePath": "todos.tsx" + }, "/query/service": { "filePath": "query/service.tsx" }, diff --git a/packages/example/src/routes/index.tsx b/packages/example/src/routes/index.tsx index 6de5c78..58b96d2 100644 --- a/packages/example/src/routes/index.tsx +++ b/packages/example/src/routes/index.tsx @@ -1,29 +1,10 @@ -import { TodosContext } from "@/todos/reffuse" -import { TodosState } from "@/todos/services" -import { VTodos } from "@/todos/views/VTodos" -import { Container } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" -import { Layer } from "effect" -import { useMemo } from "react" -export const Route = createFileRoute("/")({ - component: Index +export const Route = createFileRoute('/')({ + component: RouteComponent }) -function Index() { - - const todosLayer = useMemo(() => Layer.empty.pipe( - Layer.provideMerge(TodosState.make("todos")) - ), []) - - - return ( - - - - - - ) - +function RouteComponent() { + return
Hello "/"!
} diff --git a/packages/example/src/routes/todos.tsx b/packages/example/src/routes/todos.tsx new file mode 100644 index 0000000..17aa88f --- /dev/null +++ b/packages/example/src/routes/todos.tsx @@ -0,0 +1,35 @@ +import { TodosContext } from "@/todos/reffuse" +import { TodosState } from "@/todos/services" +import { VTodos } from "@/todos/views/VTodos" +import { Container } from "@radix-ui/themes" +import { createFileRoute } from "@tanstack/react-router" +import { Console, Effect, Layer } from "effect" +import { useMemo } from "react" + + +export const Route = createFileRoute("/todos")({ + component: Todos +}) + +function Todos() { + + const todosLayer = useMemo(() => Layer.empty.pipe( + Layer.provideMerge(TodosState.make("todos")), + + Layer.merge(Layer.effectDiscard( + Effect.addFinalizer(() => Console.log("TodosContext cleaned up")).pipe( + Effect.andThen(Console.log("TodosContext constructed")) + ) + )), + ), []) + + + return ( + + + + + + ) + +} diff --git a/packages/reffuse/src/ReffuseContext.ts b/packages/reffuse/src/ReffuseContext.ts index 39ec634..6096857 100644 --- a/packages/reffuse/src/ReffuseContext.ts +++ b/packages/reffuse/src/ReffuseContext.ts @@ -49,9 +49,13 @@ const makeProvider = (Context: React.Context>): ReactProvi React.useEffect(() => isInitialRun.pipe( Effect.if({ - onTrue: () => Ref.set(isInitialRun, false), + onTrue: () => Ref.set(isInitialRun, false).pipe( + Effect.map(() => + () => runSync(Scope.close(initialScope, Exit.void)) + ) + ), + onFalse: () => Effect.Do.pipe( - Effect.tap(Scope.close(initialScope, Exit.void)), Effect.bind("scope", () => Scope.make()), Effect.bind("context", ({ scope }) => makeContext(scope)), Effect.tap(({ context }) =>