From fb6b7ff683ae21ebcabf8ad294470e5d6a67490b Mon Sep 17 00:00:00 2001 From: Max Koon <22125083+k2on@users.noreply.github.com> Date: Mon, 13 Oct 2025 23:13:16 -0400 Subject: [PATCH] feat: add auth to zero queries --- .gitignore | 2 +- app.json | 3 ++- app/_layout.tsx | 39 +++++++++++++++++++++++++++++++++------ app/index.tsx | 6 +++--- lib/zero.ts | 8 -------- metro.config.js | 3 +++ package.json | 1 + pnpm-lock.yaml | 22 ++++++++++++++++++++++ shared/src/queries.ts | 12 +++++++++--- shared/src/schema.ts | 17 ++++++++++++----- shared/src/zql.ts | 9 +++++++++ 11 files changed, 95 insertions(+), 27 deletions(-) delete mode 100644 lib/zero.ts create mode 100644 shared/src/zql.ts diff --git a/.gitignore b/.gitignore index ca8b0ae..1e10e19 100644 --- a/.gitignore +++ b/.gitignore @@ -31,7 +31,7 @@ yarn-error.* *.pem # local env files -.env*.local +.env # typescript *.tsbuildinfo diff --git a/app.json b/app.json index 38398b6..4eea95d 100644 --- a/app.json +++ b/app.json @@ -38,7 +38,8 @@ "backgroundColor": "#000000" } } - ] + ], + "expo-sqlite" ], "experiments": { "typedRoutes": true, diff --git a/app/_layout.tsx b/app/_layout.tsx index 467bfaa..62016ea 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -3,23 +3,50 @@ import 'react-native-reanimated'; import { authClient } from '@/lib/auth-client'; import { ZeroProvider } from '@rocicorp/zero/react'; -import { zero } from '@/lib/zero'; +import { useMemo } from 'react'; +import { authDataSchema } from '@/shared/src/auth'; +import { Platform } from 'react-native'; +import type { ZeroOptions } from '@rocicorp/zero'; +import { schema, type Schema } from '@/shared/src'; +import { expoSQLiteStoreProvider } from "@rocicorp/zero/react-native"; export const unstable_settings = { - anchor: '(tabs)', + anchor: 'index', }; +const kvStore = Platform.OS === "web" ? undefined : expoSQLiteStoreProvider(); export default function RootLayout() { - const { data, isPending } = authClient.useSession(); + const { data: session, isPending } = authClient.useSession(); + + const authData = useMemo(() => { + const result = authDataSchema.safeParse(session); + return result.success ? result.data : null; + }, [session]); + + const cookie = useMemo(() => { + return Platform.OS == 'web' ? undefined : authClient.getCookie(); + }, [session, isPending]); + + const zeroProps = useMemo(() => { + return { + storageKey: 'money', + kvStore, + server: 'http://localhost:4848', + userID: authData?.user.id ?? "anon", + schema, + // mutators: createMutators(), + auth: cookie, + } as const satisfies ZeroOptions; + }, [authData, cookie]); return ( - + - + - + diff --git a/app/index.tsx b/app/index.tsx index 62db9ac..a9247cc 100644 --- a/app/index.tsx +++ b/app/index.tsx @@ -5,15 +5,15 @@ import { useQuery, useZero } from "@rocicorp/zero/react"; import { queries } from '@money/shared'; export default function HomeScreen() { - const { data } = authClient.useSession(); + const { data: session } = authClient.useSession(); const onLogout = () => { authClient.signOut(); } - const [transactions] = useQuery(queries.allTransactions()); + const [transactions] = useQuery(queries.allTransactions(session)); return ( - Hello {data?.user.name} + Hello {session?.user.name}