nyipyatki/frontend/src/utils/fetchUser.tsx
2025-11-02 01:15:02 +02:00

163 lines
6.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { useCookies } from 'react-cookie';
import { API_URL } from '../constants/constants';
import { hashPassword } from './hashPassword';
const useFetchUser = () => {
const [apiCookie, setApiCookie] = useCookies(['apiToken']);
const [, setUserNameCookie] = useCookies(['userName'])
const userSet = async (userName: string): Promise<boolean> => {
try {
const response = await fetch(`${API_URL}/users/isSet?userName=${encodeURIComponent(userName)}`);
if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
const data = await response.json();
return data; // Assuming the server returns true/false
} catch (error) {
console.error('Error checking user password status:', error);
return false;
}
};
const passwordCreate = async (userName: string, password: string): Promise<string> => {
// Simple validation: password should not be empty and should have a minimum length
if (!password || password.length < 6) {
console.error('Password should be at least 6 characters long.');
return 'Пароль должен иметь, как минимум 6 символов';
}
try {
const hashedPassword = hashPassword(password)
const response = await fetch(`${API_URL}/users/createPassword`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
userName,
password: hashedPassword,
}),
});
if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
const data = await response.json();
if (data.success) {
setApiCookie('apiToken', data.token, { path: '/' });
console.log(`Password created for ${userName}`);
return ''; // Password creation success
}
return 'Не удалось создать пароль'; // Password creation failure
} catch (error) {
console.error('Error creating password:', error);
return 'Пароль не создан:' + error;
}
};
const signUser = async (userName: string, password: string): Promise<boolean> => {
try {
const hashedPassword = hashPassword(password); // Implement this function to hash the password
const response = await fetch(`${API_URL}/login`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
userName,
password: hashedPassword,
}),
});
if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
const data = await response.json();
if (data.token) {
setApiCookie('apiToken', data.token, { path: '/' });
console.log(`User ${userName} signed in.`);
return true; // Sign-in success
}
return false; // Sign-in failed
} catch (error) {
console.error('Error logging in:', error);
return false;
}
};
const validToken = async (token: string | undefined): Promise<boolean> => {
try {
const response = await fetch(`${API_URL}/login/validateToken`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
token
}),
});
if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
const data = await response.json();
if (!data.userName) throw new Error(`Could not retrieve userName from token`);
setUserNameCookie('userName', data.userName, { path: '/' });
return data.tokenValid
} catch (error) {
console.error('Error validating token:', error);
return false;
}
}
const updateAttendance = async (attendanceStatus: boolean): Promise<boolean> => {
const token = apiCookie.apiToken
try {
const response = await fetch(`${API_URL}/users/attendance`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
token,
attendance: attendanceStatus,
}),
});
if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
const data = await response.json();
if (!data.success) throw new Error(data.message);
return true; // Attendance updated successfully
} catch (error) {
console.error('Error updating attendance:', error);
return false; // Attendance update failed
}
}
const getAttendance = async (): Promise<boolean | null> => {
const token = apiCookie.apiToken
try {
const response = await fetch(`${API_URL}/users/attendance?token=${encodeURIComponent(token)}`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
}
});
if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
const data = await response.json();
if (!data.success) throw new Error(data.message);
return data.attendance; // Returns attendance status (true/false)
} catch (error) {
console.error('Error retrieving attendance:', error);
return null; // In case of error or if attendance status is not found
}
}
return { userSet, passwordCreate, signUser, validToken, updateAttendance, getAttendance };
};
export default useFetchUser;