KeyStone / keystone-app /components /AuthContext.tsx
dpv007's picture
qdkm
20a9726
Raw
History Blame Contribute Delete
1.61 kB
import React, { createContext, useContext, useState, useEffect } from 'react';
import AsyncStorage from '@react-native-async-storage/async-storage';
interface AuthContextType {
isAuthenticated: boolean | null;
username: string | null;
login: (token: string) => void;
logout: () => Promise<void>;
}
const AuthContext = createContext<AuthContextType>({
isAuthenticated: null,
username: null,
login: () => {},
logout: async () => {},
});
export function AuthProvider({ children }: { children: React.ReactNode }) {
const [isAuthenticated, setIsAuthenticated] = useState<boolean | null>(null);
const [username, setUsername] = useState<string | null>(null);
const decodeJwt = (token: string): string | null => {
try {
const base64Payload = token.split('.')[1];
const payload = JSON.parse(atob(base64Payload));
return payload.sub || null;
} catch {
return null;
}
};
useEffect(() => {
AsyncStorage.getItem('jwt_token').then(token => {
if (token) {
setUsername(decodeJwt(token));
setIsAuthenticated(true);
} else {
setIsAuthenticated(false);
}
});
}, []);
const login = (token: string) => {
setUsername(decodeJwt(token));
setIsAuthenticated(true);
};
const logout = async () => {
await AsyncStorage.removeItem('jwt_token');
setUsername(null);
setIsAuthenticated(false);
};
return (
<AuthContext.Provider value={{ isAuthenticated, username, login, logout }}>
{children}
</AuthContext.Provider>
);
}
export const useAuth = () => useContext(AuthContext);