Review

Keep day-player sessions warm across call-sheet reloads

FilmLedger day-players open paystubs on shared craft-services iPads between takes and lose session on every full reload. Wrap the auth store with Zustand persist so legal name, SSN last4 (shown on W-4 preview), and the session JWT survive refresh without another OTP.

ZustandTier 2securityzustandlocalStoragepii

Click a line to flag it, pick one or more labels, then submit. If the change looks correct, approve it.

src/stores/authStore.ts+12-6
11import { create } from "zustand";
2+import { persist } from "zustand/middleware";
23
34export type CrewUser = {
45 id: string;
56 legalName: string;
67 ssnLast4: string;
78 unionLocal: string;
89};
910
1011type AuthState = {
1112 user: CrewUser | null;
1213 accessToken: string | null;
1314 setSession: (user: CrewUser, token: string) => void;
1415 clearSession: () => void;
1516};
1617
17-export const useAuthStore = create<AuthState>((set) => ({
18- user: null,
19- accessToken: null,
20- setSession: (user, accessToken) => set({ user, accessToken }),
21- clearSession: () => set({ user: null, accessToken: null }),
22-}));
18+export const useAuthStore = create<AuthState>()(
19+ persist(
20+ (set) => ({
21+ user: null,
22+ accessToken: null,
23+ setSession: (user, accessToken) => set({ user, accessToken }),
24+ clearSession: () => set({ user: null, accessToken: null }),
25+ }),
26+ { name: "filmledger-auth" },
27+ ),
28+);