ÿØÿà JFIF ` ` ÿþ
|
Server : Apache System : Linux cloud.heroica.com.br 4.18.0-553.36.1.el8_10.x86_64 #1 SMP Wed Jan 22 03:07:54 EST 2025 x86_64 User : farolpborg ( 1053) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /var/www/node_services/sebrae_test_admin/src/contexts/ |
Upload File : |
import React, { createContext, useState, useEffect, type ReactNode } from 'react';
import {destroyCookie , setCookie , parseCookies} from 'nookies';
import router from "../routes";
import setupapi from '../utils/setupApi.ts';
// Define user interface
interface User {
id: string;
email: string;
name: string;
role: string;
active: boolean;
createdAt?: string;
updatedAt?: string;
cpf?: string;
telefone?: string;
sexo?: string;
datanasc?: string;
escolaridade?: string;
possuinomesocial?: boolean;
nomesocial?: string;
}
// Define registration data interface
interface RegisterData {
email: string;
name: string;
password: string;
role?: string;
active?: boolean;
cpf?: string;
telefone?: string;
sexo?: string;
datanasc?: string;
escolaridade?: string;
possuinomesocial?: boolean;
nomesocial?: string;
}
// Define login data interface
interface LoginData {
cpf: string;
password: string;
}
// Define update user data interface
interface UpdateUserData {
email?: string;
name?: string;
role?: string;
active?: boolean;
}
// Define context interface
interface UserContextType {
user: User | null;
loading: boolean;
error: string | null;
login: (data: LoginData) => Promise<void>;
register: (data: RegisterData) => Promise<void>;
updateUser: (id: string, data: UpdateUserData) => Promise<void>;
deleteUser: (id: string) => Promise<void>;
logout: () => void;
isAuthenticated:boolean
}
// Create context with default values
const UserContext = createContext<UserContextType>({
user: null,
loading: false,
error: null,
login: async () => {},
register: async () => {},
updateUser: async () => {},
deleteUser: async () => {},
logout: () => {},
isAuthenticated:false
});
export const logout = async() => {
localStorage.removeItem('@sebraeappvisita.user');
localStorage.removeItem('@sebraeappvisita.token');
destroyCookie(undefined,'@sebraeappvisita.token');
await router.navigate('/login');
};
// Define provider props
interface UserProviderProps {
children: ReactNode;
}
// API base URL
export const api = setupapi();
export const UserProvider: React.FC<UserProviderProps> = ({ children }) => {
const [user, setUser] = useState<User | null>(null);
const [loading, setLoading] = useState<boolean>(false);
const [error, setError] = useState<string | null>(null);
// Check for stored user on mount
useEffect(() => {
const {'@sebraeappvisita.token':token} = parseCookies();
const storedUser = localStorage.getItem('@sebraeappvisita.user');
if (token && storedUser) {
try {
setUser(JSON.parse(storedUser));
} catch (err) {
console.error('Error parsing stored user:', err);
localStorage.removeItem('@sebraeappvisita.user');
}
}
}, []);
const isAuthenticated = (user != null)
// Login function
const login = async (data: LoginData) => {
setLoading(true);
setError(null);
try {
await api.post(`/user/login` ,
{
cpf: data.cpf,
password: data.password
}).then((response)=>{
const userresponse = response.data;
if (userresponse) {
setUser({
id: userresponse.id,
email: userresponse.email,
name: userresponse.name,
role: userresponse.role,
active: userresponse.active,
createdAt: userresponse.createdAt,
updatedAt: userresponse.updatedAt,
});
localStorage.setItem('@sebraeappvisita.user', JSON.stringify({
id: userresponse.id,
email: userresponse.email,
name: userresponse.name,
role: userresponse.role,
active: userresponse.active,
createdAt: userresponse.createdAt,
updatedAt: userresponse.updatedAt,
}));
localStorage.setItem('@sebraeappvisita.token', userresponse.token);
console.log('Login successful:', userresponse);
setCookie(undefined,'@sebraeappvisita.token' ,userresponse.token , {
maxAge:60*60*24*30,
path:'/'
});
api.defaults.headers['Authorization'] = `Bearer ${userresponse.token}`;
} else {
throw new Error('Invalid username or password');
}
}).catch((err)=>{
console.log('Login error:', err);
throw new Error('Invalid username or password');
});
} catch (err) {
console.log('Login error:', err);
setError(err instanceof Error ? err.message : 'Failed to login');
throw new Error('Invalid username or password');
} finally {
setLoading(false);
}
};
// Register function
const register = async (data: RegisterData) => {
setLoading(true);
setError(null);
try {
await api.post(`/user`, data);
// Optionally auto-login after registration
} catch (err: any) {
console.error('Registration error:', err);
setError(err.response?.data?.error || 'Failed to register');
} finally {
setLoading(false);
}
};
// Update user function
const updateUser = async (id: string, data: UpdateUserData) => {
setLoading(true);
setError(null);
try {
const response = await api.put(`/users/${id}`, data);
// If updating the current user, update the state and localStorage
if (user && user.id === id) {
setUser(response.data);
localStorage.setItem('@sebraeappvisita.user', JSON.stringify(response.data));
}
return response.data;
} catch (err: any) {
console.error('Update user error:', err);
setError(err.response?.data?.error || 'Failed to update user');
throw err;
} finally {
setLoading(false);
}
};
// Delete user function
const deleteUser = async (id: string) => {
setLoading(true);
setError(null);
try {
await api.delete(`/users/${id}`);
// If deleting the current user, log them out
if (user && user.id === id) {
logout();
}
} catch (err: any) {
console.error('Delete user error:', err);
setError(err.response?.data?.error || 'Failed to delete user');
throw err;
} finally {
setLoading(false);
}
};
// Logout function
return (
<UserContext.Provider
value={{
user,
loading,
error,
login,
register,
updateUser,
deleteUser,
logout,
isAuthenticated
}}
>
{children}
</UserContext.Provider>
);
};
// Custom hook for using the user context
export default UserContext;