@@ -3,20 +3,30 @@ import { BrowserWorker } from "@effect/platform-browser";
33import { createFileRoute } from "@tanstack/react-router" ;
44import { Effect } from "effect" ;
55import { startTransition } from "react" ;
6+ import { useActivity } from "../lib/hooks/use-activity" ;
67import { RuntimeClient } from "../lib/runtime-client" ;
8+ import { LoroStorage } from "../lib/services/loro-storage" ;
79import { WorkspaceManager } from "../lib/services/workspace-manager" ;
810import { useActionEffect } from "../lib/use-action-effect" ;
911import { Bootstrap } from "../workers/schema" ;
1012
1113export const Route = createFileRoute ( "/$workspaceId" ) ( {
1214 component : RouteComponent ,
1315 loader : ( { params : { workspaceId } } ) =>
14- RuntimeClient . runPromise ( WorkspaceManager . getById ( { workspaceId } ) ) ,
16+ RuntimeClient . runPromise (
17+ WorkspaceManager . getById ( { workspaceId } ) . pipe (
18+ Effect . flatMap ( Effect . fromNullable )
19+ )
20+ ) ,
1521} ) ;
1622
1723function RouteComponent ( ) {
1824 const workspace = Route . useLoaderData ( ) ;
1925
26+ const { data, error, loading } = useActivity ( {
27+ workspaceId : workspace . workspaceId ,
28+ } ) ;
29+
2030 const [ , bootstrap ] = useActionEffect (
2131 ( { workspaceId } : { workspaceId : string } ) =>
2232 Effect . gen ( function * ( ) {
@@ -36,6 +46,22 @@ function RouteComponent() {
3646 )
3747 ) ;
3848
49+ const [ , onAdd ] = useActionEffect ( ( formData : FormData ) =>
50+ Effect . gen ( function * ( ) {
51+ const loroStorage = yield * LoroStorage ;
52+
53+ const name = formData . get ( "name" ) as string ;
54+
55+ yield * loroStorage . insertActivity ( {
56+ workspaceId : workspace . workspaceId ,
57+ value : {
58+ id : crypto . randomUUID ( ) ,
59+ name,
60+ } ,
61+ } ) ;
62+ } )
63+ ) ;
64+
3965 return (
4066 < div >
4167 < p > { workspace . workspaceId } </ p >
@@ -48,6 +74,21 @@ function RouteComponent() {
4874 >
4975 Bootstrap
5076 </ button >
77+
78+ < form action = { onAdd } >
79+ < input type = "text" name = "name" />
80+ < button type = "submit" > Add activity</ button >
81+ </ form >
82+
83+ < div >
84+ { loading && < p > Loading...</ p > }
85+ { error && < pre > { JSON . stringify ( error , null , 2 ) } </ pre > }
86+ { ( data ?? [ ] ) . map ( ( activity ) => (
87+ < div key = { activity . id } >
88+ < label > Name { activity . name } </ label >
89+ </ div >
90+ ) ) }
91+ </ div >
5192 </ div >
5293 ) ;
5394}
0 commit comments