Compare commits

...

3 Commits

Author SHA1 Message Date
DmitriyA 69a5e4ade1 sidebar menu improvement 2025-06-10 09:29:14 -04:00
Vladislav Drozdov 5bf3124fd4 Merge pull request 'redisign' (#44) from redisign into rc
test-org/trust-module-frontend/pipeline/pr-main Build succeeded
Reviewed-on: http://git.enode/deployer3000/trust-module-frontend/pulls/44
Reviewed-by: Vladislav Drozdov <ya2@ya.ru>
2025-06-06 14:38:39 +03:00
Vladislav Drozdov fa32e75b5a Merge pull request 'redisign' (#42) from redisign into rc
test-org/trust-module-frontend/pipeline/pr-main Build succeeded
Reviewed-on: http://git.enode/deployer3000/trust-module-frontend/pulls/42
Reviewed-by: Vladislav Drozdov <ya2@ya.ru>
2025-06-03 13:09:36 +03:00
1 changed files with 74 additions and 2 deletions

View File

@ -5,16 +5,54 @@ import axios from 'axios';
const SidebarMenuWrapper = ({ isDarkMode, setIsDarkMode, onMenuSelect }) => { const SidebarMenuWrapper = ({ isDarkMode, setIsDarkMode, onMenuSelect }) => {
const [menuData, setMenuData] = useState(null); const [menuData, setMenuData] = useState(null);
const [lastModified, setLastModified] = useState(null);
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
const [error, setError] = useState(null); const [error, setError] = useState(null);
const [editingItem, setEditingItem] = useState(null); const [editingItem, setEditingItem] = useState(null);
const [editModalOpen, setEditModalOpen] = useState(false); const [editModalOpen, setEditModalOpen] = useState(false);
const [backgroundLoading, setBackgroundLoading] = useState(false);
// Загружаем меню из localStorage при инициализации
useEffect(() => {
const loadCachedMenu = () => {
try {
const cached = localStorage.getItem('menuCache');
if (cached) {
const { data, timestamp } = JSON.parse(cached);
setMenuData(data);
setLastModified(timestamp);
}
} catch (e) {
console.warn('Failed to load menu from cache', e);
}
};
loadCachedMenu();
}, []);
// Основная загрузка меню
useEffect(() => { useEffect(() => {
const fetchMenuData = async () => { const fetchMenuData = async () => {
try { try {
const response = await axios.get(`${import.meta.env.VITE_BACK_URL}/api/menu/full`); setLoading(true);
setMenuData(response.data); // axios хранит данные в response.data const headers = lastModified ? { 'If-Modified-Since': lastModified } : {};
const response = await axios.get(`${import.meta.env.VITE_BACK_URL}/api/menu/full`, {
headers,
validateStatus: status => status === 200 || status === 304
});
if (response.status === 200) {
const newLastModified = response.headers['last-modified'];
setMenuData(response.data);
setLastModified(newLastModified);
// Сохраняем в кэш
localStorage.setItem('menuCache', JSON.stringify({
data: response.data,
timestamp: newLastModified
}));
}
} catch (err) { } catch (err) {
console.error('Error fetching menu data:', err); console.error('Error fetching menu data:', err);
setError(err.message || 'Failed to fetch menu data'); setError(err.message || 'Failed to fetch menu data');
@ -26,6 +64,40 @@ const SidebarMenuWrapper = ({ isDarkMode, setIsDarkMode, onMenuSelect }) => {
fetchMenuData(); fetchMenuData();
}, []); }, []);
// Фоновая проверка обновлений
useEffect(() => {
if (!lastModified) return;
const checkForUpdates = async () => {
try {
setBackgroundLoading(true);
const response = await axios.get(`${import.meta.env.VITE_BACK_URL}/api/menu/check-updates`, {
headers: { 'If-Modified-Since': lastModified }
});
if (response.data.hasUpdates) {
// Если есть обновления, загружаем их в фоне
const updateResponse = await axios.get(`${import.meta.env.VITE_BACK_URL}/api/menu/full`);
setMenuData(updateResponse.data);
setLastModified(updateResponse.headers['last-modified']);
localStorage.setItem('menuCache', JSON.stringify({
data: updateResponse.data,
timestamp: updateResponse.headers['last-modified']
}));
}
} catch (err) {
console.warn('Background update check failed', err);
} finally {
setBackgroundLoading(false);
}
};
// Проверяем обновления каждые 5 минут
const interval = setInterval(checkForUpdates, 5 * 60 * 1000);
return () => clearInterval(interval);
}, [lastModified]);
const handleSaveChanges = async (updatedItem) => { const handleSaveChanges = async (updatedItem) => {
try { try {
const response = await axios.put( const response = await axios.put(