feat: новая функция

This commit is contained in:
2025-11-12 13:38:12 +03:00
parent 44876c0bc2
commit f23307ded5
11 changed files with 1223 additions and 74 deletions

View File

@@ -12,45 +12,23 @@
import { ref, provide, inject } from 'vue';
import api from '../api/axios';
import { getFromStorage, setToStorage } from '../utils/storage';
// === SINGLETON STATE ===
const footerDle = ref(null);
const isLoading = ref(false);
const selectedDleAddress = ref(null);
// Загрузка адреса выбранного DLE из localStorage при инициализации
function loadSavedDleAddress() {
try {
const savedAddress = getFromStorage('footerDleAddress', null);
if (savedAddress) {
selectedDleAddress.value = savedAddress;
// Загружаем актуальные данные из блокчейна
loadDleFromBlockchain(savedAddress).then((loadedDle) => {
if (loadedDle) {
footerDle.value = loadedDle;
}
});
}
} catch (error) {
console.warn('[useFooterDle] Ошибка при загрузке адреса из localStorage:', error);
}
}
// Инициализация при загрузке модуля
loadSavedDleAddress();
// === API ===
/**
* Загружает данные DLE из блокчейна по адресу
*/
async function loadDleFromBlockchain(dleAddress) {
async function loadDleFromBlockchain(dleAddress, chainId = null) {
try {
isLoading.value = true;
const response = await api.post('/blockchain/read-dle-info', {
dleAddress: dleAddress
});
const payload = { dleAddress };
if (chainId !== undefined && chainId !== null) {
payload.chainId = chainId;
}
const response = await api.post('/blockchain/read-dle-info', payload);
if (response.data.success) {
const blockchainData = response.data.data;
@@ -58,79 +36,102 @@ async function loadDleFromBlockchain(dleAddress) {
address: dleAddress,
name: blockchainData.name || '',
symbol: blockchainData.symbol || '',
logoURI: blockchainData.logoURI || ''
logoURI: blockchainData.logoURI || '',
chainId: blockchainData.currentChainId ?? chainId ?? null
};
}
return null;
} catch (error) {
console.error('[useFooterDle] Ошибка при загрузке DLE из блокчейна:', error);
return null;
}
}
/**
* Загружает текущее значение футера из backend
*/
async function fetchFooterSelection() {
try {
isLoading.value = true;
const response = await api.get('/settings/footer-dle');
const selection = response.data?.data || null;
if (selection && selection.address) {
selectedDleAddress.value = selection.address;
const loadedDle = await loadDleFromBlockchain(selection.address, selection.chainId ?? null);
if (loadedDle) {
footerDle.value = loadedDle;
} else {
footerDle.value = {
address: selection.address,
name: '',
symbol: '',
logoURI: '',
chainId: selection.chainId ?? null
};
}
} else {
selectedDleAddress.value = null;
footerDle.value = null;
}
} catch (error) {
console.error('[useFooterDle] Ошибка при получении footer DLE с backend:', error);
} finally {
isLoading.value = false;
}
}
/**
* Устанавливает выбранный DLE для отображения в футере
* Сохраняет только адрес, данные всегда загружаются из блокчейна
* Устанавливает выбранный DLE для отображения в футере через backend
* @param {string} dleAddress - Адрес DLE
*/
async function setFooterDle(dleAddress) {
async function setFooterDle(dleAddress, chainId = null) {
if (!dleAddress) {
footerDle.value = null;
selectedDleAddress.value = null;
// Удаляем из localStorage
try {
setToStorage('footerDleAddress', null);
} catch (error) {
console.warn('[useFooterDle] Ошибка при удалении из localStorage:', error);
}
return;
return clearFooterDle();
}
// Сохраняем только адрес
selectedDleAddress.value = dleAddress;
setToStorage('footerDleAddress', dleAddress);
// Всегда загружаем актуальные данные из блокчейна
const loadedDle = await loadDleFromBlockchain(dleAddress);
if (loadedDle) {
footerDle.value = loadedDle;
} else {
// Если не удалось загрузить, очищаем состояние
footerDle.value = null;
try {
isLoading.value = true;
await api.post('/settings/footer-dle', {
dleAddress,
chainId: chainId ?? null
});
await fetchFooterSelection();
} catch (error) {
console.error('[useFooterDle] Ошибка при сохранении footer DLE:', error);
throw error;
} finally {
isLoading.value = false;
}
}
/**
* Обновляет данные выбранного DLE из блокчейна
* Используется для периодического обновления или при необходимости
* Обновляет данные выбранного DLE, синхронизируя их с backend и блокчейном
*/
async function refreshFooterDle() {
if (!selectedDleAddress.value) {
return;
}
const loadedDle = await loadDleFromBlockchain(selectedDleAddress.value);
if (loadedDle) {
footerDle.value = loadedDle;
}
await fetchFooterSelection();
}
/**
* Очищает выбранный DLE
*/
function clearFooterDle() {
footerDle.value = null;
selectedDleAddress.value = null;
// Удаляем адрес из localStorage
async function clearFooterDle() {
try {
setToStorage('footerDleAddress', null);
isLoading.value = true;
await api.delete('/settings/footer-dle');
await fetchFooterSelection();
} catch (error) {
console.warn('[useFooterDle] Ошибка при очистке localStorage:', error);
console.error('[useFooterDle] Ошибка при очистке footer DLE:', error);
throw error;
} finally {
isLoading.value = false;
}
}
// Первичная загрузка при инициализации
fetchFooterSelection();
// === SINGLETON API ===
const footerDleApi = {
footerDle,