refactor: replace device auth flow with effect

This commit is contained in:
Max Koon
2025-11-17 17:17:54 -05:00
parent 9e11455db1
commit f17daa2c78
9 changed files with 617 additions and 190 deletions

View File

@@ -3,61 +3,36 @@ import { createRoot } from "@opentui/react";
import { App, type Route } from "@money/ui";
import { ZeroProvider } from "@rocicorp/zero/react";
import { schema } from '@money/shared';
import { use, useState } from "react";
import { writeFileSync, readFileSync, existsSync, rmSync, mkdirSync } from "fs";
import { join } from "path";
import { homedir } from "os";
import { Auth } from "./auth";
import { AuthContext, type AuthType } from "./auth/context";
import { useState } from "react";
import { AuthClient, getAuth, layer } from "./auth";
import { Effect, Layer } from "effect";
import { BunContext } from "@effect/platform-bun";
import type { AuthData } from "./schema";
const userID = "anon";
const server = "http://laptop:4848";
// const auth = undefined;
const PATH = join(homedir(), ".local", "share", "money");
function Main({ auth: initalAuth }: { auth: AuthType | null }) {
const [auth, setAuth] = useState(initalAuth);
function Main({ auth }: { auth: AuthData }) {
const [route, setRoute] = useState<Route>("/");
return (
<AuthContext.Provider value={{ auth, setAuth: (auth) => {
if (auth) {
mkdirSync(PATH, { recursive: true });
writeFileSync(PATH + "/auth.json", JSON.stringify(auth));
setAuth(auth);
} else {
rmSync(PATH + "token");
}
} }}>
{auth ? <Authed /> : <Auth />}
</AuthContext.Provider>
);
}
function Authed() {
const { auth } = use(AuthContext);
return (
<ZeroProvider {...{ userID, auth: auth?.token, server, schema }}>
<Router />
<ZeroProvider {...{ userID, auth: auth.session.token, server, schema }}>
<App
auth={auth || null}
route={route}
setRoute={setRoute}
/>
</ZeroProvider>
);
}
function Router() {
const { auth } = use(AuthContext);
const [route, setRoute] = useState<Route>("/");
return (
<App
auth={auth?.auth || null}
route={route}
setRoute={setRoute}
/>
);
}
const auth = await Effect.runPromise(
getAuth.pipe(
Effect.provide(BunContext.layer),
Effect.provide(layer()),
)
);
const renderer = await createCliRenderer();
const auth = existsSync(PATH + "/auth.json") ? JSON.parse(readFileSync(PATH + "/auth.json", 'utf8')) as AuthType : null;
createRoot(renderer).render(<Main auth={auth} />);