dograh/ui/src/lib/auth/providers/LocalProviderWrapper.tsx
2026-02-18 13:16:49 +05:30

74 lines
2 KiB
TypeScript

'use client';
import React, { useEffect, useMemo, useRef, useState } from 'react';
import logger from '@/lib/logger';
import type { AuthUser, LocalUser } from '../types';
import { AuthContext } from './AuthProvider';
export function LocalProviderWrapper({ children }: { children: React.ReactNode }) {
const [user, setUser] = useState<LocalUser | null>(null);
const [loading, setLoading] = useState(true);
const tokenRef = useRef<string | null>(null);
useEffect(() => {
if (typeof window === 'undefined') return;
const initializeAuth = async () => {
try {
const response = await fetch('/api/auth/oss');
if (response.ok) {
const data = await response.json();
tokenRef.current = data.token;
setUser(data.user);
logger.info('OSS auth initialized', { user: data.user });
} else {
logger.error('Failed to initialize OSS auth');
}
} catch (error) {
logger.error('Error initializing OSS auth', error);
} finally {
setLoading(false);
}
};
initializeAuth();
}, []);
const getAccessToken = React.useCallback(async () => {
if (typeof window === 'undefined') {
return 'ssr-placeholder-token';
}
if (!tokenRef.current) {
logger.warn('No OSS token available after initialization');
return '';
}
return tokenRef.current;
}, []);
const redirectToLogin = React.useCallback(() => {
logger.info('Login redirect not needed in local mode');
}, []);
const logout = React.useCallback(async () => {
setUser(null);
logger.info('Logout requested in OSS mode - server cookies need to be cleared');
}, []);
const contextValue = useMemo(() => ({
user: user as AuthUser,
isAuthenticated: !loading,
loading,
getAccessToken,
redirectToLogin,
logout,
provider: 'local' as const,
}), [user, loading, getAccessToken, redirectToLogin, logout]);
return (
<AuthContext.Provider value={contextValue}>
{children}
</AuthContext.Provider>
);
}