From 801bb1c1941de8e571520a3bf74997cdc71f475b Mon Sep 17 00:00:00 2001 From: Max Koon <22125083+k2on@users.noreply.github.com> Date: Tue, 18 Nov 2025 13:21:56 -0500 Subject: [PATCH] feat(tui): reject expired token --- apps/tui/src/auth.ts | 12 ++++++++---- apps/tui/src/config.ts | 1 + apps/tui/src/index.tsx | 14 ++++++++------ 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/apps/tui/src/auth.ts b/apps/tui/src/auth.ts index 603c0f3..1640df0 100644 --- a/apps/tui/src/auth.ts +++ b/apps/tui/src/auth.ts @@ -10,7 +10,9 @@ const CLIENT_ID = "koon-family"; const getFromFromDisk = Effect.gen(function* () { const fs = yield* FileSystem.FileSystem; const content = yield* fs.readFileString(config.authPath); - return yield* Schema.decode(Schema.parseJson(AuthState))(content); + const auth = yield* Schema.decode(Schema.parseJson(AuthState))(content); + if (auth.session.expiresAt < new Date()) yield* Effect.fail("Token expired"); + return auth; }); @@ -123,10 +125,12 @@ const requestAuth = Effect.gen(function* () { })); if (sessionData == null) return yield* Effect.fail("Session was null"); - const fs = yield* FileSystem.FileSystem; - yield* fs.writeFileString(config.authPath, JSON.stringify(sessionData)); + const result = yield* Schema.decodeUnknown(AuthState)(sessionData) - return sessionData; + const fs = yield* FileSystem.FileSystem; + yield* fs.writeFileString(config.authPath, JSON.stringify(result)); + + return result; }); export const getAuth = Effect.gen(function* () { diff --git a/apps/tui/src/config.ts b/apps/tui/src/config.ts index e2e852a..73474c3 100644 --- a/apps/tui/src/config.ts +++ b/apps/tui/src/config.ts @@ -7,4 +7,5 @@ const AUTH_PATH = join(PATH, "auth.json"); export const config = { dir: PATH, authPath: AUTH_PATH, + zeroUrl: "http://laptop:4848", }; diff --git a/apps/tui/src/index.tsx b/apps/tui/src/index.tsx index b4a99e7..f1b1756 100644 --- a/apps/tui/src/index.tsx +++ b/apps/tui/src/index.tsx @@ -1,5 +1,5 @@ import { createCliRenderer } from "@opentui/core"; -import { createRoot } from "@opentui/react"; +import { createRoot, useKeyboard } from "@opentui/react"; import { App, type Route } from "@money/ui"; import { ZeroProvider } from "@rocicorp/zero/react"; import { schema } from '@money/shared'; @@ -9,15 +9,17 @@ import { Effect } from "effect"; import { BunContext } from "@effect/platform-bun"; import type { AuthData } from "./schema"; import { kvStore } from "./store"; - -const userID = "anon"; -const server = "http://laptop:4848"; +import { config } from "./config"; function Main({ auth }: { auth: AuthData }) { const [route, setRoute] = useState("/"); + useKeyboard(key => { + if (key.name == "c" && key.ctrl) process.exit(0); + }); + return ( - + );