mirror of https://github.com/usememos/memos
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2.0 KiB
2.0 KiB
Authentication State Architecture
Current Approach: AuthContext
The application uses AuthContext for authentication state management, not React Query's useCurrentUserQuery. This is an intentional architectural decision.
Why AuthContext Instead of React Query?
1. Synchronous Initialization
- AuthContext fetches user data during app initialization (
main.tsx) - Provides synchronous access to
currentUserthroughout the app - No need to handle loading states in every component
2. Single Source of Truth
- User data fetched once on mount
- All components get consistent, up-to-date user info
- No race conditions from multiple query instances
3. Integration with React Query
- AuthContext pre-populates React Query cache after fetch (line 81-82 in
AuthContext.tsx) - Best of both worlds: synchronous access + cache consistency
- React Query hooks like
useNotifications()can still use the cached user data
4. Simpler Component Code
// With AuthContext (current)
const user = useCurrentUser(); // Always returns User | undefined
// With React Query (alternative)
const { data: user, isLoading } = useCurrentUserQuery();
if (isLoading) return <Spinner />;
// Need loading handling everywhere
When to Use React Query for Auth?
Consider migrating auth to React Query if:
- App needs real-time user profile updates from external sources
- Multiple tabs need instant sync
- User data changes frequently during a session
For Memos (a notes app where user profile rarely changes), AuthContext is the right choice.
Future Considerations
The unused useCurrentUserQuery() hook in useUserQueries.ts is kept for potential future use. If requirements change (e.g., real-time collaboration on user profiles), migration path is clear:
- Remove AuthContext
- Use
useCurrentUserQuery()everywhere - Handle loading states in components
- Add suspense boundaries if needed
Recommendation
Keep the current AuthContext approach. It provides better DX and performance for this use case.