dry-react
Version:
Initialiseur de structure React Native typée et modulaire
80 lines (69 loc) • 2.18 kB
JavaScript
const fs = require('fs');
const path = require('path');
module.exports = function generateAuthHook() {
const hooksPath = path.join(__dirname, '..', 'src', 'hooks');
fs.mkdirSync(hooksPath, { recursive: true });
const content = `import { useEffect } from 'react';
import AsyncStorage from '@react-native-async-storage/async-storage';
import { useAppDispatch, useAppSelector } from '../store/hooks.tsx';
import { logout, setToken, setUser } from '../store/slices/auth.slice.tsx';
interface StorageUser {
token: string;
data: {
id: string;
name: string;
email: string;
avatar?: string;
bio?: string;
friendsCount?: number;
postsCount?: number;
};
}
export const useAuthUser = () => {
const dispatch = useAppDispatch();
const { user, token, isAuthenticated } = useAppSelector((state: any) => state.auth);
useEffect(() => {
const loadUserFromStorage = async () => {
try {
const userData: any = await getUserFromStorage();
if (userData) {
dispatch(setToken(userData.token));
dispatch(setUser(userData.data));
}
} catch (error) {
console.error('❌ Erreur lors du chargement utilisateur:', error);
}
};
loadUserFromStorage().then();
}, [dispatch]);
const handleLogout = () => {
dispatch(logout());
clearUserFromStorage().then();
};
return {
user,
token,
isAuthenticated,
logout: handleLogout,
};
};
const getUserFromStorage = async (): Promise<StorageUser | null> => {
try {
const userString = await AsyncStorage.getItem('currentUser');
return userString ? JSON.parse(userString) : null;
} catch (error) {
console.error('Erreur lecture storage:', error);
return null;
}
};
const clearUserFromStorage = async () => {
try {
await AsyncStorage.removeItem('currentUser');
} catch (error) {
console.error('Erreur nettoyage storage:', error);
}
};
`;
fs.writeFileSync(path.join(hooksPath, 'useAuthUser.ts'), content);
console.log(`🔐 Hook useAuthUser généré dans src/hooks/useAuthUser.ts`);
};