ваше сообщение коммита
This commit is contained in:
@@ -74,14 +74,14 @@
|
||||
isLoadingTokens.value = true;
|
||||
try {
|
||||
const walletAddress = getIdentityValue('wallet');
|
||||
console.log('[App] Обновление балансов для адреса:', walletAddress);
|
||||
// console.log('[App] Обновление балансов для адреса:', walletAddress);
|
||||
|
||||
const balances = await fetchTokenBalances(walletAddress);
|
||||
console.log('[App] Полученные балансы:', balances);
|
||||
// console.log('[App] Полученные балансы:', balances);
|
||||
|
||||
tokenBalances.value = balances || {};
|
||||
} catch (error) {
|
||||
console.error('[App] Ошибка при получении балансов:', error);
|
||||
// console.error('[App] Ошибка при получении балансов:', error);
|
||||
tokenBalances.value = {};
|
||||
} finally {
|
||||
isLoadingTokens.value = false;
|
||||
@@ -96,11 +96,11 @@
|
||||
const oldWalletId = oldWalletIdentity ? oldWalletIdentity.provider_id : null;
|
||||
|
||||
if (newWalletId !== oldWalletId) {
|
||||
console.log('[App] Обнаружено изменение идентификатора кошелька, обновляем балансы');
|
||||
// console.log('[App] Обнаружено изменение идентификатора кошелька, обновляем балансы');
|
||||
refreshTokenBalances();
|
||||
} else if (hasIdentityType('wallet') && Object.keys(tokenBalances.value).length === 0 && !isLoadingTokens.value) {
|
||||
// Если кошелек есть, но баланс пустой и не грузится - пробуем загрузить
|
||||
console.log('[App] Кошелек есть, но баланс пуст, пытаемся загрузить.');
|
||||
// console.log('[App] Кошелек есть, но баланс пуст, пытаемся загрузить.');
|
||||
refreshTokenBalances();
|
||||
}
|
||||
}
|
||||
@@ -108,7 +108,7 @@
|
||||
|
||||
// Мониторинг изменений состояния аутентификации
|
||||
watch(auth.isAuthenticated, (isAuth) => {
|
||||
console.log('[App] Состояние аутентификации изменилось:', isAuth);
|
||||
// console.log('[App] Состояние аутентификации изменилось:', isAuth);
|
||||
if (isAuth) {
|
||||
// Убираем задержку, полагаемся на watch(identities) или прямо вызываем
|
||||
// setTimeout(refreshTokenBalances, 500);
|
||||
@@ -121,16 +121,16 @@
|
||||
|
||||
// --- Возвращаем и улучшаем функцию-обработчик ---
|
||||
const handleAuthActionCompleted = async () => {
|
||||
console.log('[App] Auth action completed, triggering updates...');
|
||||
// console.log('[App] Auth action completed, triggering updates...');
|
||||
isLoading.value = true; // Показываем индикатор загрузки
|
||||
try {
|
||||
// 1. Проверяем аутентификацию (обновит identities и isAuthenticated)
|
||||
await auth.checkAuth();
|
||||
console.log('[App] auth.checkAuth() completed. isAuthenticated:', auth.isAuthenticated.value);
|
||||
// console.log('[App] auth.checkAuth() completed. isAuthenticated:', auth.isAuthenticated.value);
|
||||
|
||||
// 2. Обновляем баланс (использует обновленные identities)
|
||||
await refreshTokenBalances();
|
||||
console.log('[App] refreshTokenBalances() completed.');
|
||||
// console.log('[App] refreshTokenBalances() completed.');
|
||||
|
||||
// 3. Явно оповещаем компоненты об изменении состояния авторизации
|
||||
// Передаем актуальное состояние из useAuth
|
||||
@@ -140,10 +140,10 @@
|
||||
userId: auth.userId.value, // Предполагаем, что userId есть в useAuth
|
||||
fromApp: true // Флаг, что событие от App.vue
|
||||
});
|
||||
console.log('[App] auth-state-changed event emitted.');
|
||||
// console.log('[App] auth-state-changed event emitted.');
|
||||
|
||||
} catch (error) {
|
||||
console.error("[App] Error during auth action handling:", error);
|
||||
// console.error("[App] Error during auth action handling:", error);
|
||||
} finally {
|
||||
isLoading.value = false; // Скрываем индикатор загрузки
|
||||
}
|
||||
@@ -157,7 +157,7 @@
|
||||
|
||||
// Подписываемся на событие изменения настроек аутентификации
|
||||
const unsubscribe = eventBus.on('auth-settings-saved', () => {
|
||||
console.log('[App] Получено событие сохранения настроек аутентификации, обновляем балансы');
|
||||
// console.log('[App] Получено событие сохранения настроек аутентификации, обновляем балансы');
|
||||
if (auth.isAuthenticated.value) {
|
||||
refreshTokenBalances();
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@ api.interceptors.response.use(
|
||||
// Проверяем, что ответ действительно JSON
|
||||
if (response.headers['content-type'] &&
|
||||
!response.headers['content-type'].includes('application/json')) {
|
||||
console.warn('Server returned non-JSON response:', response.headers['content-type']);
|
||||
// console.warn('Server returned non-JSON response:', response.headers['content-type']);
|
||||
// Если это HTML, значит, запрос ушёл не туда
|
||||
if (response.headers['content-type'].includes('text/html')) {
|
||||
throw new Error('Server returned HTML instead of JSON. Check API endpoint.');
|
||||
@@ -50,7 +50,7 @@ api.interceptors.response.use(
|
||||
if (error.response && error.response.data &&
|
||||
typeof error.response.data === 'string' &&
|
||||
error.response.data.includes('<!DOCTYPE')) {
|
||||
console.error('API Error: Server returned HTML instead of JSON');
|
||||
// console.error('API Error: Server returned HTML instead of JSON');
|
||||
error.message = 'Ошибка: сервер вернул HTML вместо JSON. Проверьте подключение к API.';
|
||||
}
|
||||
return Promise.reject(error);
|
||||
@@ -65,7 +65,7 @@ const sendGuestMessageToServer = async (messageText) => {
|
||||
// language: userLanguage.value, // TODO: Реализовать получение языка пользователя
|
||||
}, { withCredentials: true });
|
||||
} catch (error) {
|
||||
console.error('Ошибка при отправке гостевого сообщения на сервер:', error);
|
||||
// console.error('Ошибка при отправке гостевого сообщения на сервер:', error);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -193,7 +193,7 @@ export default {
|
||||
stats.value = response.data.data
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error fetching queue stats:', error)
|
||||
// console.error('Error fetching queue stats:', error)
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
@@ -210,7 +210,7 @@ export default {
|
||||
await fetchStats()
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`Error controlling queue (${action}):`, error)
|
||||
// console.error(`Error controlling queue (${action}):`, error)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -81,7 +81,7 @@ const emit = defineEmits(['auth-action-completed']);
|
||||
|
||||
// Callback после успешной аутентификации/привязки через Email/Telegram
|
||||
const handleAuthFlowSuccess = (authType) => {
|
||||
console.log(`[BaseLayout] Auth flow success: ${authType}`);
|
||||
// console.log(`[BaseLayout] Auth flow success: ${authType}`);
|
||||
// Отправляем событие для обновления данных на страницах
|
||||
eventBus.emit('auth-success', { authType });
|
||||
};
|
||||
@@ -116,7 +116,7 @@ const handleWalletAuth = async () => {
|
||||
isConnectingWallet.value = true;
|
||||
try {
|
||||
const result = await connectWithWallet();
|
||||
console.log('[BaseLayout] Результат подключения кошелька:', result);
|
||||
// console.log('[BaseLayout] Результат подключения кошелька:', result);
|
||||
|
||||
if (result.success) {
|
||||
if (auth.isAuthenticated.value) {
|
||||
@@ -132,7 +132,7 @@ const handleWalletAuth = async () => {
|
||||
// Новая аутентификация через кошелек
|
||||
const authResponse = await auth.checkAuth();
|
||||
if (authResponse.authenticated && authResponse.authType === 'wallet') {
|
||||
console.log('[BaseLayout] Кошелёк успешно подключен и аутентифицирован');
|
||||
// console.log('[BaseLayout] Кошелёк успешно подключен и аутентифицирован');
|
||||
showSuccessMessage('Кошелёк успешно подключен!');
|
||||
emit('auth-action-completed');
|
||||
} else {
|
||||
@@ -140,11 +140,11 @@ const handleWalletAuth = async () => {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
console.error('[BaseLayout] Не удалось подключить кошелёк:', result.error);
|
||||
// console.error('[BaseLayout] Не удалось подключить кошелёк:', result.error);
|
||||
showErrorMessage(result.error || 'Не удалось подключить кошелёк');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('[BaseLayout] Ошибка при подключении кошелька:', error);
|
||||
// console.error('[BaseLayout] Ошибка при подключении кошелька:', error);
|
||||
showErrorMessage('Произошла ошибка при подключении кошелька');
|
||||
} finally {
|
||||
isConnectingWallet.value = false;
|
||||
@@ -155,7 +155,7 @@ const handleWalletAuth = async () => {
|
||||
* Выполняет выход из аккаунта
|
||||
*/
|
||||
const disconnectWallet = async () => {
|
||||
console.log('[BaseLayout] Выполняется выход из системы...');
|
||||
// console.log('[BaseLayout] Выполняется выход из системы...');
|
||||
try {
|
||||
await api.post('/auth/logout');
|
||||
showSuccessMessage('Вы успешно вышли из системы');
|
||||
@@ -163,7 +163,7 @@ const disconnectWallet = async () => {
|
||||
removeFromStorage('hasUserSentMessage');
|
||||
emit('auth-action-completed');
|
||||
} catch (error) {
|
||||
console.error('[BaseLayout] Ошибка при выходе из системы:', error);
|
||||
// console.error('[BaseLayout] Ошибка при выходе из системы:', error);
|
||||
showErrorMessage('Произошла ошибка при выходе из системы');
|
||||
}
|
||||
};
|
||||
@@ -181,7 +181,7 @@ const toggleWalletSidebar = () => {
|
||||
// =====================================================================
|
||||
|
||||
onMounted(() => {
|
||||
console.log('[BaseLayout] Компонент загружен');
|
||||
// console.log('[BaseLayout] Компонент загружен');
|
||||
|
||||
// Загружаем сохраненное состояние боковой панели
|
||||
const savedSidebarState = getFromStorage('showWalletSidebar');
|
||||
|
||||
@@ -166,26 +166,26 @@ const videoStream = ref(null);
|
||||
const recordedAudioChunks = ref([]);
|
||||
const recordedVideoChunks = ref([]);
|
||||
|
||||
const startAudioRecording = async () => {
|
||||
console.log('[ChatInterface] startAudioRecording called');
|
||||
const startAudioRecording = async () => {
|
||||
// console.log('[ChatInterface] startAudioRecording called');
|
||||
try {
|
||||
if (isAudioRecording.value) return;
|
||||
audioStream.value = await navigator.mediaDevices.getUserMedia({ audio: true });
|
||||
console.log('[ChatInterface] Got audio stream:', audioStream.value);
|
||||
// console.log('[ChatInterface] Got audio stream:', audioStream.value);
|
||||
recordedAudioChunks.value = [];
|
||||
audioRecorder.value = new MediaRecorder(audioStream.value);
|
||||
audioRecorder.value.ondataavailable = (event) => {
|
||||
console.log('[ChatInterface] audioRecorder.ondataavailable fired');
|
||||
// console.log('[ChatInterface] audioRecorder.ondataavailable fired');
|
||||
if (event.data.size > 0) recordedAudioChunks.value.push(event.data);
|
||||
};
|
||||
audioRecorder.value.onstop = () => {
|
||||
console.log('[ChatInterface] audioRecorder.onstop fired');
|
||||
// console.log('[ChatInterface] audioRecorder.onstop fired');
|
||||
setTimeout(() => {
|
||||
if (recordedAudioChunks.value.length === 0) {
|
||||
console.warn('[ChatInterface] No audio chunks recorded.');
|
||||
// console.warn('[ChatInterface] No audio chunks recorded.');
|
||||
return;
|
||||
}
|
||||
console.log(`[ChatInterface] Creating audio Blob from ${recordedAudioChunks.value.length} chunks.`);
|
||||
// console.log(`[ChatInterface] Creating audio Blob from ${recordedAudioChunks.value.length} chunks.`);
|
||||
const audioBlob = new Blob(recordedAudioChunks.value, { type: 'audio/webm' });
|
||||
const audioFile = new File([audioBlob], `audio-${Date.now()}.webm`, { type: 'audio/webm' });
|
||||
addAttachment(audioFile);
|
||||
@@ -194,64 +194,64 @@ const startAudioRecording = async () => {
|
||||
};
|
||||
audioRecorder.value.start();
|
||||
isAudioRecording.value = true;
|
||||
console.log('[ChatInterface] Audio recording started, recorder state:', audioRecorder.value.state);
|
||||
// console.log('[ChatInterface] Audio recording started, recorder state:', audioRecorder.value.state);
|
||||
} catch (error) {
|
||||
console.error('[ChatInterface] Error starting audio recording:', error);
|
||||
// console.error('[ChatInterface] Error starting audio recording:', error);
|
||||
}
|
||||
};
|
||||
|
||||
const stopAudioRecording = async () => {
|
||||
console.log('[ChatInterface] stopAudioRecording called');
|
||||
// console.log('[ChatInterface] stopAudioRecording called');
|
||||
if (!isAudioRecording.value || !audioRecorder.value || audioRecorder.value.state === 'inactive') {
|
||||
console.log('[ChatInterface] stopAudioRecording: Not recording or recorder inactive, state:', audioRecorder.value?.state);
|
||||
// console.log('[ChatInterface] stopAudioRecording: Not recording or recorder inactive, state:', audioRecorder.value?.state);
|
||||
return;
|
||||
}
|
||||
try {
|
||||
audioRecorder.value.stop();
|
||||
console.log('[ChatInterface] audioRecorder.stop() called');
|
||||
// console.log('[ChatInterface] audioRecorder.stop() called');
|
||||
isAudioRecording.value = false;
|
||||
if (audioStream.value) {
|
||||
audioStream.value.getTracks().forEach(track => track.stop());
|
||||
console.log('[ChatInterface] Audio stream tracks stopped.');
|
||||
// console.log('[ChatInterface] Audio stream tracks stopped.');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('[ChatInterface] Error stopping audio recording:', error);
|
||||
// console.error('[ChatInterface] Error stopping audio recording:', error);
|
||||
isAudioRecording.value = false;
|
||||
if (audioStream.value) audioStream.value.getTracks().forEach(track => track.stop());
|
||||
}
|
||||
};
|
||||
|
||||
const startVideoRecording = async () => {
|
||||
console.log('[ChatInterface] startVideoRecording called');
|
||||
// console.log('[ChatInterface] startVideoRecording called');
|
||||
try {
|
||||
if (isVideoRecording.value) return;
|
||||
videoStream.value = await navigator.mediaDevices.getUserMedia({ video: true, audio: true });
|
||||
console.log('[ChatInterface] Got video stream:', videoStream.value);
|
||||
// console.log('[ChatInterface] Got video stream:', videoStream.value);
|
||||
recordedVideoChunks.value = [];
|
||||
let options = { mimeType: 'video/webm;codecs=vp9,opus' };
|
||||
if (!MediaRecorder.isTypeSupported(options.mimeType)) {
|
||||
console.warn(`MIME type ${options.mimeType} not supported, trying video/webm...`);
|
||||
// console.warn(`MIME type ${options.mimeType} not supported, trying video/webm...`);
|
||||
options = { mimeType: 'video/webm' };
|
||||
if (!MediaRecorder.isTypeSupported(options.mimeType)) {
|
||||
console.warn(`MIME type ${options.mimeType} not supported, using default.`);
|
||||
// console.warn(`MIME type ${options.mimeType} not supported, using default.`);
|
||||
options = {};
|
||||
}
|
||||
}
|
||||
console.log('[ChatInterface] Using MediaRecorder options:', options);
|
||||
// console.log('[ChatInterface] Using MediaRecorder options:', options);
|
||||
videoRecorder.value = new MediaRecorder(videoStream.value, options);
|
||||
|
||||
videoRecorder.value.ondataavailable = (event) => {
|
||||
console.log('[ChatInterface] videoRecorder.ondataavailable fired');
|
||||
// console.log('[ChatInterface] videoRecorder.ondataavailable fired');
|
||||
if (event.data.size > 0) recordedVideoChunks.value.push(event.data);
|
||||
};
|
||||
videoRecorder.value.onstop = () => {
|
||||
console.log('[ChatInterface] videoRecorder.onstop fired');
|
||||
// console.log('[ChatInterface] videoRecorder.onstop fired');
|
||||
setTimeout(() => {
|
||||
if (recordedVideoChunks.value.length === 0) {
|
||||
console.warn('[ChatInterface] No video chunks recorded.');
|
||||
// console.warn('[ChatInterface] No video chunks recorded.');
|
||||
return;
|
||||
}
|
||||
console.log(`[ChatInterface] Creating video Blob from ${recordedVideoChunks.value.length} chunks.`);
|
||||
// console.log(`[ChatInterface] Creating video Blob from ${recordedVideoChunks.value.length} chunks.`);
|
||||
const videoBlob = new Blob(recordedVideoChunks.value, { type: videoRecorder.value.mimeType || 'video/webm' });
|
||||
const videoFile = new File([videoBlob], `video-${Date.now()}.webm`, { type: videoRecorder.value.mimeType || 'video/webm' });
|
||||
addAttachment(videoFile);
|
||||
@@ -260,28 +260,28 @@ const startVideoRecording = async () => {
|
||||
};
|
||||
videoRecorder.value.start();
|
||||
isVideoRecording.value = true;
|
||||
console.log('[ChatInterface] Video recording started, recorder state:', videoRecorder.value.state);
|
||||
// console.log('[ChatInterface] Video recording started, recorder state:', videoRecorder.value.state);
|
||||
} catch (error) {
|
||||
console.error('[ChatInterface] Error starting video recording:', error);
|
||||
// console.error('[ChatInterface] Error starting video recording:', error);
|
||||
}
|
||||
};
|
||||
|
||||
const stopVideoRecording = async () => {
|
||||
console.log('[ChatInterface] stopVideoRecording called');
|
||||
// console.log('[ChatInterface] stopVideoRecording called');
|
||||
if (!isVideoRecording.value || !videoRecorder.value || videoRecorder.value.state === 'inactive') {
|
||||
console.log('[ChatInterface] stopVideoRecording: Not recording or recorder inactive, state:', videoRecorder.value?.state);
|
||||
// console.log('[ChatInterface] stopVideoRecording: Not recording or recorder inactive, state:', videoRecorder.value?.state);
|
||||
return;
|
||||
}
|
||||
try {
|
||||
videoRecorder.value.stop();
|
||||
console.log('[ChatInterface] videoRecorder.stop() called');
|
||||
// console.log('[ChatInterface] videoRecorder.stop() called');
|
||||
isVideoRecording.value = false;
|
||||
if (videoStream.value) {
|
||||
videoStream.value.getTracks().forEach(track => track.stop());
|
||||
console.log('[ChatInterface] Video stream tracks stopped.');
|
||||
// console.log('[ChatInterface] Video stream tracks stopped.');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('[ChatInterface] Error stopping video recording:', error);
|
||||
// console.error('[ChatInterface] Error stopping video recording:', error);
|
||||
isVideoRecording.value = false;
|
||||
if (videoStream.value) videoStream.value.getTracks().forEach(track => track.stop());
|
||||
}
|
||||
|
||||
@@ -336,7 +336,7 @@ async function deleteMessagesSelected() {
|
||||
deletedConversations += result.deletedConversations || 0;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`Ошибка при удалении сообщений для контакта ${id}:`, error);
|
||||
// console.error(`Ошибка при удалении сообщений для контакта ${id}:`, error);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -242,7 +242,7 @@ const connectToDLE = async () => {
|
||||
connectionStatus.value = 'connecting';
|
||||
|
||||
// Здесь будет подключение к DLE через Web3
|
||||
console.log('Подключение к DLE:', props.dleAddress);
|
||||
// console.log('Подключение к DLE:', props.dleAddress);
|
||||
|
||||
// Имитация подключения
|
||||
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||
@@ -252,7 +252,7 @@ const connectToDLE = async () => {
|
||||
|
||||
connectionStatus.value = 'connected';
|
||||
} catch (error) {
|
||||
console.error('Ошибка подключения к DLE:', error);
|
||||
// console.error('Ошибка подключения к DLE:', error);
|
||||
connectionStatus.value = 'error';
|
||||
}
|
||||
};
|
||||
@@ -312,7 +312,7 @@ const loadDLEData = async () => {
|
||||
];
|
||||
|
||||
} catch (error) {
|
||||
console.error('Ошибка загрузки данных DLE:', error);
|
||||
// console.error('Ошибка загрузки данных DLE:', error);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -351,7 +351,7 @@ const signProposal = async (proposalId) => {
|
||||
isSigning.value = true;
|
||||
|
||||
// Здесь будет подписание предложения
|
||||
console.log('Подписание предложения:', proposalId);
|
||||
// console.log('Подписание предложения:', proposalId);
|
||||
|
||||
const proposal = proposals.value.find(p => p.id === proposalId);
|
||||
if (proposal) {
|
||||
@@ -362,7 +362,7 @@ const signProposal = async (proposalId) => {
|
||||
emit('proposal-signed', { proposalId, dleAddress: props.dleAddress });
|
||||
|
||||
} catch (error) {
|
||||
console.error('Ошибка подписания предложения:', error);
|
||||
// console.error('Ошибка подписания предложения:', error);
|
||||
} finally {
|
||||
isSigning.value = false;
|
||||
}
|
||||
@@ -375,7 +375,7 @@ const executeProposal = async (proposalId) => {
|
||||
isExecuting.value = true;
|
||||
|
||||
// Здесь будет выполнение предложения
|
||||
console.log('Выполнение предложения:', proposalId);
|
||||
// console.log('Выполнение предложения:', proposalId);
|
||||
|
||||
const proposal = proposals.value.find(p => p.id === proposalId);
|
||||
if (proposal) {
|
||||
@@ -385,7 +385,7 @@ const executeProposal = async (proposalId) => {
|
||||
emit('proposal-executed', { proposalId, dleAddress: props.dleAddress });
|
||||
|
||||
} catch (error) {
|
||||
console.error('Ошибка выполнения предложения:', error);
|
||||
// console.error('Ошибка выполнения предложения:', error);
|
||||
} finally {
|
||||
isExecuting.value = false;
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ onMounted(() => {
|
||||
// Следим за изменениями авторизации и сообщаем о них через eventBus
|
||||
unwatch = watch(isAuthenticated, (newValue, oldValue) => {
|
||||
if (newValue !== oldValue) {
|
||||
console.log('[Header] Состояние аутентификации изменилось:', newValue);
|
||||
// console.log('[Header] Состояние аутентификации изменилось:', newValue);
|
||||
// Оповещаем остальные компоненты через шину событий
|
||||
eventBus.emit('auth-state-changed', {
|
||||
isAuthenticated: newValue,
|
||||
|
||||
@@ -106,7 +106,7 @@ const base64ToBlob = (base64, mimetype) => {
|
||||
const byteArray = new Uint8Array(byteNumbers);
|
||||
return new Blob([byteArray], { type: mimetype });
|
||||
} catch (e) {
|
||||
console.error("Error decoding base64 string:", e);
|
||||
// console.error("Error decoding base64 string:", e);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
@@ -161,7 +161,7 @@ const formattedTime = computed(() => {
|
||||
try {
|
||||
const date = new Date(timestamp);
|
||||
if (isNaN(date.getTime())) {
|
||||
console.warn('Invalid timestamp in Message.vue:', timestamp);
|
||||
// console.warn('Invalid timestamp in Message.vue:', timestamp);
|
||||
return '';
|
||||
}
|
||||
return date.toLocaleString([], {
|
||||
@@ -172,7 +172,7 @@ const formattedTime = computed(() => {
|
||||
minute: '2-digit',
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Error formatting time in Message.vue:', error, timestamp);
|
||||
// console.error('Error formatting time in Message.vue:', error, timestamp);
|
||||
return '';
|
||||
}
|
||||
});
|
||||
|
||||
@@ -135,7 +135,7 @@ async function checkConnection() {
|
||||
await loadInstalledModels();
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Ошибка проверки подключения:', error);
|
||||
// console.error('Ошибка проверки подключения:', error);
|
||||
isConnected.value = false;
|
||||
} finally {
|
||||
checking.value = false;
|
||||
@@ -148,7 +148,7 @@ async function loadInstalledModels() {
|
||||
const response = await axios.get('/ollama/models');
|
||||
installedModels.value = response.data.models || [];
|
||||
} catch (error) {
|
||||
console.error('Ошибка загрузки моделей:', error);
|
||||
// console.error('Ошибка загрузки моделей:', error);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -162,7 +162,7 @@ async function searchModels() {
|
||||
// Пока просто устанавливаем модель напрямую
|
||||
await installModel(searchQuery.value.trim());
|
||||
} catch (error) {
|
||||
console.error('Ошибка поиска моделей:', error);
|
||||
// console.error('Ошибка поиска моделей:', error);
|
||||
} finally {
|
||||
searching.value = false;
|
||||
}
|
||||
@@ -176,7 +176,7 @@ async function installModel(modelName) {
|
||||
await loadInstalledModels();
|
||||
searchQuery.value = '';
|
||||
} catch (error) {
|
||||
console.error('Ошибка установки модели:', error);
|
||||
// console.error('Ошибка установки модели:', error);
|
||||
} finally {
|
||||
installing.value = '';
|
||||
}
|
||||
@@ -189,7 +189,7 @@ async function removeModel(modelName) {
|
||||
await axios.delete(`/ollama/models/${encodeURIComponent(modelName)}`);
|
||||
await loadInstalledModels();
|
||||
} catch (error) {
|
||||
console.error('Ошибка удаления модели:', error);
|
||||
// console.error('Ошибка удаления модели:', error);
|
||||
} finally {
|
||||
removing.value = '';
|
||||
}
|
||||
|
||||
@@ -197,7 +197,7 @@ const closeSidebar = () => {
|
||||
|
||||
// Обработка события изменения авторизации
|
||||
const handleAuthEvent = (event) => {
|
||||
console.log('[Sidebar] Получено событие изменения авторизации:', event);
|
||||
// console.log('[Sidebar] Получено событие изменения авторизации:', event);
|
||||
// Здесь можно обновить данные, если нужно дополнительное обновление
|
||||
};
|
||||
|
||||
@@ -239,11 +239,11 @@ const handleDeleteIdentity = async (provider, providerId) => {
|
||||
|
||||
// Добавляем watch для отслеживания props
|
||||
watch(() => props.tokenBalances, (newVal, oldVal) => {
|
||||
console.log('[Sidebar] tokenBalances prop changed:', JSON.stringify(newVal));
|
||||
// console.log('[Sidebar] tokenBalances prop changed:', JSON.stringify(newVal));
|
||||
}, { deep: true });
|
||||
|
||||
watch(() => props.isLoadingTokens, (newVal, oldVal) => {
|
||||
console.log(`[Sidebar] isLoadingTokens prop changed: ${newVal}`);
|
||||
// console.log(`[Sidebar] isLoadingTokens prop changed: ${newVal}`);
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
error.value = result.error || 'Не удалось подключить кошелек';
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Error connecting wallet:', err);
|
||||
// console.error('Error connecting wallet:', err);
|
||||
error.value = err.message || 'Произошла ошибка при подключении кошелька';
|
||||
} finally {
|
||||
isLoading.value = false;
|
||||
|
||||
@@ -180,7 +180,7 @@ watch(editing, (val) => {
|
||||
// Добавляем watch для отслеживания изменений в мультисвязях с дебаунсингом
|
||||
let debounceTimer = null;
|
||||
watch(editMultiRelationValues, (newValues, oldValues) => {
|
||||
console.log('[editMultiRelationValues] changed from:', oldValues, 'to:', newValues);
|
||||
// console.log('[editMultiRelationValues] changed from:', oldValues, 'to:', newValues);
|
||||
|
||||
// Очищаем предыдущий таймер
|
||||
if (debounceTimer) {
|
||||
@@ -204,7 +204,7 @@ let unsubscribeFromWebSocket = null;
|
||||
// Функция для очистки кэша
|
||||
function clearCache() {
|
||||
cacheService.clearAll();
|
||||
console.log('[TableCell] Кэш очищен');
|
||||
// console.log('[TableCell] Кэш очищен');
|
||||
}
|
||||
|
||||
// WebSocket для тегов
|
||||
@@ -223,7 +223,7 @@ let isMultiRelationValuesLoaded = false;
|
||||
|
||||
onMounted(async () => {
|
||||
const startTime = Date.now();
|
||||
console.log(`[TableCell] 🚀 Начало монтирования ячейки row:${props.rowId} col:${props.column.id} в ${startTime}`);
|
||||
// console.log(`[TableCell] 🚀 Начало монтирования ячейки row:${props.rowId} col:${props.column.id} в ${startTime}`);
|
||||
|
||||
if (props.column.type === 'multiselect') {
|
||||
multiOptions.value = (props.column.options && props.column.options.options) || [];
|
||||
@@ -250,14 +250,14 @@ onMounted(async () => {
|
||||
} else if (props.column.type === 'multiselect-relation') {
|
||||
// Загружаем опции только один раз
|
||||
if (!isInitialized) {
|
||||
console.log(`[TableCell] 📥 Загружаем опции для row:${props.rowId} col:${props.column.id}`);
|
||||
// console.log(`[TableCell] 📥 Загружаем опции для row:${props.rowId} col:${props.column.id}`);
|
||||
await loadMultiRelationOptions();
|
||||
isInitialized = true;
|
||||
}
|
||||
|
||||
// Загружаем relations только один раз для каждой комбинации rowId + columnId
|
||||
if (!isMultiRelationValuesLoaded) {
|
||||
console.log(`[TableCell] 📥 Загружаем relations для row:${props.rowId} col:${props.column.id}`);
|
||||
// console.log(`[TableCell] 📥 Загружаем relations для row:${props.rowId} col:${props.column.id}`);
|
||||
await loadMultiRelationValues();
|
||||
isMultiRelationValuesLoaded = true;
|
||||
}
|
||||
@@ -265,7 +265,7 @@ onMounted(async () => {
|
||||
// Подписываемся на обновления таблицы
|
||||
if (props.column.type === 'multiselect-relation') {
|
||||
unsubscribeFromWebSocket = subscribeToTableRelationsUpdates(props.column.table_id, async () => {
|
||||
console.log('[TableCell] Получено обновление таблицы, перезагружаем relations');
|
||||
// console.log('[TableCell] Получено обновление таблицы, перезагружаем relations');
|
||||
// Сбрасываем флаг загрузки
|
||||
isMultiRelationValuesLoaded = false;
|
||||
// Очищаем кэш relations для текущей строки
|
||||
@@ -277,7 +277,7 @@ onMounted(async () => {
|
||||
// Подписываемся на обновления тегов, если это связанная таблица тегов
|
||||
if (props.column.options && props.column.options.relatedTableId) {
|
||||
unsubscribeFromTags = onTagsUpdate(async () => {
|
||||
console.log('[TableCell] Получено обновление тегов, перезагружаем опции');
|
||||
// console.log('[TableCell] Получено обновление тегов, перезагружаем опции');
|
||||
// Сбрасываем флаги загрузки
|
||||
isInitialized = false;
|
||||
isMultiRelationValuesLoaded = false;
|
||||
@@ -300,7 +300,7 @@ onMounted(async () => {
|
||||
localValue.value = cell ? cell.value : '';
|
||||
}
|
||||
const endTime = Date.now();
|
||||
console.log(`[TableCell] ✅ Завершено монтирование ячейки row:${props.rowId} col:${props.column.id} за ${endTime - startTime}ms`);
|
||||
// console.log(`[TableCell] ✅ Завершено монтирование ячейки row:${props.rowId} col:${props.column.id} за ${endTime - startTime}ms`);
|
||||
});
|
||||
|
||||
onUnmounted(() => {
|
||||
@@ -487,7 +487,7 @@ async function loadLookupValues() {
|
||||
async function loadMultiRelationOptions() {
|
||||
// Проверяем, не загружены ли уже опции
|
||||
if (multiRelationOptions.value.length > 0) {
|
||||
console.log('[loadMultiRelationOptions] Опции уже загружены, пропускаем');
|
||||
// console.log('[loadMultiRelationOptions] Опции уже загружены, пропускаем');
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -499,10 +499,10 @@ async function loadMultiRelationOptions() {
|
||||
let tableData;
|
||||
|
||||
if (cachedTableData) {
|
||||
console.log(`[loadMultiRelationOptions] ✅ Используем предварительно загруженные данные таблицы ${rel.relatedTableId}`);
|
||||
// console.log(`[loadMultiRelationOptions] ✅ Используем предварительно загруженные данные таблицы ${rel.relatedTableId}`);
|
||||
tableData = cachedTableData;
|
||||
} else {
|
||||
console.log(`[loadMultiRelationOptions] ⚠️ Данные таблицы ${rel.relatedTableId} не найдены в кэше, загружаем заново`);
|
||||
// console.log(`[loadMultiRelationOptions] ⚠️ Данные таблицы ${rel.relatedTableId} не найдены в кэше, загружаем заново`);
|
||||
const response = await fetch(`/api/tables/${rel.relatedTableId}`);
|
||||
tableData = await response.json();
|
||||
// Сохраняем в кэш
|
||||
@@ -517,9 +517,9 @@ async function loadMultiRelationOptions() {
|
||||
opts.push({ id: row.id, display: cell ? cell.value : `ID ${row.id}` });
|
||||
}
|
||||
multiRelationOptions.value = opts;
|
||||
console.log(`[loadMultiRelationOptions] Загружено ${opts.length} опций для таблицы ${rel.relatedTableId}`);
|
||||
// console.log(`[loadMultiRelationOptions] Загружено ${opts.length} опций для таблицы ${rel.relatedTableId}`);
|
||||
} catch (e) {
|
||||
console.error('[loadMultiRelationOptions] Error:', e);
|
||||
// console.error('[loadMultiRelationOptions] Error:', e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -531,7 +531,7 @@ const LOAD_DEBOUNCE_DELAY = 50; // 50ms (уменьшено для ускоре
|
||||
async function loadMultiRelationValues() {
|
||||
// Проверяем, не загружены ли уже данные
|
||||
if (isMultiRelationValuesLoaded) {
|
||||
console.log('[loadMultiRelationValues] Данные уже загружены, пропускаем');
|
||||
// console.log('[loadMultiRelationValues] Данные уже загружены, пропускаем');
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -543,7 +543,7 @@ async function loadMultiRelationValues() {
|
||||
// Устанавливаем новый таймер
|
||||
loadMultiRelationValuesTimer = setTimeout(async () => {
|
||||
// Получаем связи для текущей строки
|
||||
console.log('[loadMultiRelationValues] called for row:', props.rowId, 'column:', props.column.id);
|
||||
// console.log('[loadMultiRelationValues] called for row:', props.rowId, 'column:', props.column.id);
|
||||
|
||||
try {
|
||||
const rel = props.column.options || {};
|
||||
@@ -554,10 +554,10 @@ async function loadMultiRelationValues() {
|
||||
|
||||
const cachedRelations = cacheService.getRelationsData(props.rowId, props.column.id);
|
||||
if (cachedRelations) {
|
||||
console.log('[loadMultiRelationValues] ✅ Используем предварительно загруженные relations для строки', props.rowId);
|
||||
// console.log('[loadMultiRelationValues] ✅ Используем предварительно загруженные relations для строки', props.rowId);
|
||||
relations = cachedRelations;
|
||||
} else {
|
||||
console.log('[loadMultiRelationValues] ⚠️ Relations не найдены в кэше, загружаем заново для строки', props.rowId);
|
||||
// console.log('[loadMultiRelationValues] ⚠️ Relations не найдены в кэше, загружаем заново для строки', props.rowId);
|
||||
// Выполняем запросы параллельно
|
||||
const [relationsRes, tableRes] = await Promise.all([
|
||||
fetch(`/api/tables/${props.column.table_id}/row/${props.rowId}/relations`),
|
||||
@@ -573,13 +573,13 @@ async function loadMultiRelationValues() {
|
||||
cacheService.setRelationsData(props.rowId, props.column.id, relations);
|
||||
}
|
||||
|
||||
console.log('[loadMultiRelationValues] API response status: 200 relations:', relations);
|
||||
// console.log('[loadMultiRelationValues] API response status: 200 relations:', relations);
|
||||
|
||||
// Приводим все id к строке для корректного сравнения
|
||||
const relatedRowIds = relations
|
||||
.filter(r => String(r.column_id) === String(props.column.id) && String(r.to_table_id) === String(rel.relatedTableId))
|
||||
.map(r => String(r.to_row_id));
|
||||
console.log('[loadMultiRelationValues] filtered related row ids:', relatedRowIds);
|
||||
// console.log('[loadMultiRelationValues] filtered related row ids:', relatedRowIds);
|
||||
|
||||
// Обновляем значения
|
||||
editMultiRelationValues.value = relatedRowIds;
|
||||
@@ -603,48 +603,48 @@ async function loadMultiRelationValues() {
|
||||
selectedMultiRelationNames.value = multiRelationOptions.value
|
||||
.filter(opt => relatedRowIds.includes(String(opt.id)))
|
||||
.map(opt => opt.display);
|
||||
console.log('[loadMultiRelationValues] selectedMultiRelationNames:', selectedMultiRelationNames.value);
|
||||
// console.log('[loadMultiRelationValues] selectedMultiRelationNames:', selectedMultiRelationNames.value);
|
||||
|
||||
// Отмечаем, что данные загружены
|
||||
isMultiRelationValuesLoaded = true;
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('[loadMultiRelationValues] Error:', e);
|
||||
// console.error('[loadMultiRelationValues] Error:', e);
|
||||
}
|
||||
}, LOAD_DEBOUNCE_DELAY);
|
||||
}
|
||||
|
||||
async function saveMultiRelation() {
|
||||
console.log('[saveMultiRelation] called');
|
||||
// console.log('[saveMultiRelation] called');
|
||||
const rel = props.column.options || {};
|
||||
console.log('[saveMultiRelation] editMultiRelationValues:', editMultiRelationValues.value);
|
||||
// console.log('[saveMultiRelation] editMultiRelationValues:', editMultiRelationValues.value);
|
||||
try {
|
||||
const payload = {
|
||||
column_id: props.column.id,
|
||||
to_table_id: rel.relatedTableId,
|
||||
to_row_ids: editMultiRelationValues.value
|
||||
};
|
||||
console.log('[saveMultiRelation] POST payload:', payload);
|
||||
console.log('[TableCell] Отправляем запрос на обновление relations для строки:', props.rowId);
|
||||
console.log('[TableCell] Данные запроса:', payload);
|
||||
// console.log('[saveMultiRelation] POST payload:', payload);
|
||||
// console.log('[TableCell] Отправляем запрос на обновление relations для строки:', props.rowId);
|
||||
// console.log('[TableCell] Данные запроса:', payload);
|
||||
const response = await fetch(`/api/tables/${props.column.table_id}/row/${props.rowId}/relations`, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(payload)
|
||||
});
|
||||
const result = await response.json().catch(() => ({}));
|
||||
console.log('[TableCell] Ответ сервера для строки:', props.rowId, 'статус:', response.status, 'результат:', result);
|
||||
// console.log('[TableCell] Ответ сервера для строки:', props.rowId, 'статус:', response.status, 'результат:', result);
|
||||
if (response.ok) {
|
||||
console.log('[TableCell] Успешно сохранены теги для строки:', props.rowId);
|
||||
// console.log('[TableCell] Успешно сохранены теги для строки:', props.rowId);
|
||||
} else {
|
||||
console.error('[TableCell] Ошибка сохранения тегов для строки:', props.rowId, 'статус:', response.status);
|
||||
// console.error('[TableCell] Ошибка сохранения тегов для строки:', props.rowId, 'статус:', response.status);
|
||||
}
|
||||
editing.value = false;
|
||||
await loadMultiRelationValues();
|
||||
console.log('[saveMultiRelation] emitting update with:', editMultiRelationValues.value);
|
||||
// console.log('[saveMultiRelation] emitting update with:', editMultiRelationValues.value);
|
||||
emit('update', editMultiRelationValues.value);
|
||||
} catch (e) {
|
||||
console.error('[saveMultiRelation] Ошибка при сохранении мультисвязи:', e);
|
||||
// console.error('[saveMultiRelation] Ошибка при сохранении мультисвязи:', e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -653,7 +653,7 @@ async function addTag() {
|
||||
const rel = props.column.options || {};
|
||||
|
||||
try {
|
||||
console.log('[addTag] Добавляем новый тег:', newTagName.value);
|
||||
// console.log('[addTag] Добавляем новый тег:', newTagName.value);
|
||||
|
||||
// 1. Создаем новую пустую строку в связанной таблице
|
||||
const rowResponse = await fetch(`/api/tables/${rel.relatedTableId}/rows`, {
|
||||
@@ -662,7 +662,7 @@ async function addTag() {
|
||||
});
|
||||
const newRow = await rowResponse.json();
|
||||
|
||||
console.log('[addTag] Новая строка создана:', newRow);
|
||||
// console.log('[addTag] Новая строка создана:', newRow);
|
||||
|
||||
// 2. Добавляем значение в ячейку через POST /cell
|
||||
const cellResponse = await fetch(`/api/tables/cell`, {
|
||||
@@ -676,7 +676,7 @@ async function addTag() {
|
||||
});
|
||||
const cellResult = await cellResponse.json();
|
||||
|
||||
console.log('[addTag] Значение ячейки сохранено:', cellResult);
|
||||
// console.log('[addTag] Значение ячейки сохранено:', cellResult);
|
||||
|
||||
// Очищаем форму
|
||||
newTagName.value = '';
|
||||
@@ -688,12 +688,12 @@ async function addTag() {
|
||||
Promise.resolve(editMultiRelationValues.value.push(String(newRow.id)))
|
||||
]);
|
||||
|
||||
console.log('[addTag] Тег добавлен в выбранные:', editMultiRelationValues.value);
|
||||
// console.log('[addTag] Тег добавлен в выбранные:', editMultiRelationValues.value);
|
||||
|
||||
// Сохраняем изменения, чтобы отправить WebSocket уведомление
|
||||
await saveMultiRelation();
|
||||
} catch (e) {
|
||||
console.error('[addTag] Ошибка при добавлении тега:', e);
|
||||
// console.error('[addTag] Ошибка при добавлении тега:', e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -702,13 +702,13 @@ async function deleteTag(tagId) {
|
||||
if (!confirm('Удалить этот тег?')) return;
|
||||
|
||||
try {
|
||||
console.log('[deleteTag] Удаляем тег с ID:', tagId);
|
||||
// console.log('[deleteTag] Удаляем тег с ID:', tagId);
|
||||
|
||||
// Удаляем тег из связанной таблицы
|
||||
const response = await fetch(`/api/tables/row/${tagId}`, { method: 'DELETE' });
|
||||
const result = await response.json();
|
||||
|
||||
console.log('[deleteTag] Ответ сервера:', response.status, result);
|
||||
// console.log('[deleteTag] Ответ сервера:', response.status, result);
|
||||
|
||||
// Убираем тег из выбранных значений, если он был выбран
|
||||
editMultiRelationValues.value = editMultiRelationValues.value.filter(id => String(id) !== String(tagId));
|
||||
@@ -716,12 +716,12 @@ async function deleteTag(tagId) {
|
||||
// Обновляем список опций
|
||||
await loadMultiRelationOptions();
|
||||
|
||||
console.log('[deleteTag] Тег удален:', tagId);
|
||||
// console.log('[deleteTag] Тег удален:', tagId);
|
||||
|
||||
// Сохраняем изменения, чтобы отправить WebSocket уведомление
|
||||
await saveMultiRelation();
|
||||
} catch (e) {
|
||||
console.error('[deleteTag] Ошибка при удалении тега:', e);
|
||||
// console.error('[deleteTag] Ошибка при удалении тега:', e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -361,7 +361,7 @@ async function fetchFilteredRows() {
|
||||
params.append(def.filterKey, Array.isArray(val) ? val.join(',') : val);
|
||||
}
|
||||
}
|
||||
console.log('fetchFilteredRows params:', params.toString()); // Для отладки
|
||||
// console.log('fetchFilteredRows params:', params.toString()); // Для отладки
|
||||
const data = await tablesService.getFilteredRows(props.tableId, params);
|
||||
// Локальная фильтрация по multiselect-relation (если backend не фильтрует)
|
||||
filteredRows.value = data.filter(row => {
|
||||
@@ -387,7 +387,7 @@ async function fetchFilteredRows() {
|
||||
// Основная загрузка таблицы
|
||||
async function fetchTable() {
|
||||
const startTime = Date.now();
|
||||
console.log(`[UserTableView] 🚀 Начало загрузки таблицы ${props.tableId} в ${startTime}`);
|
||||
// console.log(`[UserTableView] 🚀 Начало загрузки таблицы ${props.tableId} в ${startTime}`);
|
||||
|
||||
const data = await tablesService.getTable(props.tableId);
|
||||
columns.value = data.columns;
|
||||
@@ -395,12 +395,12 @@ async function fetchTable() {
|
||||
cellValues.value = data.cellValues;
|
||||
tableMeta.value = { name: data.name, description: data.description };
|
||||
|
||||
console.log(`[UserTableView] 📊 Загружено ${rows.value.length} строк, ${columns.value.length} столбцов`);
|
||||
// console.log(`[UserTableView] 📊 Загружено ${rows.value.length} строк, ${columns.value.length} столбцов`);
|
||||
|
||||
// Предварительно загружаем все relations для всех строк параллельно
|
||||
const relationColumns = columns.value.filter(col => col.type === 'multiselect-relation');
|
||||
if (relationColumns.length > 0) {
|
||||
console.log(`[UserTableView] 🔄 Предварительно загружаем relations для ${relationColumns.length} столбцов`);
|
||||
// console.log(`[UserTableView] 🔄 Предварительно загружаем relations для ${relationColumns.length} столбцов`);
|
||||
|
||||
const relationPromises = [];
|
||||
for (const row of rows.value) {
|
||||
@@ -413,7 +413,7 @@ async function fetchTable() {
|
||||
return { rowId: row.id, colId: col.id, relations };
|
||||
})
|
||||
.catch(error => {
|
||||
console.error(`[UserTableView] Ошибка загрузки relations для row:${row.id} col:${col.id}:`, error);
|
||||
// console.error(`[UserTableView] Ошибка загрузки relations для row:${row.id} col:${col.id}:`, error);
|
||||
return { rowId: row.id, colId: col.id, relations: [] };
|
||||
});
|
||||
relationPromises.push(promise);
|
||||
@@ -422,7 +422,7 @@ async function fetchTable() {
|
||||
|
||||
// Ждем загрузки всех relations
|
||||
const results = await Promise.all(relationPromises);
|
||||
console.log(`[UserTableView] ✅ Предварительно загружено ${results.length} relations`);
|
||||
// console.log(`[UserTableView] ✅ Предварительно загружено ${results.length} relations`);
|
||||
}
|
||||
|
||||
// Предварительно загружаем данные связанных таблиц для опций
|
||||
@@ -434,7 +434,7 @@ async function fetchTable() {
|
||||
}
|
||||
|
||||
if (relatedTableIds.size > 0) {
|
||||
console.log(`[UserTableView] 🔄 Предварительно загружаем данные ${relatedTableIds.size} связанных таблиц для опций`);
|
||||
// console.log(`[UserTableView] 🔄 Предварительно загружаем данные ${relatedTableIds.size} связанных таблиц для опций`);
|
||||
|
||||
const tablePromises = Array.from(relatedTableIds).map(tableId =>
|
||||
fetch(`/api/tables/${tableId}`)
|
||||
@@ -445,13 +445,13 @@ async function fetchTable() {
|
||||
return { tableId, tableData };
|
||||
})
|
||||
.catch(error => {
|
||||
console.error(`[UserTableView] Ошибка загрузки таблицы ${tableId}:`, error);
|
||||
// console.error(`[UserTableView] Ошибка загрузки таблицы ${tableId}:`, error);
|
||||
return { tableId, tableData: null };
|
||||
})
|
||||
);
|
||||
|
||||
const tableResults = await Promise.all(tablePromises);
|
||||
console.log(`[UserTableView] ✅ Предварительно загружено ${tableResults.length} связанных таблиц`);
|
||||
// console.log(`[UserTableView] ✅ Предварительно загружено ${tableResults.length} связанных таблиц`);
|
||||
}
|
||||
|
||||
// Выполняем обновление фильтров и фильтрацию строк параллельно
|
||||
@@ -462,15 +462,15 @@ async function fetchTable() {
|
||||
|
||||
// Выводим статистику кэша для отладки
|
||||
const cacheStats = cacheService.getStats();
|
||||
console.log('[UserTableView] Статистика кэша после загрузки таблицы:', {
|
||||
tableCacheSize: cacheStats.tableCacheSize,
|
||||
relationsCacheSize: cacheStats.relationsCacheSize,
|
||||
tableCacheKeys: cacheStats.tableCacheKeys,
|
||||
relationsCacheKeys: cacheStats.relationsCacheKeys.slice(0, 5) // Показываем только первые 5 ключей
|
||||
});
|
||||
// console.log('[UserTableView] Статистика кэша после загрузки таблицы:', {
|
||||
// tableCacheSize: cacheStats.tableCacheSize,
|
||||
// relationsCacheSize: cacheStats.relationsCacheSize,
|
||||
// tableCacheKeys: cacheStats.tableCacheKeys,
|
||||
// relationsCacheKeys: cacheStats.relationsCacheKeys.slice(0, 5) // Показываем только первые 5 ключей
|
||||
// });
|
||||
|
||||
const endTime = Date.now();
|
||||
console.log(`[UserTableView] ✅ Завершена загрузка таблицы ${props.tableId} за ${endTime - startTime}ms`);
|
||||
// console.log(`[UserTableView] ✅ Завершена загрузка таблицы ${props.tableId} за ${endTime - startTime}ms`);
|
||||
}
|
||||
|
||||
async function updateRelationFilterDefs() {
|
||||
@@ -485,7 +485,7 @@ async function updateRelationFilterDefs() {
|
||||
// Проверяем кэш
|
||||
const cached = cacheService.getTableData(tableId);
|
||||
if (cached) {
|
||||
console.log(`[updateRelationFilterDefs] Используем кэшированные данные таблицы ${tableId}`);
|
||||
// console.log(`[updateRelationFilterDefs] Используем кэшированные данные таблицы ${tableId}`);
|
||||
relatedTableMap.set(tableId, Promise.resolve(cached));
|
||||
} else {
|
||||
relatedTableMap.set(tableId, tablesService.getTable(tableId));
|
||||
@@ -536,7 +536,7 @@ async function updateRelationFilterDefs() {
|
||||
});
|
||||
}
|
||||
}
|
||||
console.log('relationFilterDefs:', defs); // Для отладки
|
||||
// console.log('relationFilterDefs:', defs); // Для отладки
|
||||
relationFilterDefs.value = defs;
|
||||
}
|
||||
|
||||
@@ -553,7 +553,7 @@ onMounted(() => {
|
||||
fetchTable();
|
||||
// Подписка на WebSocket обновления таблицы
|
||||
unsubscribeFromTableUpdate = websocketService.onTableUpdate(props.tableId, () => {
|
||||
console.log('[UserTableView] Получено событие table-updated, перезагружаем данные');
|
||||
// console.log('[UserTableView] Получено событие table-updated, перезагружаем данные');
|
||||
// Очищаем кэш текущей таблицы
|
||||
cacheService.clearTableCache(props.tableId);
|
||||
fetchTable();
|
||||
@@ -561,15 +561,15 @@ onMounted(() => {
|
||||
|
||||
// Подписка на WebSocket обновления тегов
|
||||
const { onTagsUpdate } = useTagsWebSocket();
|
||||
console.log('[UserTableView] Подписываемся на обновления тегов для таблицы:', props.tableId);
|
||||
console.log('[UserTableView] onTagsUpdate функция:', typeof onTagsUpdate);
|
||||
// console.log('[UserTableView] Подписываемся на обновления тегов для таблицы:', props.tableId);
|
||||
// console.log('[UserTableView] onTagsUpdate функция:', typeof onTagsUpdate);
|
||||
unsubscribeFromTagsUpdate = onTagsUpdate(async (data) => {
|
||||
console.log('[UserTableView] 🔔 ПОЛУЧЕНО СОБЫТИЕ TAGS-UPDATED!');
|
||||
console.log('[UserTableView] Получено событие tags-updated, обновляем данные для таблицы:', props.tableId, data);
|
||||
// console.log('[UserTableView] 🔔 ПОЛУЧЕНО СОБЫТИЕ TAGS-UPDATED!');
|
||||
// console.log('[UserTableView] Получено событие tags-updated, обновляем данные для таблицы:', props.tableId, data);
|
||||
|
||||
// Если есть информация о конкретной строке, обновляем только её
|
||||
if (data && data.rowId) {
|
||||
console.log('[UserTableView] Точечное обновление для строки:', data.rowId);
|
||||
// console.log('[UserTableView] Точечное обновление для строки:', data.rowId);
|
||||
try {
|
||||
// Очищаем кэш relations только для конкретной строки
|
||||
const tagColumns = columns.value.filter(col =>
|
||||
@@ -581,19 +581,19 @@ onMounted(() => {
|
||||
cacheService.clearRelationsData(data.rowId, col.id);
|
||||
}
|
||||
|
||||
console.log('[UserTableView] Кэш relations очищен для строки, обновляем данные строки:', data.rowId);
|
||||
// console.log('[UserTableView] Кэш relations очищен для строки, обновляем данные строки:', data.rowId);
|
||||
|
||||
// Обновляем только данные конкретной строки
|
||||
await updateRowData(data.rowId);
|
||||
console.log('[UserTableView] Данные строки обновлены:', data.rowId);
|
||||
// console.log('[UserTableView] Данные строки обновлены:', data.rowId);
|
||||
} catch (error) {
|
||||
console.error('[UserTableView] Ошибка при точечном обновлении:', error);
|
||||
// console.error('[UserTableView] Ошибка при точечном обновлении:', error);
|
||||
// Fallback: полная перезагрузка при ошибке
|
||||
await fetchTable();
|
||||
}
|
||||
} else {
|
||||
// Если нет информации о строке, используем старую логику
|
||||
console.log('[UserTableView] Общее обновление тегов');
|
||||
// console.log('[UserTableView] Общее обновление тегов');
|
||||
try {
|
||||
// Очищаем кэш relations для всех строк этой таблицы
|
||||
const tableRows = rows.value || [];
|
||||
@@ -609,11 +609,11 @@ onMounted(() => {
|
||||
}
|
||||
}
|
||||
|
||||
console.log('[UserTableView] Кэш relations очищен, перезагружаем данные таблицы:', props.tableId);
|
||||
// console.log('[UserTableView] Кэш relations очищен, перезагружаем данные таблицы:', props.tableId);
|
||||
await fetchTable();
|
||||
console.log('[UserTableView] Данные таблицы перезагружены:', props.tableId);
|
||||
// console.log('[UserTableView] Данные таблицы перезагружены:', props.tableId);
|
||||
} catch (error) {
|
||||
console.error('[UserTableView] Ошибка при обновлении после tags-updated:', error);
|
||||
// console.error('[UserTableView] Ошибка при обновлении после tags-updated:', error);
|
||||
// Fallback: полная перезагрузка при ошибке
|
||||
cacheService.clearTableCache(props.tableId);
|
||||
await fetchTable();
|
||||
@@ -764,13 +764,13 @@ async function rebuildIndex() {
|
||||
// Функция для точечного обновления данных конкретной строки
|
||||
async function updateRowData(rowId) {
|
||||
const startTime = Date.now();
|
||||
console.log(`[UserTableView] 🔄 Начало обновления данных строки ${rowId}`);
|
||||
// console.log(`[UserTableView] 🔄 Начало обновления данных строки ${rowId}`);
|
||||
|
||||
try {
|
||||
// Находим строку в текущих данных
|
||||
const rowIndex = rows.value.findIndex(row => row.id === rowId);
|
||||
if (rowIndex === -1) {
|
||||
console.log(`[UserTableView] Строка ${rowId} не найдена в текущих данных`);
|
||||
// console.log(`[UserTableView] Строка ${rowId} не найдена в текущих данных`);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -781,7 +781,7 @@ async function updateRowData(rowId) {
|
||||
);
|
||||
|
||||
if (tagColumns.length > 0) {
|
||||
console.log(`[UserTableView] 🔄 Загружаем relations для строки ${rowId} (${tagColumns.length} столбцов)`);
|
||||
// console.log(`[UserTableView] 🔄 Загружаем relations для строки ${rowId} (${tagColumns.length} столбцов)`);
|
||||
|
||||
const relationPromises = tagColumns.map(col =>
|
||||
fetch(`/api/tables/${col.table_id}/row/${rowId}/relations`)
|
||||
@@ -792,19 +792,19 @@ async function updateRowData(rowId) {
|
||||
return { rowId, colId: col.id, relations };
|
||||
})
|
||||
.catch(error => {
|
||||
console.error(`[UserTableView] Ошибка загрузки relations для row:${rowId} col:${col.id}:`, error);
|
||||
// console.error(`[UserTableView] Ошибка загрузки relations для row:${rowId} col:${col.id}:`, error);
|
||||
return { rowId, colId: col.id, relations: [] };
|
||||
})
|
||||
);
|
||||
|
||||
await Promise.all(relationPromises);
|
||||
console.log(`[UserTableView] ✅ Relations для строки ${rowId} обновлены`);
|
||||
// console.log(`[UserTableView] ✅ Relations для строки ${rowId} обновлены`);
|
||||
}
|
||||
|
||||
const endTime = Date.now();
|
||||
console.log(`[UserTableView] ✅ Завершено обновление строки ${rowId} за ${endTime - startTime}ms`);
|
||||
// console.log(`[UserTableView] ✅ Завершено обновление строки ${rowId} за ${endTime - startTime}ms`);
|
||||
} catch (error) {
|
||||
console.error(`[UserTableView] ❌ Ошибка при обновлении строки ${rowId}:`, error);
|
||||
// console.error(`[UserTableView] ❌ Ошибка при обновлении строки ${rowId}:`, error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ export function useAuthFlow(options = {}) {
|
||||
if (telegramAuth.value.checkInterval) {
|
||||
clearInterval(telegramAuth.value.checkInterval);
|
||||
telegramAuth.value.checkInterval = null;
|
||||
console.log('[useAuthFlow] Интервал проверки Telegram авторизации очищен');
|
||||
// console.log('[useAuthFlow] Интервал проверки Telegram авторизации очищен');
|
||||
}
|
||||
};
|
||||
|
||||
@@ -69,13 +69,13 @@ export function useAuthFlow(options = {}) {
|
||||
clearTelegramInterval(); // На всякий случай
|
||||
telegramAuth.value.checkInterval = setInterval(async () => {
|
||||
try {
|
||||
console.log('[useAuthFlow] Проверка статуса Telegram...');
|
||||
// console.log('[useAuthFlow] Проверка статуса Telegram...');
|
||||
// Используем checkAuth из useAuth для обновления состояния
|
||||
const checkResponse = await auth.checkAuth();
|
||||
const telegramId = auth.telegramId.value;
|
||||
|
||||
if (auth.isAuthenticated.value && telegramId) {
|
||||
console.log('[useAuthFlow] Telegram успешно связан/подтвержден.');
|
||||
// console.log('[useAuthFlow] Telegram успешно связан/подтвержден.');
|
||||
clearTelegramInterval();
|
||||
telegramAuth.value.showVerification = false;
|
||||
telegramAuth.value.verificationCode = '';
|
||||
@@ -87,7 +87,7 @@ export function useAuthFlow(options = {}) {
|
||||
return;
|
||||
}
|
||||
} catch (intervalError) {
|
||||
console.error('[useAuthFlow] Ошибка при проверке статуса Telegram в интервале:', intervalError);
|
||||
// console.error('[useAuthFlow] Ошибка при проверке статуса Telegram в интервале:', intervalError);
|
||||
// Решаем, останавливать ли интервал при ошибке
|
||||
// telegramAuth.value.error = 'Ошибка проверки статуса Telegram.';
|
||||
// clearTelegramInterval();
|
||||
@@ -99,7 +99,7 @@ export function useAuthFlow(options = {}) {
|
||||
showErrorMessage(telegramAuth.value.error);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('[useAuthFlow] Ошибка инициализации Telegram аутентификации:', error);
|
||||
// console.error('[useAuthFlow] Ошибка инициализации Telegram аутентификации:', error);
|
||||
const message = error?.response?.data?.error || 'Ошибка при инициализации аутентификации через Telegram';
|
||||
telegramAuth.value.error = message;
|
||||
showErrorMessage(message);
|
||||
@@ -114,7 +114,7 @@ export function useAuthFlow(options = {}) {
|
||||
telegramAuth.value.verificationCode = '';
|
||||
telegramAuth.value.error = '';
|
||||
telegramAuth.value.isLoading = false;
|
||||
console.log('[useAuthFlow] Аутентификация Telegram отменена');
|
||||
// console.log('[useAuthFlow] Аутентификация Telegram отменена');
|
||||
};
|
||||
|
||||
// --- Email ---
|
||||
@@ -148,13 +148,13 @@ export function useAuthFlow(options = {}) {
|
||||
emailAuth.value.showForm = false;
|
||||
emailAuth.value.showVerification = true;
|
||||
emailAuth.value.verificationCode = ''; // Очищаем поле кода
|
||||
console.log('[useAuthFlow] Код верификации Email отправлен на:', emailAuth.value.verificationEmail);
|
||||
// console.log('[useAuthFlow] Код верификации Email отправлен на:', emailAuth.value.verificationEmail);
|
||||
} else {
|
||||
emailAuth.value.error = response.data.error || 'Ошибка инициализации аутентификации по email';
|
||||
showErrorMessage(emailAuth.value.error);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('[useAuthFlow] Ошибка при запросе инициализации Email:', error);
|
||||
// console.error('[useAuthFlow] Ошибка при запросе инициализации Email:', error);
|
||||
const message = error?.response?.data?.error || 'Ошибка при запросе кода подтверждения';
|
||||
emailAuth.value.error = message;
|
||||
showErrorMessage(message);
|
||||
|
||||
@@ -64,14 +64,14 @@ export function useChat(auth) {
|
||||
const { silent = false, initial = false, authType = null } = options;
|
||||
|
||||
if (messageLoading.value.isHistoryLoadingInProgress) {
|
||||
console.warn('[useChat] Загрузка истории уже идет, пропуск.');
|
||||
// console.warn('[useChat] Загрузка истории уже идет, пропуск.');
|
||||
return;
|
||||
}
|
||||
messageLoading.value.isHistoryLoadingInProgress = true;
|
||||
|
||||
// Если initial=true, сбрасываем offset и hasMoreMessages
|
||||
if (initial) {
|
||||
console.log('[useChat] Начальная загрузка истории...');
|
||||
// console.log('[useChat] Начальная загрузка истории...');
|
||||
messageLoading.value.offset = 0;
|
||||
messageLoading.value.hasMoreMessages = false;
|
||||
messages.value = []; // Очищаем текущие сообщения перед начальной загрузкой
|
||||
@@ -86,17 +86,17 @@ export function useChat(auth) {
|
||||
messageLoading.value.isLoadingHistory = true;
|
||||
if (!silent && initial) isLoading.value = true; // Показываем общий лоадер только при начальной загрузке
|
||||
|
||||
console.log(
|
||||
`[useChat] Загрузка истории сообщений (initial: ${initial}, authType: ${authType}, offset: ${messageLoading.value.offset})...`
|
||||
);
|
||||
// console.log(
|
||||
// `[useChat] Загрузка истории сообщений (initial: ${initial}, authType: ${authType}, offset: ${messageLoading.value.offset})...`
|
||||
// );
|
||||
|
||||
try {
|
||||
// --- Логика ожидания привязки гостя (упрощенная) ---
|
||||
// TODO: Рассмотреть более надежный механизм, если это необходимо
|
||||
if (authType) {
|
||||
console.log(`[useChat] Ожидание после ${authType} аутентификации...`);
|
||||
// console.log(`[useChat] Ожидание после ${authType} аутентификации...`);
|
||||
await new Promise((resolve) => setTimeout(resolve, 1500)); // Увеличена задержка
|
||||
console.log('[useChat] Ожидание завершено, продолжаем загрузку истории.');
|
||||
// console.log('[useChat] Ожидание завершено, продолжаем загрузку истории.');
|
||||
}
|
||||
// --- Конец логики ожидания ---
|
||||
|
||||
@@ -107,9 +107,9 @@ export function useChat(auth) {
|
||||
const countResponse = await api.get('/chat/history', { params: { count_only: true } });
|
||||
if (!countResponse.data.success) throw new Error('Не удалось получить количество сообщений');
|
||||
totalMessages = countResponse.data.total || countResponse.data.count || 0;
|
||||
console.log(`[useChat] Всего сообщений в истории: ${totalMessages}`);
|
||||
// console.log(`[useChat] Всего сообщений в истории: ${totalMessages}`);
|
||||
} catch(countError) {
|
||||
console.error('[useChat] Ошибка получения количества сообщений:', countError);
|
||||
// console.error('[useChat] Ошибка получения количества сообщений:', countError);
|
||||
// Не прерываем выполнение, попробуем загрузить без total
|
||||
}
|
||||
}
|
||||
@@ -118,7 +118,7 @@ export function useChat(auth) {
|
||||
// Если это первая загрузка и мы знаем total, рассчитаем смещение для последних сообщений
|
||||
if (initial && totalMessages > 0 && totalMessages > messageLoading.value.limit) {
|
||||
effectiveOffset = Math.max(0, totalMessages - messageLoading.value.limit);
|
||||
console.log(`[useChat] Рассчитано начальное смещение: ${effectiveOffset}`);
|
||||
// console.log(`[useChat] Рассчитано начальное смещение: ${effectiveOffset}`);
|
||||
}
|
||||
|
||||
const response = await api.get('/chat/history', {
|
||||
@@ -130,7 +130,7 @@ export function useChat(auth) {
|
||||
|
||||
if (response.data.success) {
|
||||
const loadedMessages = response.data.messages || [];
|
||||
console.log(`[useChat] Загружено ${loadedMessages.length} сообщений.`);
|
||||
// console.log(`[useChat] Загружено ${loadedMessages.length} сообщений.`);
|
||||
|
||||
if (loadedMessages.length > 0) {
|
||||
// Добавляем к существующим (в начало для истории, в конец для начальной загрузки)
|
||||
@@ -147,7 +147,7 @@ export function useChat(auth) {
|
||||
} else {
|
||||
messageLoading.value.offset += loadedMessages.length;
|
||||
}
|
||||
console.log(`[useChat] Новое смещение: ${messageLoading.value.offset}`);
|
||||
// console.log(`[useChat] Новое смещение: ${messageLoading.value.offset}`);
|
||||
|
||||
// Проверяем, есть ли еще сообщения для загрузки
|
||||
// Используем totalMessages, если он был успешно получен
|
||||
@@ -157,7 +157,7 @@ export function useChat(auth) {
|
||||
// Если total не известен, считаем, что есть еще, если загрузили полный лимит
|
||||
messageLoading.value.hasMoreMessages = loadedMessages.length === messageLoading.value.limit;
|
||||
}
|
||||
console.log(`[useChat] Есть еще сообщения: ${messageLoading.value.hasMoreMessages}`);
|
||||
// console.log(`[useChat] Есть еще сообщения: ${messageLoading.value.hasMoreMessages}`);
|
||||
} else {
|
||||
// Если сообщений не пришло, значит, больше нет
|
||||
messageLoading.value.hasMoreMessages = false;
|
||||
@@ -177,11 +177,11 @@ export function useChat(auth) {
|
||||
}
|
||||
|
||||
} else {
|
||||
console.error('[useChat] API вернул ошибку при загрузке истории:', response.data.error);
|
||||
// console.error('[useChat] API вернул ошибку при загрузке истории:', response.data.error);
|
||||
messageLoading.value.hasMoreMessages = false; // Считаем, что больше нет при ошибке
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('[useChat] Ошибка загрузки истории сообщений:', error);
|
||||
// console.error('[useChat] Ошибка загрузки истории сообщений:', error);
|
||||
messageLoading.value.hasMoreMessages = false; // Считаем, что больше нет при ошибке
|
||||
} finally {
|
||||
messageLoading.value.isLoadingHistory = false;
|
||||
@@ -193,12 +193,12 @@ export function useChat(auth) {
|
||||
// --- Отправка сообщения ---
|
||||
const handleSendMessage = async (payload) => {
|
||||
// --- НАЧАЛО ДОБАВЛЕННЫХ ЛОГОВ ---
|
||||
console.log('[useChat] handleSendMessage called. Payload:', payload);
|
||||
console.log('[useChat] Current auth state:', {
|
||||
isAuthenticated: auth.isAuthenticated.value,
|
||||
userId: auth.userId.value,
|
||||
authType: auth.authType.value,
|
||||
});
|
||||
// console.log('[useChat] handleSendMessage called. Payload:', payload);
|
||||
// console.log('[useChat] Current auth state:', {
|
||||
// isAuthenticated: auth.isAuthenticated.value,
|
||||
// userId: auth.userId.value,
|
||||
// authType: auth.authType.value,
|
||||
// });
|
||||
// --- КОНЕЦ ДОБАВЛЕННЫХ ЛОГОВ ---
|
||||
|
||||
const { message: text, attachments: files } = payload; // files - массив File объектов
|
||||
@@ -206,7 +206,7 @@ export function useChat(auth) {
|
||||
|
||||
// Проверка на пустое сообщение (если нет ни текста, ни файлов)
|
||||
if (!userMessageContent && (!files || files.length === 0)) {
|
||||
console.warn('[useChat] Попытка отправить пустое сообщение.');
|
||||
// console.warn('[useChat] Попытка отправить пустое сообщение.');
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -268,7 +268,7 @@ export function useChat(auth) {
|
||||
const userMsgIndex = messages.value.findIndex((m) => m.id === tempId);
|
||||
|
||||
if (response.data.success) {
|
||||
console.log('[useChat] Сообщение успешно отправлено:', response.data);
|
||||
// console.log('[useChat] Сообщение успешно отправлено:', response.data);
|
||||
// Обновляем локальное сообщение данными с сервера
|
||||
if (userMsgIndex !== -1) {
|
||||
const serverUserMessage = response.data.userMessage || { id: response.data.messageId };
|
||||
@@ -317,7 +317,7 @@ export function useChat(auth) {
|
||||
});
|
||||
setToStorage('guestMessages', storedMessages);
|
||||
} catch (storageError) {
|
||||
console.error('[useChat] Ошибка сохранения гостевого сообщения в localStorage:', storageError);
|
||||
// console.error('[useChat] Ошибка сохранения гостевого сообщения в localStorage:', storageError);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -329,7 +329,7 @@ export function useChat(auth) {
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.error('[useChat] Ошибка отправки сообщения:', error);
|
||||
// console.error('[useChat] Ошибка отправки сообщения:', error);
|
||||
const userMsgIndex = messages.value.findIndex((m) => m.id === tempId);
|
||||
if (userMsgIndex !== -1) {
|
||||
messages.value[userMsgIndex].hasError = true;
|
||||
@@ -354,7 +354,7 @@ export function useChat(auth) {
|
||||
try {
|
||||
const storedMessages = getFromStorage('guestMessages');
|
||||
if (storedMessages && Array.isArray(storedMessages) && storedMessages.length > 0) {
|
||||
console.log(`[useChat] Найдено ${storedMessages.length} сохраненных гостевых сообщений`);
|
||||
// console.log(`[useChat] Найдено ${storedMessages.length} сохраненных гостевых сообщений`);
|
||||
// Добавляем только если текущий список пуст (чтобы не дублировать при HMR)
|
||||
if(messages.value.length === 0) {
|
||||
messages.value = storedMessages.map(m => ({ ...m, isGuest: true })); // Помечаем как гостевые
|
||||
@@ -362,7 +362,7 @@ export function useChat(auth) {
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('[useChat] Ошибка загрузки гостевых сообщений из localStorage:', e);
|
||||
// console.error('[useChat] Ошибка загрузки гостевых сообщений из localStorage:', e);
|
||||
removeFromStorage('guestMessages'); // Очистить при ошибке парсинга
|
||||
}
|
||||
}
|
||||
@@ -381,7 +381,7 @@ export function useChat(auth) {
|
||||
guestId.value = '';
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('[useChat] Ошибка связывания гостевых сообщений:', error);
|
||||
// console.error('[useChat] Ошибка связывания гостевых сообщений:', error);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -401,7 +401,7 @@ export function useChat(auth) {
|
||||
// Сброс чата при выходе пользователя
|
||||
watch(() => auth.isAuthenticated.value, (isAuth, wasAuth) => {
|
||||
if (!isAuth && wasAuth) { // Если пользователь разлогинился
|
||||
console.log('[useChat] Пользователь вышел, сброс состояния чата.');
|
||||
// console.log('[useChat] Пользователь вышел, сброс состояния чата.');
|
||||
messages.value = [];
|
||||
messageLoading.value.offset = 0;
|
||||
messageLoading.value.hasMoreMessages = false;
|
||||
@@ -413,7 +413,7 @@ export function useChat(auth) {
|
||||
// Гостевые данные очищаются при успешной аутентификации в loadMessages
|
||||
// или если пользователь сам очистит localStorage
|
||||
} else if (isAuth && !wasAuth) { // Если пользователь вошел
|
||||
console.log('[useChat] Пользователь вошел, подключаем WebSocket.');
|
||||
// console.log('[useChat] Пользователь вошел, подключаем WebSocket.');
|
||||
// Отложенное подключение, чтобы дождаться загрузки данных пользователя
|
||||
setTimeout(() => setupChatWebSocket(), 100);
|
||||
}
|
||||
@@ -422,7 +422,7 @@ export function useChat(auth) {
|
||||
// Отслеживаем загрузку данных пользователя для подключения WebSocket
|
||||
watch(() => auth.user?.value, (newUser, oldUser) => {
|
||||
if (newUser && newUser.id && auth.isAuthenticated.value) {
|
||||
console.log('[useChat] Данные пользователя загружены, подключаем WebSocket:', newUser.id);
|
||||
// console.log('[useChat] Данные пользователя загружены, подключаем WebSocket:', newUser.id);
|
||||
setupChatWebSocket();
|
||||
}
|
||||
}, { immediate: false });
|
||||
@@ -431,12 +431,12 @@ export function useChat(auth) {
|
||||
function setupChatWebSocket() {
|
||||
// Подключаемся к WebSocket только если пользователь аутентифицирован
|
||||
if (auth.isAuthenticated.value && auth.user && auth.user.value && auth.user.value.id) {
|
||||
console.log('[useChat] Подключение к WebSocket для пользователя:', auth.user.value.id);
|
||||
// console.log('[useChat] Подключение к WebSocket для пользователя:', auth.user.value.id);
|
||||
websocketService.connect(auth.user.value.id);
|
||||
|
||||
// Создаем и сохраняем callback функции
|
||||
wsCallbacks.chatMessage = (message) => {
|
||||
console.log('[useChat] Получено новое сообщение через WebSocket:', message);
|
||||
// console.log('[useChat] Получено новое сообщение через WebSocket:', message);
|
||||
// Проверяем, что сообщение не дублируется
|
||||
const existingMessage = messages.value.find(m => m.id === message.id);
|
||||
if (!existingMessage) {
|
||||
@@ -445,20 +445,20 @@ export function useChat(auth) {
|
||||
};
|
||||
|
||||
wsCallbacks.conversationUpdated = (conversationId) => {
|
||||
console.log('[useChat] Обновление диалога через WebSocket:', conversationId);
|
||||
// console.log('[useChat] Обновление диалога через WebSocket:', conversationId);
|
||||
// Можно добавить логику обновления списка диалогов
|
||||
};
|
||||
|
||||
wsCallbacks.connected = () => {
|
||||
console.log('[useChat] WebSocket подключен');
|
||||
// console.log('[useChat] WebSocket подключен');
|
||||
};
|
||||
|
||||
wsCallbacks.disconnected = () => {
|
||||
console.log('[useChat] WebSocket отключен');
|
||||
// console.log('[useChat] WebSocket отключен');
|
||||
};
|
||||
|
||||
wsCallbacks.error = (error) => {
|
||||
console.error('[useChat] WebSocket ошибка:', error);
|
||||
// console.error('[useChat] WebSocket ошибка:', error);
|
||||
};
|
||||
|
||||
// Подписываемся на события
|
||||
@@ -468,7 +468,7 @@ export function useChat(auth) {
|
||||
websocketService.on('disconnected', wsCallbacks.disconnected);
|
||||
websocketService.on('error', wsCallbacks.error);
|
||||
} else {
|
||||
console.log('[useChat] WebSocket не подключен: пользователь не аутентифицирован или данные не загружены');
|
||||
// console.log('[useChat] WebSocket не подключен: пользователь не аутентифицирован или данные не загружены');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -33,30 +33,30 @@ export function useTokenBalances() {
|
||||
if (walletAddress) {
|
||||
try {
|
||||
isLoadingTokens.value = true;
|
||||
console.log('[useTokenBalances] Запрос балансов для адреса:', walletAddress);
|
||||
// console.log('[useTokenBalances] Запрос балансов для адреса:', walletAddress);
|
||||
const response = await fetchTokenBalances(walletAddress);
|
||||
// Ожидаем, что response — это массив объектов
|
||||
tokenBalances.value = Array.isArray(response) ? response : (response?.data || []);
|
||||
console.log('[useTokenBalances] Обновленные балансы:', tokenBalances.value);
|
||||
} catch (error) {
|
||||
console.error('[useTokenBalances] Ошибка при обновлении балансов:', error);
|
||||
// console.log('[useTokenBalances] Обновленные балансы:', tokenBalances.value);
|
||||
} catch (error) {
|
||||
// console.error('[useTokenBalances] Ошибка при обновлении балансов:', error);
|
||||
tokenBalances.value = [];
|
||||
} finally {
|
||||
isLoadingTokens.value = false;
|
||||
}
|
||||
} else {
|
||||
console.log('[useTokenBalances] Не найден адрес кошелька для запроса балансов.');
|
||||
// console.log('[useTokenBalances] Не найден адрес кошелька для запроса балансов.');
|
||||
tokenBalances.value = [];
|
||||
}
|
||||
} else {
|
||||
console.log('[useTokenBalances] Пользователь не аутентифицирован, сброс балансов.');
|
||||
// console.log('[useTokenBalances] Пользователь не аутентифицирован, сброс балансов.');
|
||||
tokenBalances.value = [];
|
||||
}
|
||||
};
|
||||
|
||||
const startBalanceUpdates = (intervalMs = 300000) => {
|
||||
stopBalanceUpdates(); // Остановить предыдущий интервал, если он был
|
||||
console.log('[useTokenBalances] Запуск обновления балансов...');
|
||||
// console.log('[useTokenBalances] Запуск обновления балансов...');
|
||||
updateBalances(); // Обновить сразу
|
||||
balanceUpdateInterval = setInterval(updateBalances, intervalMs);
|
||||
};
|
||||
|
||||
@@ -40,8 +40,8 @@ app.use(ElementPlus);
|
||||
// ]).catch(err => console.error('Failed to load API mocks:', err));
|
||||
// }
|
||||
|
||||
console.log('API URL:', axios.defaults.baseURL);
|
||||
console.log('main.js: Starting application with router');
|
||||
// console.log('API URL:', axios.defaults.baseURL);
|
||||
// console.log('main.js: Starting application with router');
|
||||
|
||||
app.mount('#app');
|
||||
console.log('main.js: Application with router mounted');
|
||||
// console.log('main.js: Application with router mounted');
|
||||
|
||||
@@ -14,14 +14,13 @@ import { createRouter, createWebHistory } from 'vue-router';
|
||||
import HomeView from '../views/HomeView.vue';
|
||||
// Импортируем (пока не созданные) компоненты для подстраниц настроек
|
||||
const SettingsAiView = () => import('../views/settings/AiSettingsView.vue');
|
||||
const SettingsBlockchainView = () => import('../views/settings/BlockchainSettingsView.vue');
|
||||
const SettingsSecurityView = () => import('../views/settings/SecuritySettingsView.vue');
|
||||
const SettingsInterfaceView = () => import('../views/settings/Interface/InterfaceSettingsView.vue');
|
||||
|
||||
import axios from 'axios';
|
||||
import { setToStorage } from '../utils/storage.js';
|
||||
|
||||
console.log('router/index.js: Script loaded');
|
||||
// console.log('router/index.js: Script loaded');
|
||||
|
||||
const routes = [
|
||||
{
|
||||
@@ -50,16 +49,7 @@ const routes = [
|
||||
name: 'settings-ai',
|
||||
component: SettingsAiView,
|
||||
},
|
||||
{
|
||||
path: 'blockchain',
|
||||
name: 'settings-blockchain',
|
||||
component: SettingsBlockchainView,
|
||||
},
|
||||
{
|
||||
path: 'blockchain/dle-deploy',
|
||||
name: 'settings-blockchain-dle-deploy',
|
||||
component: () => import('../views/settings/BlockchainSettingsView.vue'),
|
||||
},
|
||||
|
||||
{
|
||||
path: 'dle-v2-deploy',
|
||||
name: 'settings-dle-v2-deploy',
|
||||
@@ -286,7 +276,7 @@ const router = createRouter({
|
||||
routes,
|
||||
});
|
||||
|
||||
console.log('router/index.js: Router created');
|
||||
// console.log('router/index.js: Router created');
|
||||
|
||||
// Защита маршрутов
|
||||
router.beforeEach(async (to, from, next) => {
|
||||
|
||||
@@ -16,14 +16,14 @@ class CacheService {
|
||||
const cached = this.tableCache.get(cacheKey);
|
||||
|
||||
if (cached && Date.now() - cached.timestamp < this.tableCacheTimeout) {
|
||||
console.log(`[CacheService] ✅ КЭШ ПОПАДАНИЕ для таблицы ${tableId} (${cacheKey})`);
|
||||
// console.log(`[CacheService] ✅ КЭШ ПОПАДАНИЕ для таблицы ${tableId} (${cacheKey})`);
|
||||
return cached.data;
|
||||
}
|
||||
|
||||
if (cached) {
|
||||
console.log(`[CacheService] ⏰ Кэш истек для таблицы ${tableId} (${cacheKey})`);
|
||||
// console.log(`[CacheService] ⏰ Кэш истек для таблицы ${tableId} (${cacheKey})`);
|
||||
} else {
|
||||
console.log(`[CacheService] ❌ Кэш отсутствует для таблицы ${tableId} (${cacheKey})`);
|
||||
// console.log(`[CacheService] ❌ Кэш отсутствует для таблицы ${tableId} (${cacheKey})`);
|
||||
}
|
||||
|
||||
return null;
|
||||
@@ -35,7 +35,7 @@ class CacheService {
|
||||
data,
|
||||
timestamp: Date.now()
|
||||
});
|
||||
console.log(`[CacheService] Сохранены данные таблицы ${tableId} в кэш`);
|
||||
// console.log(`[CacheService] Сохранены данные таблицы ${tableId} в кэш`);
|
||||
}
|
||||
|
||||
// Кэширование relations
|
||||
@@ -44,7 +44,7 @@ class CacheService {
|
||||
const cached = this.relationsCache.get(cacheKey);
|
||||
|
||||
if (cached && Date.now() - cached.timestamp < this.relationsCacheTimeout) {
|
||||
console.log(`[CacheService] Используем кэшированные relations для строки ${rowId}`);
|
||||
// console.log(`[CacheService] Используем кэшированные relations для строки ${rowId}`);
|
||||
return cached.data;
|
||||
}
|
||||
|
||||
@@ -57,7 +57,7 @@ class CacheService {
|
||||
data,
|
||||
timestamp: Date.now()
|
||||
});
|
||||
console.log(`[CacheService] Сохранены relations строки ${rowId} в кэш`);
|
||||
// console.log(`[CacheService] Сохранены relations строки ${rowId} в кэш`);
|
||||
}
|
||||
|
||||
// Очистка кэша
|
||||
@@ -69,11 +69,11 @@ class CacheService {
|
||||
this.tableCache.delete(key);
|
||||
}
|
||||
}
|
||||
console.log(`[CacheService] Очищен кэш таблицы ${tableId}`);
|
||||
// console.log(`[CacheService] Очищен кэш таблицы ${tableId}`);
|
||||
} else {
|
||||
// Очищаем весь кэш таблиц
|
||||
this.tableCache.clear();
|
||||
console.log('[CacheService] Очищен весь кэш таблиц');
|
||||
// console.log('[CacheService] Очищен весь кэш таблиц');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -85,11 +85,11 @@ class CacheService {
|
||||
this.relationsCache.delete(key);
|
||||
}
|
||||
}
|
||||
console.log(`[CacheService] Очищен кэш relations строки ${rowId}`);
|
||||
// console.log(`[CacheService] Очищен кэш relations строки ${rowId}`);
|
||||
} else {
|
||||
// Очищаем весь кэш relations
|
||||
this.relationsCache.clear();
|
||||
console.log('[CacheService] Очищен весь кэш relations');
|
||||
// console.log('[CacheService] Очищен весь кэш relations');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -97,7 +97,7 @@ class CacheService {
|
||||
clearAll() {
|
||||
this.tableCache.clear();
|
||||
this.relationsCache.clear();
|
||||
console.log('[CacheService] Очищены все кэши');
|
||||
// console.log('[CacheService] Очищены все кэши');
|
||||
}
|
||||
|
||||
// Получение статистики кэша
|
||||
|
||||
@@ -27,10 +27,10 @@ export default {
|
||||
async deleteContact(id) {
|
||||
try {
|
||||
const res = await api.delete(`/users/${id}`);
|
||||
console.log('Ответ на удаление контакта:', res.status, res.data);
|
||||
// console.log('Ответ на удаление контакта:', res.status, res.data);
|
||||
return res.data;
|
||||
} catch (err) {
|
||||
console.error('Ошибка при удалении контакта:', err.response?.status, err.response?.data, err);
|
||||
// console.error('Ошибка при удалении контакта:', err.response?.status, err.response?.data, err);
|
||||
|
||||
// Если пользователь уже удален (404), считаем это успехом
|
||||
if (err.response?.status === 404) {
|
||||
|
||||
@@ -27,7 +27,7 @@ class DLEV2Service {
|
||||
const response = await api.post('/dle-v2', dleParams);
|
||||
return response.data;
|
||||
} catch (error) {
|
||||
console.error('Ошибка при создании DLE v2:', error);
|
||||
// console.error('Ошибка при создании DLE v2:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
@@ -41,7 +41,7 @@ class DLEV2Service {
|
||||
const response = await api.get('/dle-v2');
|
||||
return response.data.data || [];
|
||||
} catch (error) {
|
||||
console.error('Ошибка при получении списка DLE v2:', error);
|
||||
// console.error('Ошибка при получении списка DLE v2:', error);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
@@ -55,7 +55,7 @@ class DLEV2Service {
|
||||
const response = await api.get('/dle-v2/defaults');
|
||||
return response.data.data;
|
||||
} catch (error) {
|
||||
console.error('Ошибка при получении настроек по умолчанию DLE v2:', error);
|
||||
// console.error('Ошибка при получении настроек по умолчанию DLE v2:', error);
|
||||
return {
|
||||
votingDelay: 1,
|
||||
votingPeriod: 45818,
|
||||
@@ -76,7 +76,7 @@ class DLEV2Service {
|
||||
const response = await api.delete(`/dle-v2/${dleAddress}`);
|
||||
return response.data;
|
||||
} catch (error) {
|
||||
console.error('Ошибка при удалении DLE v2:', error);
|
||||
// console.error('Ошибка при удалении DLE v2:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,13 +56,13 @@ export default {
|
||||
return res.data;
|
||||
},
|
||||
async deleteTable(id) {
|
||||
console.log('tablesService.deleteTable called with id:', id);
|
||||
// console.log('tablesService.deleteTable called with id:', id);
|
||||
try {
|
||||
const res = await api.delete(`${tablesApi}/${id}`);
|
||||
console.log('Delete response:', res.data);
|
||||
// console.log('Delete response:', res.data);
|
||||
return res.data;
|
||||
} catch (error) {
|
||||
console.error('Error in deleteTable service:', error);
|
||||
// console.error('Error in deleteTable service:', error);
|
||||
throw error;
|
||||
}
|
||||
},
|
||||
|
||||
@@ -18,14 +18,14 @@ export const fetchTokenBalances = async (address = null) => {
|
||||
let url = '/tokens/balances';
|
||||
if (address) {
|
||||
url += `?address=${encodeURIComponent(address)}`;
|
||||
console.log(`Fetching token balances for specific address: ${address}`);
|
||||
// console.log(`Fetching token balances for specific address: ${address}`);
|
||||
} else {
|
||||
console.log('Fetching token balances for session user');
|
||||
// console.log('Fetching token balances for session user');
|
||||
}
|
||||
const response = await api.get(url);
|
||||
return response.data;
|
||||
} catch (error) {
|
||||
console.error('Error fetching token balances:', error);
|
||||
// console.error('Error fetching token balances:', error);
|
||||
return {
|
||||
eth: '0',
|
||||
bsc: '0',
|
||||
|
||||
@@ -15,7 +15,7 @@ import axios from '../api/axios';
|
||||
import { SiweMessage } from 'siwe';
|
||||
|
||||
export async function connectWithWallet() {
|
||||
console.log('Starting wallet connection...');
|
||||
// console.log('Starting wallet connection...');
|
||||
|
||||
try {
|
||||
// Проверяем наличие MetaMask
|
||||
@@ -23,12 +23,12 @@ export async function connectWithWallet() {
|
||||
throw new Error('MetaMask not detected. Please install MetaMask.');
|
||||
}
|
||||
|
||||
console.log('MetaMask detected, requesting accounts...');
|
||||
// console.log('MetaMask detected, requesting accounts...');
|
||||
|
||||
// Запрашиваем доступ к аккаунтам
|
||||
const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' });
|
||||
|
||||
console.log('Got accounts:', accounts);
|
||||
// console.log('Got accounts:', accounts);
|
||||
|
||||
if (!accounts || accounts.length === 0) {
|
||||
throw new Error('No accounts found. Please unlock MetaMask.');
|
||||
@@ -36,13 +36,13 @@ export async function connectWithWallet() {
|
||||
|
||||
// Берем первый аккаунт
|
||||
const address = ethers.getAddress(accounts[0]);
|
||||
console.log('Normalized address:', address);
|
||||
// console.log('Normalized address:', address);
|
||||
|
||||
// Запрашиваем nonce с сервера
|
||||
console.log('Requesting nonce...');
|
||||
// console.log('Requesting nonce...');
|
||||
const nonceResponse = await axios.get(`/auth/nonce?address=${address}`);
|
||||
const nonce = nonceResponse.data.nonce;
|
||||
console.log('Got nonce:', nonce);
|
||||
// console.log('Got nonce:', nonce);
|
||||
|
||||
// Создаем сообщение для подписи
|
||||
const domain = window.location.host;
|
||||
@@ -63,30 +63,30 @@ export async function connectWithWallet() {
|
||||
});
|
||||
|
||||
const message = siweMessage.prepareMessage();
|
||||
console.log('SIWE message:', message);
|
||||
console.log('SIWE message details:', {
|
||||
domain,
|
||||
address,
|
||||
statement,
|
||||
uri: origin,
|
||||
version: '1',
|
||||
chainId: 1,
|
||||
nonce,
|
||||
issuedAt,
|
||||
resources: [`${origin}/api/auth/verify`],
|
||||
});
|
||||
// console.log('SIWE message:', message);
|
||||
// console.log('SIWE message details:', {
|
||||
// domain,
|
||||
// address,
|
||||
// statement,
|
||||
// uri: origin,
|
||||
// version: '1',
|
||||
// chainId: 1,
|
||||
// nonce,
|
||||
// issuedAt,
|
||||
// resources: [`${origin}/api/auth/verify`],
|
||||
// });
|
||||
|
||||
// Запрашиваем подпись
|
||||
console.log('Requesting signature...');
|
||||
// console.log('Requesting signature...');
|
||||
const signature = await window.ethereum.request({
|
||||
method: 'personal_sign',
|
||||
params: [message, address.toLowerCase()],
|
||||
});
|
||||
|
||||
console.log('Got signature:', signature);
|
||||
// console.log('Got signature:', signature);
|
||||
|
||||
// Отправляем подпись на сервер для верификации
|
||||
console.log('Sending verification request...');
|
||||
// console.log('Sending verification request...');
|
||||
const verificationResponse = await axios.post('/auth/verify', {
|
||||
signature,
|
||||
address,
|
||||
@@ -94,7 +94,7 @@ export async function connectWithWallet() {
|
||||
issuedAt,
|
||||
});
|
||||
|
||||
console.log('Verification response:', verificationResponse.data);
|
||||
// console.log('Verification response:', verificationResponse.data);
|
||||
|
||||
// Обновляем состояние аутентификации
|
||||
if (verificationResponse.data.success) {
|
||||
@@ -107,7 +107,7 @@ export async function connectWithWallet() {
|
||||
|
||||
return verificationResponse.data;
|
||||
} catch (error) {
|
||||
console.error('Error connecting wallet:', error);
|
||||
// console.error('Error connecting wallet:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ class WebSshService {
|
||||
this.isAgentRunning = false;
|
||||
return { running: false };
|
||||
} catch (error) {
|
||||
console.error('Агент не доступен:', error);
|
||||
// console.error('Агент не доступен:', error);
|
||||
this.isAgentRunning = false;
|
||||
return { running: false, error: error.message };
|
||||
}
|
||||
@@ -84,7 +84,7 @@ class WebSshService {
|
||||
return await this.downloadAndInstallAgent();
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Ошибка при установке агента:', error);
|
||||
// console.error('Ошибка при установке агента:', error);
|
||||
return await this.downloadAndInstallAgent();
|
||||
}
|
||||
}
|
||||
@@ -154,7 +154,7 @@ EOF
|
||||
requiresManualInstall: true
|
||||
};
|
||||
} catch (error) {
|
||||
console.error('Ошибка при создании установочного скрипта:', error);
|
||||
// console.error('Ошибка при создании установочного скрипта:', error);
|
||||
return {
|
||||
success: false,
|
||||
message: 'Ошибка при подготовке установки агента',
|
||||
@@ -216,7 +216,7 @@ EOF
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Ошибка при создании туннеля:', error);
|
||||
// console.error('Ошибка при создании туннеля:', error);
|
||||
return {
|
||||
success: false,
|
||||
message: `Ошибка подключения к агенту: ${error.message}`
|
||||
@@ -259,7 +259,7 @@ EOF
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Ошибка при отключении туннеля:', error);
|
||||
// console.error('Ошибка при отключении туннеля:', error);
|
||||
return {
|
||||
success: false,
|
||||
message: `Ошибка подключения к агенту: ${error.message}`
|
||||
@@ -291,7 +291,7 @@ EOF
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Ошибка при получении статуса:', error);
|
||||
// console.error('Ошибка при получении статуса:', error);
|
||||
return {
|
||||
connected: false,
|
||||
domain: null,
|
||||
@@ -337,7 +337,7 @@ app.post('/tunnel/create', async (req, res) => {
|
||||
try {
|
||||
const { domain, email, sshHost, sshUser, sshKey, localPort, serverPort, sshPort } = req.body;
|
||||
|
||||
console.log('Создание туннеля для домена:', domain);
|
||||
// console.log('Создание туннеля для домена:', domain);
|
||||
|
||||
// Сохраняем SSH ключ во временный файл
|
||||
const keyPath = path.join(__dirname, 'temp_ssh_key');
|
||||
@@ -395,11 +395,11 @@ server {
|
||||
const sshProcess = spawn('ssh', sshArgs);
|
||||
|
||||
sshProcess.on('error', (error) => {
|
||||
console.error('SSH процесс ошибка:', error);
|
||||
// console.error('SSH процесс ошибка:', error);
|
||||
});
|
||||
|
||||
sshProcess.on('close', (code) => {
|
||||
console.log('SSH процесс завершен с кодом:', code);
|
||||
// console.log('SSH процесс завершен с кодом:', code);
|
||||
tunnelState.connected = false;
|
||||
});
|
||||
|
||||
@@ -419,7 +419,7 @@ server {
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
console.error('Ошибка создания туннеля:', error);
|
||||
// console.error('Ошибка создания туннеля:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: error.message
|
||||
@@ -446,7 +446,7 @@ app.post('/tunnel/disconnect', (req, res) => {
|
||||
message: 'Туннель отключен'
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Ошибка отключения туннеля:', error);
|
||||
// console.error('Ошибка отключения туннеля:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: error.message
|
||||
@@ -465,7 +465,7 @@ app.get('/tunnel/status', (req, res) => {
|
||||
|
||||
// Запуск сервера
|
||||
app.listen(PORT, 'localhost', () => {
|
||||
console.log(\`WebSSH Agent запущен на порту \${PORT}\`);
|
||||
// console.log(\`WebSSH Agent запущен на порту \${PORT}\`);
|
||||
});
|
||||
`;
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
class WebSocketService {
|
||||
constructor() {
|
||||
console.log('🔌 [WebSocket] Конструктор вызван');
|
||||
// console.log('🔌 [WebSocket] Конструктор вызван');
|
||||
this.ws = null;
|
||||
this.isConnected = false;
|
||||
this.reconnectAttempts = 0;
|
||||
@@ -24,14 +24,14 @@ class WebSocketService {
|
||||
this.reconnectDelay = 1000; // 1 секунда
|
||||
this.listeners = new Map();
|
||||
this.userId = null;
|
||||
console.log('🔌 [WebSocket] Конструктор завершен');
|
||||
// console.log('🔌 [WebSocket] Конструктор завершен');
|
||||
}
|
||||
|
||||
// Подключение к WebSocket серверу
|
||||
connect(userId = null) {
|
||||
console.log('🔌 [WebSocket] Попытка подключения, userId:', userId);
|
||||
// console.log('🔌 [WebSocket] Попытка подключения, userId:', userId);
|
||||
if (this.ws && this.ws.readyState === WebSocket.OPEN) {
|
||||
console.log('🔌 [WebSocket] Уже подключен');
|
||||
// console.log('🔌 [WebSocket] Уже подключен');
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -43,13 +43,13 @@ class WebSocketService {
|
||||
// В Docker окружении используем тот же хост, что и для HTTP
|
||||
const wsUrl = `${protocol}//${window.location.host}/ws`;
|
||||
|
||||
console.log('🔌 [WebSocket] Подключение к:', wsUrl);
|
||||
console.log('🔌 [WebSocket] Текущий хост:', window.location.host);
|
||||
// console.log('🔌 [WebSocket] Подключение к:', wsUrl);
|
||||
// console.log('🔌 [WebSocket] Текущий хост:', window.location.host);
|
||||
|
||||
this.ws = new WebSocket(wsUrl);
|
||||
|
||||
this.ws.onopen = () => {
|
||||
console.log('✅ [WebSocket] Подключение установлено');
|
||||
// console.log('✅ [WebSocket] Подключение установлено');
|
||||
this.isConnected = true;
|
||||
this.reconnectAttempts = 0;
|
||||
|
||||
@@ -65,66 +65,42 @@ class WebSocketService {
|
||||
};
|
||||
|
||||
this.ws.onclose = (event) => {
|
||||
console.log('🔌 [WebSocket] Соединение закрыто:', event.code, event.reason);
|
||||
// console.log('🔌 [WebSocket] Соединение закрыто:', event.code, event.reason);
|
||||
this.isConnected = false;
|
||||
this.emit('disconnected', event);
|
||||
|
||||
// Попытка переподключения
|
||||
if (this.reconnectAttempts < this.maxReconnectAttempts) {
|
||||
this.reconnectAttempts++;
|
||||
console.log(`🔄 [WebSocket] Попытка переподключения ${this.reconnectAttempts}/${this.maxReconnectAttempts}`);
|
||||
// console.log(`🔄 [WebSocket] Попытка переподключения ${this.reconnectAttempts}/${this.maxReconnectAttempts}`);
|
||||
|
||||
setTimeout(() => {
|
||||
this.connect(this.userId);
|
||||
}, this.reconnectDelay * this.reconnectAttempts);
|
||||
} else {
|
||||
console.error('❌ [WebSocket] Превышено максимальное количество попыток переподключения');
|
||||
// console.error('❌ [WebSocket] Превышено максимальное количество попыток переподключения');
|
||||
this.emit('reconnect-failed');
|
||||
}
|
||||
};
|
||||
|
||||
this.ws.onerror = (error) => {
|
||||
console.error('❌ [WebSocket] Ошибка соединения:', error);
|
||||
// console.error('❌ [WebSocket] Ошибка соединения:', error);
|
||||
this.emit('error', error);
|
||||
};
|
||||
|
||||
this.ws.onmessage = (event) => {
|
||||
try {
|
||||
const data = JSON.parse(event.data);
|
||||
console.log('📨 [WebSocket] Получено сообщение:', data);
|
||||
console.log('📨 [WebSocket] Тип сообщения:', data.type);
|
||||
// console.log('📨 [WebSocket] Получено сообщение:', data);
|
||||
// console.log('📨 [WebSocket] Тип сообщения:', data.type);
|
||||
this.handleMessage(data);
|
||||
} catch (error) {
|
||||
console.error('❌ [WebSocket] Ошибка парсинга сообщения:', error);
|
||||
// console.error('❌ [WebSocket] Ошибка парсинга сообщения:', error);
|
||||
}
|
||||
};
|
||||
|
||||
this.ws.onclose = (event) => {
|
||||
console.log('🔌 [WebSocket] Соединение закрыто:', event.code, event.reason);
|
||||
this.isConnected = false;
|
||||
this.emit('disconnected', event);
|
||||
|
||||
// Попытка переподключения
|
||||
if (this.reconnectAttempts < this.maxReconnectAttempts) {
|
||||
this.reconnectAttempts++;
|
||||
console.log(`🔄 [WebSocket] Попытка переподключения ${this.reconnectAttempts}/${this.maxReconnectAttempts}`);
|
||||
|
||||
setTimeout(() => {
|
||||
this.connect(this.userId);
|
||||
}, this.reconnectDelay * this.reconnectAttempts);
|
||||
} else {
|
||||
console.error('❌ [WebSocket] Превышено максимальное количество попыток переподключения');
|
||||
this.emit('reconnect-failed');
|
||||
}
|
||||
};
|
||||
|
||||
this.ws.onerror = (error) => {
|
||||
console.error('❌ [WebSocket] Ошибка соединения:', error);
|
||||
this.emit('error', error);
|
||||
};
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ [WebSocket] Ошибка создания соединения:', error);
|
||||
// console.error('❌ [WebSocket] Ошибка создания соединения:', error);
|
||||
this.emit('error', error);
|
||||
}
|
||||
}
|
||||
@@ -134,7 +110,7 @@ class WebSocketService {
|
||||
if (this.ws && this.ws.readyState === WebSocket.OPEN) {
|
||||
this.ws.send(JSON.stringify(data));
|
||||
} else {
|
||||
console.warn('⚠️ [WebSocket] Соединение не установлено, сообщение не отправлено:', data);
|
||||
// console.warn('⚠️ [WebSocket] Соединение не установлено, сообщение не отправлено:', data);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -142,57 +118,57 @@ class WebSocketService {
|
||||
handleMessage(data) {
|
||||
switch (data.type) {
|
||||
case 'auth-success':
|
||||
console.log('✅ [WebSocket] Аутентификация успешна для пользователя:', data.userId);
|
||||
// console.log('✅ [WebSocket] Аутентификация успешна для пользователя:', data.userId);
|
||||
this.emit('auth-success', data);
|
||||
break;
|
||||
|
||||
case 'chat-message':
|
||||
console.log('💬 [WebSocket] Новое сообщение чата:', data.message);
|
||||
// console.log('💬 [WebSocket] Новое сообщение чата:', data.message);
|
||||
this.emit('chat-message', data.message);
|
||||
break;
|
||||
|
||||
case 'conversation-updated':
|
||||
console.log('📝 [WebSocket] Обновление диалога:', data.conversationId);
|
||||
// console.log('📝 [WebSocket] Обновление диалога:', data.conversationId);
|
||||
this.emit('conversation-updated', data.conversationId);
|
||||
break;
|
||||
|
||||
case 'messages-updated':
|
||||
console.log('📨 [WebSocket] Обновление сообщений');
|
||||
// console.log('📨 [WebSocket] Обновление сообщений');
|
||||
this.emit('messages-updated');
|
||||
break;
|
||||
|
||||
case 'contacts-updated':
|
||||
console.log('👥 [WebSocket] Обновление контактов');
|
||||
// console.log('👥 [WebSocket] Обновление контактов');
|
||||
this.emit('contacts-updated');
|
||||
break;
|
||||
|
||||
case 'tags-updated':
|
||||
console.log('🔔 [websocketService] Получено сообщение tags-updated:', data);
|
||||
console.log('🔔 [websocketService] Количество слушателей tags-updated:', this.listeners.get('tags-updated')?.length || 0);
|
||||
// console.log('🔔 [websocketService] Получено сообщение tags-updated:', data);
|
||||
// console.log('🔔 [websocketService] Количество слушателей tags-updated:', this.listeners.get('tags-updated')?.length || 0);
|
||||
this.emit('tags-updated', data);
|
||||
break;
|
||||
|
||||
case 'table-updated':
|
||||
console.log('[WebSocket] table-updated:', data.tableId);
|
||||
// console.log('[WebSocket] table-updated:', data.tableId);
|
||||
if (tableUpdateSubscribers[data.tableId]) {
|
||||
tableUpdateSubscribers[data.tableId].forEach(cb => cb(data));
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
console.log('❓ [WebSocket] Неизвестный тип сообщения:', data.type);
|
||||
// console.log('❓ [WebSocket] Неизвестный тип сообщения:', data.type);
|
||||
this.emit('unknown-message', data);
|
||||
}
|
||||
}
|
||||
|
||||
// Подписка на события
|
||||
on(event, callback) {
|
||||
console.log('🔌 [WebSocket] Подписка на событие:', event);
|
||||
// console.log('🔌 [WebSocket] Подписка на событие:', event);
|
||||
if (!this.listeners.has(event)) {
|
||||
this.listeners.set(event, []);
|
||||
}
|
||||
this.listeners.get(event).push(callback);
|
||||
console.log('🔌 [WebSocket] Количество слушателей для', event, ':', this.listeners.get(event).length);
|
||||
// console.log('🔌 [WebSocket] Количество слушателей для', event, ':', this.listeners.get(event).length);
|
||||
}
|
||||
|
||||
// Отписка от событий
|
||||
@@ -208,20 +184,20 @@ class WebSocketService {
|
||||
|
||||
// Эмиссия событий
|
||||
emit(event, data) {
|
||||
console.log('🔌 [WebSocket] Эмиссия события:', event, 'с данными:', data);
|
||||
// console.log('🔌 [WebSocket] Эмиссия события:', event, 'с данными:', data);
|
||||
if (this.listeners.has(event)) {
|
||||
const callbacks = this.listeners.get(event);
|
||||
console.log('🔌 [WebSocket] Количество колбэков для', event, ':', callbacks.length);
|
||||
// console.log('🔌 [WebSocket] Количество колбэков для', event, ':', callbacks.length);
|
||||
callbacks.forEach((callback, index) => {
|
||||
try {
|
||||
console.log('🔌 [WebSocket] Выполняем колбэк #', index, 'для события', event);
|
||||
// console.log('🔌 [WebSocket] Выполняем колбэк #', index, 'для события', event);
|
||||
callback(data);
|
||||
} catch (error) {
|
||||
console.error(`❌ [WebSocket] Ошибка в обработчике события ${event}:`, error);
|
||||
// console.error(`❌ [WebSocket] Ошибка в обработчике события ${event}:`, error);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
console.log('🔌 [WebSocket] Нет слушателей для события:', event);
|
||||
// console.log('🔌 [WebSocket] Нет слушателей для события:', event);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -233,7 +209,7 @@ class WebSocketService {
|
||||
}
|
||||
this.isConnected = false;
|
||||
this.listeners.clear();
|
||||
console.log('🔌 [WebSocket] Отключен');
|
||||
// console.log('🔌 [WebSocket] Отключен');
|
||||
}
|
||||
|
||||
// Получение статуса соединения
|
||||
@@ -249,7 +225,7 @@ class WebSocketService {
|
||||
|
||||
// Создаем единственный экземпляр
|
||||
const websocketService = new WebSocketService();
|
||||
console.log('🔌 [WebSocket] Сервис создан');
|
||||
// console.log('🔌 [WebSocket] Сервис создан');
|
||||
|
||||
// Подписчики на обновления таблиц: tableId -> [callback]
|
||||
const tableUpdateSubscribers = {};
|
||||
@@ -269,17 +245,17 @@ export default {
|
||||
websocketService,
|
||||
onTableUpdate,
|
||||
};
|
||||
console.log('🔌 [WebSocket] Экспорт завершен');
|
||||
// console.log('🔌 [WebSocket] Экспорт завершен');
|
||||
|
||||
// Автоматически подключаемся при загрузке модуля
|
||||
console.log('🔌 [WebSocket] Автоматическое подключение...');
|
||||
// console.log('🔌 [WebSocket] Автоматическое подключение...');
|
||||
setTimeout(() => {
|
||||
console.log('🔌 [WebSocket] Подключаемся через 1 секунду...');
|
||||
// console.log('🔌 [WebSocket] Подключаемся через 1 секунду...');
|
||||
websocketService.connect();
|
||||
}, 1000);
|
||||
|
||||
// Добавляем периодическую проверку состояния соединения
|
||||
setInterval(() => {
|
||||
const status = websocketService.getStatus();
|
||||
console.log('🔌 [WebSocket] Статус соединения:', status);
|
||||
// console.log('🔌 [WebSocket] Статус соединения:', status);
|
||||
}, 10000); // Проверяем каждые 10 секунд
|
||||
@@ -17,7 +17,7 @@ export const isLocalStorageAvailable = () => {
|
||||
window.localStorage.removeItem(test);
|
||||
return true;
|
||||
} catch (e) {
|
||||
console.error('localStorage is not available:', e);
|
||||
// console.error('localStorage is not available:', e);
|
||||
return false;
|
||||
}
|
||||
};
|
||||
@@ -33,7 +33,7 @@ export const getFromStorage = (key, defaultValue = null) => {
|
||||
return item || defaultValue;
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(`Error getting ${key} from localStorage:`, e);
|
||||
// console.error(`Error getting ${key} from localStorage:`, e);
|
||||
return defaultValue;
|
||||
}
|
||||
};
|
||||
@@ -48,7 +48,7 @@ export const setToStorage = (key, value) => {
|
||||
window.localStorage.setItem(key, valueToStore);
|
||||
return true;
|
||||
} catch (e) {
|
||||
console.error(`Error setting ${key} in localStorage:`, e);
|
||||
// console.error(`Error setting ${key} in localStorage:`, e);
|
||||
return false;
|
||||
}
|
||||
};
|
||||
@@ -59,7 +59,7 @@ export const removeFromStorage = (key) => {
|
||||
window.localStorage.removeItem(key);
|
||||
return true;
|
||||
} catch (e) {
|
||||
console.error(`Error removing ${key} from localStorage:`, e);
|
||||
// console.error(`Error removing ${key} from localStorage:`, e);
|
||||
return false;
|
||||
}
|
||||
};
|
||||
@@ -16,11 +16,11 @@ import { SiweMessage } from 'siwe';
|
||||
|
||||
export const connectWallet = async () => {
|
||||
try {
|
||||
console.log('Starting wallet connection...');
|
||||
// console.log('Starting wallet connection...');
|
||||
|
||||
// Проверяем наличие MetaMask или другого Ethereum провайдера
|
||||
if (!window.ethereum) {
|
||||
console.error('No Ethereum provider (like MetaMask) detected!');
|
||||
// console.error('No Ethereum provider (like MetaMask) detected!');
|
||||
return {
|
||||
success: false,
|
||||
error:
|
||||
@@ -28,11 +28,11 @@ export const connectWallet = async () => {
|
||||
};
|
||||
}
|
||||
|
||||
console.log('MetaMask detected, requesting accounts...');
|
||||
// console.log('MetaMask detected, requesting accounts...');
|
||||
|
||||
// Запрашиваем доступ к аккаунтам
|
||||
const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' });
|
||||
console.log('Got accounts:', accounts);
|
||||
// console.log('Got accounts:', accounts);
|
||||
|
||||
if (!accounts || accounts.length === 0) {
|
||||
return {
|
||||
@@ -45,13 +45,13 @@ export const connectWallet = async () => {
|
||||
const address = accounts[0];
|
||||
// Нормализуем адрес (приводим к нижнему регистру для последующих сравнений)
|
||||
const normalizedAddress = ethers.utils.getAddress(address);
|
||||
console.log('Normalized address:', normalizedAddress);
|
||||
// console.log('Normalized address:', normalizedAddress);
|
||||
|
||||
// Запрашиваем nonce с сервера
|
||||
console.log('Requesting nonce...');
|
||||
// console.log('Requesting nonce...');
|
||||
const nonceResponse = await axios.get(`/auth/nonce?address=${normalizedAddress}`);
|
||||
const nonce = nonceResponse.data.nonce;
|
||||
console.log('Got nonce:', nonce);
|
||||
// console.log('Got nonce:', nonce);
|
||||
|
||||
if (!nonce) {
|
||||
return {
|
||||
@@ -83,10 +83,10 @@ export const connectWallet = async () => {
|
||||
|
||||
// Получаем строку сообщения для подписи
|
||||
const messageToSign = message.prepareMessage();
|
||||
console.log('SIWE message:', messageToSign);
|
||||
// console.log('SIWE message:', messageToSign);
|
||||
|
||||
// Запрашиваем подпись
|
||||
console.log('Requesting signature...');
|
||||
// console.log('Requesting signature...');
|
||||
const signature = await signer.signMessage(messageToSign);
|
||||
|
||||
if (!signature) {
|
||||
@@ -96,17 +96,17 @@ export const connectWallet = async () => {
|
||||
};
|
||||
}
|
||||
|
||||
console.log('Got signature:', signature);
|
||||
// console.log('Got signature:', signature);
|
||||
|
||||
// Отправляем верификацию на сервер
|
||||
console.log('Sending verification request...');
|
||||
// console.log('Sending verification request...');
|
||||
const requestData = {
|
||||
address: normalizedAddress,
|
||||
signature,
|
||||
nonce,
|
||||
issuedAt: new Date().toISOString(),
|
||||
};
|
||||
console.log('Request data:', requestData);
|
||||
// console.log('Request data:', requestData);
|
||||
|
||||
const verifyResponse = await axios.post('/api/auth/verify', requestData, {
|
||||
withCredentials: true,
|
||||
@@ -130,7 +130,7 @@ export const connectWallet = async () => {
|
||||
if (authButtonsEl) authButtonsEl.style.display = 'none';
|
||||
if (logoutButtonEl) logoutButtonEl.style.display = 'inline-block';
|
||||
|
||||
console.log('Verification response:', verifyResponse.data);
|
||||
// console.log('Verification response:', verifyResponse.data);
|
||||
|
||||
if (verifyResponse.data.success) {
|
||||
return {
|
||||
@@ -146,7 +146,7 @@ export const connectWallet = async () => {
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error connecting wallet:', error);
|
||||
// console.error('Error connecting wallet:', error);
|
||||
|
||||
// Формируем понятное сообщение об ошибке
|
||||
let errorMessage = 'Произошла ошибка при подключении кошелька.';
|
||||
|
||||
@@ -93,24 +93,24 @@ function connectWebSocket() {
|
||||
const wsProtocol = window.location.protocol === 'https:' ? 'wss' : 'ws';
|
||||
ws = new WebSocket(`${wsProtocol}://${window.location.host}/ws`);
|
||||
ws.onopen = () => {
|
||||
console.log('[CRM] WebSocket соединение установлено');
|
||||
// console.log('[CRM] WebSocket соединение установлено');
|
||||
};
|
||||
ws.onmessage = (event) => {
|
||||
try {
|
||||
const msg = JSON.parse(event.data);
|
||||
if (msg.type === 'contacts-updated') {
|
||||
console.log('[CRM] Получено событие contacts-updated, обновляем контакты');
|
||||
// console.log('[CRM] Получено событие contacts-updated, обновляем контакты');
|
||||
loadContacts();
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('[CRM] Ошибка обработки сообщения WebSocket:', e);
|
||||
// console.error('[CRM] Ошибка обработки сообщения WebSocket:', e);
|
||||
}
|
||||
};
|
||||
ws.onclose = () => {
|
||||
console.log('[CRM] WebSocket соединение закрыто');
|
||||
// console.log('[CRM] WebSocket соединение закрыто');
|
||||
};
|
||||
ws.onerror = (e) => {
|
||||
console.error('[CRM] WebSocket ошибка:', e);
|
||||
// console.error('[CRM] WebSocket ошибка:', e);
|
||||
};
|
||||
}
|
||||
|
||||
@@ -136,7 +136,7 @@ const loadDLEs = async () => {
|
||||
selectedDleIndex.value = 0;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Ошибка при загрузке списка DLE:', error);
|
||||
// console.error('Ошибка при загрузке списка DLE:', error);
|
||||
} finally {
|
||||
isLoading.value = false;
|
||||
}
|
||||
@@ -144,7 +144,7 @@ const loadDLEs = async () => {
|
||||
|
||||
// Обработчик события изменения авторизации
|
||||
const handleAuthEvent = (eventData) => {
|
||||
console.log('[CrmView] Получено событие изменения авторизации:', eventData);
|
||||
// console.log('[CrmView] Получено событие изменения авторизации:', eventData);
|
||||
if (eventData.isAuthenticated) {
|
||||
loadDLEs();
|
||||
}
|
||||
@@ -154,7 +154,7 @@ const handleAuthEvent = (eventData) => {
|
||||
let unsubscribe = null;
|
||||
|
||||
onMounted(() => {
|
||||
console.log('[CrmView] Компонент загружен');
|
||||
// console.log('[CrmView] Компонент загружен');
|
||||
|
||||
// Если пользователь авторизован, загружаем данные
|
||||
if (auth.isAuthenticated.value) {
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
import BaseLayout from '../components/BaseLayout.vue';
|
||||
import ChatInterface from '../components/ChatInterface.vue';
|
||||
|
||||
console.log('HomeView.vue: Using BaseLayout');
|
||||
// console.log('HomeView.vue: Using BaseLayout');
|
||||
|
||||
// Определяем props, переданные из App.vue через RouterView
|
||||
const props = defineProps({
|
||||
@@ -99,7 +99,7 @@
|
||||
let unsubscribe = null;
|
||||
|
||||
onMounted(() => {
|
||||
console.log('[HomeView] Компонент загружен (обновленная версия)');
|
||||
// console.log('[HomeView] Компонент загружен (обновленная версия)');
|
||||
|
||||
// Подписка на события авторизации
|
||||
unsubscribe = eventBus.on('auth-state-changed', handleAuthEvent);
|
||||
@@ -118,7 +118,7 @@
|
||||
|
||||
// Функция обновления сообщений после авторизации
|
||||
const handleAuthEvent = async (eventData) => {
|
||||
console.log('[HomeView] Получено событие изменения авторизации:', eventData);
|
||||
// console.log('[HomeView] Получено событие изменения авторизации:', eventData);
|
||||
if (eventData.isAuthenticated) {
|
||||
// Сначала связываем гостевые сообщения, если есть
|
||||
await linkGuestMessagesAfterAuth();
|
||||
|
||||
@@ -58,7 +58,7 @@ async function loadContact() {
|
||||
error.value = 'Контакт не найден';
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('Ошибка загрузки контакта:', e);
|
||||
// console.error('Ошибка загрузки контакта:', e);
|
||||
contact.value = null;
|
||||
error.value = 'Контакт не найден';
|
||||
} finally {
|
||||
@@ -72,7 +72,7 @@ async function deleteContact() {
|
||||
error.value = '';
|
||||
try {
|
||||
const result = await contactsService.deleteContact(contact.value.id);
|
||||
console.log('Результат удаления:', result);
|
||||
// console.log('Результат удаления:', result);
|
||||
|
||||
// Если удаление успешно или пользователь уже удален
|
||||
if (result.success || result.message === 'Пользователь уже удален') {
|
||||
@@ -81,7 +81,7 @@ async function deleteContact() {
|
||||
error.value = 'Ошибка при удалении контакта';
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('Ошибка при удалении:', e);
|
||||
// console.error('Ошибка при удалении:', e);
|
||||
error.value = 'Ошибка при удалении контакта';
|
||||
} finally {
|
||||
isDeleting.value = false;
|
||||
|
||||
@@ -470,9 +470,9 @@ async function handleSendMessage({ message, attachments }) {
|
||||
}
|
||||
|
||||
async function handleAiReply(selectedMessages = []) {
|
||||
console.log('[AI-ASSISTANT] Кнопка нажата, messages:', messages.value);
|
||||
// console.log('[AI-ASSISTANT] Кнопка нажата, messages:', messages.value);
|
||||
if (isAiLoading.value) {
|
||||
console.log('[AI-ASSISTANT] Уже идёт генерация, выход');
|
||||
// console.log('[AI-ASSISTANT] Уже идёт генерация, выход');
|
||||
return;
|
||||
}
|
||||
if (!Array.isArray(selectedMessages) || selectedMessages.length === 0) {
|
||||
@@ -485,7 +485,7 @@ async function handleAiReply(selectedMessages = []) {
|
||||
const draftResp = await messagesService.generateAiDraft(conversationId.value, selectedMessages);
|
||||
if (draftResp && draftResp.success && draftResp.aiMessage) {
|
||||
chatNewMessage.value = draftResp.aiMessage;
|
||||
console.log('[AI-ASSISTANT] Черновик сгенерирован:', draftResp.aiMessage);
|
||||
// console.log('[AI-ASSISTANT] Черновик сгенерирован:', draftResp.aiMessage);
|
||||
} else {
|
||||
alert('Не удалось сгенерировать ответ ИИ.');
|
||||
}
|
||||
@@ -493,7 +493,7 @@ async function handleAiReply(selectedMessages = []) {
|
||||
alert('Ошибка генерации ответа ИИ: ' + (e?.message || e));
|
||||
} finally {
|
||||
isAiLoading.value = false;
|
||||
console.log('[AI-ASSISTANT] Генерация завершена');
|
||||
// console.log('[AI-ASSISTANT] Генерация завершена');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -536,9 +536,9 @@ async function createTag() {
|
||||
const descCol = table.columns[1];
|
||||
// 1. Создаём строку
|
||||
const newRow = await tablesService.addRow(tableId);
|
||||
console.log('DEBUG newRow:', newRow);
|
||||
// console.log('DEBUG newRow:', newRow);
|
||||
if (!newRow || !newRow.id) {
|
||||
console.error('Ошибка: не удалось получить id новой строки', newRow);
|
||||
// console.error('Ошибка: не удалось получить id новой строки', newRow);
|
||||
alert('Ошибка: не удалось получить id новой строки. См. консоль.');
|
||||
return;
|
||||
}
|
||||
@@ -618,7 +618,7 @@ onMounted(async () => {
|
||||
|
||||
// Подписываемся на обновления тегов
|
||||
unsubscribeFromTags = onTagsUpdate(async () => {
|
||||
console.log('[ContactDetailsView] Получено обновление тегов, перезагружаем списки тегов');
|
||||
// console.log('[ContactDetailsView] Получено обновление тегов, перезагружаем списки тегов');
|
||||
await loadAllTags();
|
||||
await loadUserTags();
|
||||
});
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1006,10 +1006,10 @@ const getOkvedLevel = (code) => {
|
||||
|
||||
// Функция для загрузки ОКВЭД кодов определенного уровня
|
||||
const fetchOkvedCodes = async (level, parentCode, optionsRef, loadingRef) => {
|
||||
console.log(`🔍 fetchOkvedCodes вызвана: level=${level}, parentCode=${parentCode || 'root'}`);
|
||||
// console.log(`🔍 fetchOkvedCodes вызвана: level=${level}, parentCode=${parentCode || 'root'}`);
|
||||
|
||||
if (!optionsRef || !loadingRef) {
|
||||
console.error('[DleDeployForm] fetchOkvedCodes requires optionsRef and loadingRef');
|
||||
// console.error('[DleDeployForm] fetchOkvedCodes requires optionsRef and loadingRef');
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1017,8 +1017,8 @@ const fetchOkvedCodes = async (level, parentCode, optionsRef, loadingRef) => {
|
||||
optionsRef.value = [];
|
||||
|
||||
try {
|
||||
console.log(`[DleDeployForm] Загрузка ОКВЭД уровень ${level}, родитель: ${parentCode || 'root'}`);
|
||||
console.log(`[DleDeployForm] Доступно ОКВЭД кодов: ${russianClassifiers.okved?.length || 0}`);
|
||||
// console.log(`[DleDeployForm] Загрузка ОКВЭД уровень ${level}, родитель: ${parentCode || 'root'}`);
|
||||
// console.log(`[DleDeployForm] Доступно ОКВЭД кодов: ${russianClassifiers.okved?.length || 0}`);
|
||||
|
||||
// Фильтруем коды из уже загруженных данных
|
||||
let filteredCodes = [];
|
||||
@@ -1042,11 +1042,11 @@ const fetchOkvedCodes = async (level, parentCode, optionsRef, loadingRef) => {
|
||||
text: `${code.code} - ${code.title}`
|
||||
}));
|
||||
|
||||
console.log(`[DleDeployForm] Загружено ОКВЭД кодов уровня ${level}: ${optionsRef.value.length}`);
|
||||
console.log(`[DleDeployForm] Первые 3 кода:`, optionsRef.value.slice(0, 3));
|
||||
// console.log(`[DleDeployForm] Загружено ОКВЭД кодов уровня ${level}: ${optionsRef.value.length}`);
|
||||
// console.log(`[DleDeployForm] Первые 3 кода:`, optionsRef.value.slice(0, 3));
|
||||
|
||||
} catch (error) {
|
||||
console.error('[DleDeployForm] Ошибка при загрузке ОКВЭД кодов:', error);
|
||||
// console.error('[DleDeployForm] Ошибка при загрузке ОКВЭД кодов:', error);
|
||||
} finally {
|
||||
loadingRef.value = false;
|
||||
}
|
||||
@@ -1083,7 +1083,7 @@ const updateCurrentOkvedSelection = () => {
|
||||
|
||||
// Watchers для 2-уровневой загрузки ОКВЭД
|
||||
watch(selectedOkvedLevel1, (newVal) => {
|
||||
console.log('[DleDeployForm] selectedOkvedLevel1 changed to:', newVal);
|
||||
// console.log('[DleDeployForm] selectedOkvedLevel1 changed to:', newVal);
|
||||
selectedOkvedLevel2.value = '';
|
||||
okvedLevel2Options.value = [];
|
||||
|
||||
@@ -1094,7 +1094,7 @@ watch(selectedOkvedLevel1, (newVal) => {
|
||||
});
|
||||
|
||||
watch(selectedOkvedLevel2, () => {
|
||||
console.log('[DleDeployForm] selectedOkvedLevel2 changed to:', selectedOkvedLevel2.value);
|
||||
// console.log('[DleDeployForm] selectedOkvedLevel2 changed to:', selectedOkvedLevel2.value);
|
||||
updateCurrentOkvedSelection();
|
||||
});
|
||||
|
||||
@@ -1297,9 +1297,9 @@ const saveFormData = () => {
|
||||
showUnifiedKey: showUnifiedKey.value
|
||||
};
|
||||
localStorage.setItem(STORAGE_KEY, JSON.stringify(dataToSave));
|
||||
console.log('[DleDeployForm] Данные формы сохранены в localStorage');
|
||||
// console.log('[DleDeployForm] Данные формы сохранены в localStorage');
|
||||
} catch (error) {
|
||||
console.error('[DleDeployForm] Ошибка сохранения данных:', error);
|
||||
// console.error('[DleDeployForm] Ошибка сохранения данных:', error);
|
||||
}
|
||||
}, 500); // Задержка 500мс
|
||||
};
|
||||
@@ -1362,11 +1362,11 @@ const loadFormData = () => {
|
||||
Object.assign(keyValidation, parsedData.keyValidation || {});
|
||||
showUnifiedKey.value = parsedData.showUnifiedKey || false;
|
||||
|
||||
console.log('[DleDeployForm] Данные формы восстановлены из localStorage');
|
||||
// console.log('[DleDeployForm] Данные формы восстановлены из localStorage');
|
||||
return true;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('[DleDeployForm] Ошибка восстановления данных:', error);
|
||||
// console.error('[DleDeployForm] Ошибка восстановления данных:', error);
|
||||
}
|
||||
return false;
|
||||
};
|
||||
@@ -1375,9 +1375,9 @@ const loadFormData = () => {
|
||||
const clearStoredData = () => {
|
||||
try {
|
||||
localStorage.removeItem(STORAGE_KEY);
|
||||
console.log('[DleDeployForm] Данные формы удалены из localStorage');
|
||||
// console.log('[DleDeployForm] Данные формы удалены из localStorage');
|
||||
} catch (error) {
|
||||
console.error('[DleDeployForm] Ошибка очистки localStorage:', error);
|
||||
// console.error('[DleDeployForm] Ошибка очистки localStorage:', error);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1463,7 +1463,7 @@ const searchByPostalCode = async () => {
|
||||
params.append('countrycodes', 'RU');
|
||||
}
|
||||
|
||||
console.log(`[SearchByPostalCode] Querying Nominatim: ${params.toString()}`);
|
||||
// console.log(`[SearchByPostalCode] Querying Nominatim: ${params.toString()}`);
|
||||
const response = await axios.get(`/geocoding/nominatim-search?${params.toString()}`);
|
||||
|
||||
if (response.data && Array.isArray(response.data) && response.data.length > 0) {
|
||||
@@ -1483,18 +1483,18 @@ const searchByPostalCode = async () => {
|
||||
rawData: result.address // Сохраняем все сырые данные для анализа
|
||||
}));
|
||||
|
||||
console.log(`[SearchByPostalCode] Found ${searchResults.value.length} results`);
|
||||
// console.log(`[SearchByPostalCode] Found ${searchResults.value.length} results`);
|
||||
|
||||
// Автоматически заполняем поля первым результатом
|
||||
if (searchResults.value.length > 0) {
|
||||
fillFromSearchResult(searchResults.value[0]);
|
||||
console.log('[SearchByPostalCode] Auto-filled with first result');
|
||||
// console.log('[SearchByPostalCode] Auto-filled with first result');
|
||||
}
|
||||
} else {
|
||||
console.log('[SearchByPostalCode] No results found');
|
||||
// console.log('[SearchByPostalCode] No results found');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Ошибка при поиске по индексу:', error);
|
||||
// console.error('Ошибка при поиске по индексу:', error);
|
||||
} finally {
|
||||
isSearchingAddress.value = false;
|
||||
}
|
||||
@@ -1509,7 +1509,7 @@ const findOktmoByAddress = (result) => {
|
||||
return '';
|
||||
}
|
||||
|
||||
console.log(`[FindOktmo] Searching OKTMO for region: "${region}"`);
|
||||
// console.log(`[FindOktmo] Searching OKTMO for region: "${region}"`);
|
||||
|
||||
// Ищем совпадение по названию региона
|
||||
const foundOktmo = russianClassifiers.oktmo.find(oktmo => {
|
||||
@@ -1523,11 +1523,11 @@ const findOktmoByAddress = (result) => {
|
||||
});
|
||||
|
||||
if (foundOktmo) {
|
||||
console.log(`[FindOktmo] Found OKTMO: ${foundOktmo.code} - ${foundOktmo.title}`);
|
||||
// console.log(`[FindOktmo] Found OKTMO: ${foundOktmo.code} - ${foundOktmo.title}`);
|
||||
return foundOktmo.code;
|
||||
}
|
||||
|
||||
console.log(`[FindOktmo] No OKTMO found for region: "${region}"`);
|
||||
// console.log(`[FindOktmo] No OKTMO found for region: "${region}"`);
|
||||
return '';
|
||||
};
|
||||
|
||||
@@ -1549,13 +1549,13 @@ const fillFromSearchResult = (result) => {
|
||||
if (autoOktmo) {
|
||||
dleSettings.selectedOktmo = autoOktmo;
|
||||
autoSelectedOktmo.value = true; // Помечаем как автовыбранный
|
||||
console.log(`[FillFromSearchResult] Auto-selected OKTMO: ${autoOktmo}`);
|
||||
// console.log(`[FillFromSearchResult] Auto-selected OKTMO: ${autoOktmo}`);
|
||||
} else {
|
||||
autoSelectedOktmo.value = false;
|
||||
}
|
||||
|
||||
console.log('[FillFromSearchResult] Filled address data:', dleSettings.addressData);
|
||||
console.log('[FillFromSearchResult] Saved API result:', result);
|
||||
// console.log('[FillFromSearchResult] Filled address data:', dleSettings.addressData);
|
||||
// console.log('[FillFromSearchResult] Saved API result:', result);
|
||||
};
|
||||
|
||||
// Проверка адреса (повторный запрос для валидации)
|
||||
|
||||
@@ -99,15 +99,15 @@ function validatePrivateKey(key) {
|
||||
if (!key) return false;
|
||||
const trimmed = key.trim();
|
||||
if (!trimmed.startsWith('-----BEGIN OPENSSH PRIVATE KEY-----')) {
|
||||
console.error('Ключ не начинается с -----BEGIN OPENSSH PRIVATE KEY-----');
|
||||
// console.error('Ключ не начинается с -----BEGIN OPENSSH PRIVATE KEY-----');
|
||||
return false;
|
||||
}
|
||||
if (!trimmed.endsWith('-----END OPENSSH PRIVATE KEY-----')) {
|
||||
console.error('Ключ не заканчивается на -----END OPENSSH PRIVATE KEY-----');
|
||||
// console.error('Ключ не заканчивается на -----END OPENSSH PRIVATE KEY-----');
|
||||
return false;
|
||||
}
|
||||
if (trimmed.split('\n').length < 3) {
|
||||
console.error('Ключ слишком короткий или не содержит переносов строк');
|
||||
// console.error('Ключ слишком короткий или не содержит переносов строк');
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@@ -124,15 +124,15 @@ const handleSubmit = async () => {
|
||||
}
|
||||
|
||||
// Логирование ключа (только для отладки!)
|
||||
console.log('SSH ключ (начало):', form.sshKey.slice(0, 40));
|
||||
console.log('SSH ключ (конец):', form.sshKey.slice(-40));
|
||||
console.log('Длина ключа:', form.sshKey.length);
|
||||
// console.log('SSH ключ (начало):', form.sshKey.slice(0, 40));
|
||||
// console.log('SSH ключ (конец):', form.sshKey.slice(-40));
|
||||
// console.log('Длина ключа:', form.sshKey.length);
|
||||
|
||||
// Логирование отправляемых данных (без самого ключа)
|
||||
console.log('Данные для агента:', {
|
||||
...form,
|
||||
sshKey: form.sshKey ? `[скрыто, длина: ${form.sshKey.length}]` : 'нет ключа'
|
||||
});
|
||||
// console.log('Данные для агента:', {
|
||||
// ...form,
|
||||
// sshKey: form.sshKey ? `[скрыто, длина: ${form.sshKey.length}]` : 'нет ключа'
|
||||
// });
|
||||
|
||||
isLoading.value = true;
|
||||
addLog('info', 'Запуск публикации...');
|
||||
@@ -228,7 +228,7 @@ const checkConnectionStatus = async () => {
|
||||
? `Подключено к ${status.domain}`
|
||||
: 'Не подключено';
|
||||
} catch (error) {
|
||||
console.error('Ошибка проверки статуса:', error);
|
||||
// console.error('Ошибка проверки статуса:', error);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -467,7 +467,7 @@ async function addModule() {
|
||||
alert('✅ Модуль успешно добавлен!');
|
||||
|
||||
} catch (error) {
|
||||
console.error('Ошибка при добавлении модуля:', error);
|
||||
// console.error('Ошибка при добавлении модуля:', error);
|
||||
alert('❌ Ошибка при добавлении модуля: ' + error.message);
|
||||
} finally {
|
||||
isAdding.value = false;
|
||||
@@ -486,7 +486,7 @@ async function removeModule(moduleId) {
|
||||
alert('✅ Модуль успешно удален!');
|
||||
|
||||
} catch (error) {
|
||||
console.error('Ошибка при удалении модуля:', error);
|
||||
// console.error('Ошибка при удалении модуля:', error);
|
||||
alert('❌ Ошибка при удалении модуля: ' + error.message);
|
||||
}
|
||||
}
|
||||
@@ -495,7 +495,7 @@ async function removeModule(moduleId) {
|
||||
async function installAvailableModule(availableModule) {
|
||||
// Здесь должна быть логика установки модуля
|
||||
// Например, деплой модуля и добавление в DLE
|
||||
console.log('Установка модуля:', availableModule);
|
||||
// console.log('Установка модуля:', availableModule);
|
||||
alert(`Модуль "${availableModule.name}" будет установлен`);
|
||||
}
|
||||
|
||||
|
||||
@@ -454,7 +454,7 @@ async function createMultisigOperation() {
|
||||
alert('✅ Операция мультиподписи успешно создана!');
|
||||
|
||||
} catch (error) {
|
||||
console.error('Ошибка при создании операции мультиподписи:', error);
|
||||
// console.error('Ошибка при создании операции мультиподписи:', error);
|
||||
alert('❌ Ошибка при создании операции: ' + error.message);
|
||||
} finally {
|
||||
isCreating.value = false;
|
||||
@@ -471,7 +471,7 @@ async function signOperation(operationId, support) {
|
||||
alert('✅ Ваша подпись учтена!');
|
||||
|
||||
} catch (error) {
|
||||
console.error('Ошибка при подписании операции:', error);
|
||||
// console.error('Ошибка при подписании операции:', error);
|
||||
alert('❌ Ошибка при подписании: ' + error.message);
|
||||
}
|
||||
}
|
||||
@@ -486,7 +486,7 @@ async function executeOperation(operationId) {
|
||||
alert('✅ Операция успешно исполнена!');
|
||||
|
||||
} catch (error) {
|
||||
console.error('Ошибка при исполнении операции:', error);
|
||||
// console.error('Ошибка при исполнении операции:', error);
|
||||
alert('❌ Ошибка при исполнении операции: ' + error.message);
|
||||
}
|
||||
}
|
||||
@@ -498,7 +498,7 @@ async function loadOperations() {
|
||||
// Пока используем заглушку
|
||||
operations.value = [];
|
||||
} catch (error) {
|
||||
console.error('Ошибка при загрузке операций:', error);
|
||||
// console.error('Ошибка при загрузке операций:', error);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -520,7 +520,7 @@ function resetForm() {
|
||||
|
||||
function viewOperationDetails(operationId) {
|
||||
// Открыть модальное окно с деталями операции
|
||||
console.log('Просмотр деталей операции:', operationId);
|
||||
// console.log('Просмотр деталей операции:', operationId);
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
|
||||
@@ -497,7 +497,7 @@ async function createProposal() {
|
||||
alert('✅ Предложение успешно создано!');
|
||||
|
||||
} catch (error) {
|
||||
console.error('Ошибка при создании предложения:', error);
|
||||
// console.error('Ошибка при создании предложения:', error);
|
||||
alert('❌ Ошибка при создании предложения: ' + error.message);
|
||||
} finally {
|
||||
isCreating.value = false;
|
||||
@@ -555,7 +555,7 @@ async function voteForProposal(proposalId, support) {
|
||||
alert('✅ Ваш голос учтен!');
|
||||
|
||||
} catch (error) {
|
||||
console.error('Ошибка при голосовании:', error);
|
||||
// console.error('Ошибка при голосовании:', error);
|
||||
alert('❌ Ошибка при голосовании: ' + error.message);
|
||||
}
|
||||
}
|
||||
@@ -570,7 +570,7 @@ async function executeProposal(proposalId) {
|
||||
alert('✅ Предложение успешно исполнено!');
|
||||
|
||||
} catch (error) {
|
||||
console.error('Ошибка при исполнении предложения:', error);
|
||||
// console.error('Ошибка при исполнении предложения:', error);
|
||||
alert('❌ Ошибка при исполнении предложения: ' + error.message);
|
||||
}
|
||||
}
|
||||
@@ -582,7 +582,7 @@ async function loadProposals() {
|
||||
// Пока используем заглушку
|
||||
proposals.value = [];
|
||||
} catch (error) {
|
||||
console.error('Ошибка при загрузке предложений:', error);
|
||||
// console.error('Ошибка при загрузке предложений:', error);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -603,7 +603,7 @@ function resetForm() {
|
||||
|
||||
function viewProposalDetails(proposalId) {
|
||||
// Открыть модальное окно с деталями предложения
|
||||
console.log('Просмотр деталей предложения:', proposalId);
|
||||
// console.log('Просмотр деталей предложения:', proposalId);
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
|
||||
@@ -200,7 +200,7 @@ const createProposal = async () => {
|
||||
isCreatingProposal.value = true;
|
||||
|
||||
// Здесь будет создание предложения в смарт-контракте
|
||||
console.log('Создание предложения:', newProposal.value);
|
||||
// console.log('Создание предложения:', newProposal.value);
|
||||
|
||||
// Временная логика
|
||||
const proposal = {
|
||||
@@ -225,7 +225,7 @@ const createProposal = async () => {
|
||||
};
|
||||
|
||||
} catch (error) {
|
||||
console.error('Ошибка создания предложения:', error);
|
||||
// console.error('Ошибка создания предложения:', error);
|
||||
} finally {
|
||||
isCreatingProposal.value = false;
|
||||
}
|
||||
@@ -238,7 +238,7 @@ const signProposal = async (proposalId) => {
|
||||
isSigning.value = true;
|
||||
|
||||
// Здесь будет подписание предложения в смарт-контракте
|
||||
console.log('Подписание предложения:', proposalId);
|
||||
// console.log('Подписание предложения:', proposalId);
|
||||
|
||||
const proposal = proposals.value.find(p => p.id === proposalId);
|
||||
if (proposal) {
|
||||
@@ -247,7 +247,7 @@ const signProposal = async (proposalId) => {
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.error('Ошибка подписания предложения:', error);
|
||||
// console.error('Ошибка подписания предложения:', error);
|
||||
} finally {
|
||||
isSigning.value = false;
|
||||
}
|
||||
@@ -260,7 +260,7 @@ const executeProposal = async (proposalId) => {
|
||||
isExecuting.value = true;
|
||||
|
||||
// Здесь будет выполнение предложения в смарт-контракте
|
||||
console.log('Выполнение предложения:', proposalId);
|
||||
// console.log('Выполнение предложения:', proposalId);
|
||||
|
||||
const proposal = proposals.value.find(p => p.id === proposalId);
|
||||
if (proposal) {
|
||||
@@ -268,7 +268,7 @@ const executeProposal = async (proposalId) => {
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.error('Ошибка выполнения предложения:', error);
|
||||
// console.error('Ошибка выполнения предложения:', error);
|
||||
} finally {
|
||||
isExecuting.value = false;
|
||||
}
|
||||
|
||||
@@ -246,7 +246,7 @@ const updateSettings = async () => {
|
||||
isUpdating.value = true;
|
||||
|
||||
// Здесь будет логика обновления настроек в смарт-контракте
|
||||
console.log('Обновление настроек:', newSettings.value);
|
||||
// console.log('Обновление настроек:', newSettings.value);
|
||||
|
||||
// Временная логика
|
||||
const change = {
|
||||
@@ -291,7 +291,7 @@ const updateSettings = async () => {
|
||||
alert('Настройки успешно обновлены!');
|
||||
|
||||
} catch (error) {
|
||||
console.error('Ошибка обновления настроек:', error);
|
||||
// console.error('Ошибка обновления настроек:', error);
|
||||
alert('Ошибка при обновлении настроек');
|
||||
} finally {
|
||||
isUpdating.value = false;
|
||||
|
||||
@@ -368,7 +368,7 @@ const saveMainSettings = async () => {
|
||||
isSaving.value = true;
|
||||
|
||||
// Здесь будет логика сохранения основных настроек
|
||||
console.log('Сохранение основных настроек:', mainSettings.value);
|
||||
// console.log('Сохранение основных настроек:', mainSettings.value);
|
||||
|
||||
// Временная логика
|
||||
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||
@@ -376,7 +376,7 @@ const saveMainSettings = async () => {
|
||||
alert('Основные настройки успешно сохранены!');
|
||||
|
||||
} catch (error) {
|
||||
console.error('Ошибка сохранения основных настроек:', error);
|
||||
// console.error('Ошибка сохранения основных настроек:', error);
|
||||
alert('Ошибка при сохранении настроек');
|
||||
} finally {
|
||||
isSaving.value = false;
|
||||
@@ -390,7 +390,7 @@ const saveSecuritySettings = async () => {
|
||||
isSaving.value = true;
|
||||
|
||||
// Здесь будет логика сохранения настроек безопасности
|
||||
console.log('Сохранение настроек безопасности:', securitySettings.value);
|
||||
// console.log('Сохранение настроек безопасности:', securitySettings.value);
|
||||
|
||||
// Временная логика
|
||||
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||
@@ -398,7 +398,7 @@ const saveSecuritySettings = async () => {
|
||||
alert('Настройки безопасности успешно сохранены!');
|
||||
|
||||
} catch (error) {
|
||||
console.error('Ошибка сохранения настроек безопасности:', error);
|
||||
// console.error('Ошибка сохранения настроек безопасности:', error);
|
||||
alert('Ошибка при сохранении настроек безопасности');
|
||||
} finally {
|
||||
isSaving.value = false;
|
||||
@@ -412,7 +412,7 @@ const saveNetworkSettings = async () => {
|
||||
isSaving.value = true;
|
||||
|
||||
// Здесь будет логика сохранения настроек сети
|
||||
console.log('Сохранение настроек сети:', networkSettings.value);
|
||||
// console.log('Сохранение настроек сети:', networkSettings.value);
|
||||
|
||||
// Временная логика
|
||||
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||
@@ -420,7 +420,7 @@ const saveNetworkSettings = async () => {
|
||||
alert('Настройки сети успешно сохранены!');
|
||||
|
||||
} catch (error) {
|
||||
console.error('Ошибка сохранения настроек сети:', error);
|
||||
// console.error('Ошибка сохранения настроек сети:', error);
|
||||
alert('Ошибка при сохранении настроек сети');
|
||||
} finally {
|
||||
isSaving.value = false;
|
||||
@@ -463,7 +463,7 @@ const importSettings = (event) => {
|
||||
|
||||
alert('Настройки успешно импортированы!');
|
||||
} catch (error) {
|
||||
console.error('Ошибка импорта настроек:', error);
|
||||
// console.error('Ошибка импорта настроек:', error);
|
||||
alert('Ошибка при импорте настроек');
|
||||
}
|
||||
};
|
||||
@@ -513,7 +513,7 @@ const deleteDLE = () => {
|
||||
}
|
||||
|
||||
// Здесь будет логика удаления DLE
|
||||
console.log('Удаление DLE...');
|
||||
// console.log('Удаление DLE...');
|
||||
alert('DLE будет удален. Это действие может занять некоторое время.');
|
||||
};
|
||||
</script>
|
||||
|
||||
@@ -245,7 +245,7 @@ const transferTokens = async () => {
|
||||
isTransferring.value = true;
|
||||
|
||||
// Здесь будет логика трансфера токенов
|
||||
console.log('Трансфер токенов:', transferData.value);
|
||||
// console.log('Трансфер токенов:', transferData.value);
|
||||
|
||||
// Временная логика
|
||||
const amount = parseFloat(transferData.value.amount);
|
||||
@@ -266,7 +266,7 @@ const transferTokens = async () => {
|
||||
alert('Токены успешно переведены!');
|
||||
|
||||
} catch (error) {
|
||||
console.error('Ошибка трансфера токенов:', error);
|
||||
// console.error('Ошибка трансфера токенов:', error);
|
||||
alert('Ошибка при переводе токенов');
|
||||
} finally {
|
||||
isTransferring.value = false;
|
||||
@@ -280,7 +280,7 @@ const distributeTokens = async () => {
|
||||
isDistributing.value = true;
|
||||
|
||||
// Здесь будет логика распределения токенов
|
||||
console.log('Распределение токенов:', distributionData.value);
|
||||
// console.log('Распределение токенов:', distributionData.value);
|
||||
|
||||
// Временная логика
|
||||
const totalAmount = distributionData.value.recipients.reduce((sum, recipient) => {
|
||||
@@ -303,7 +303,7 @@ const distributeTokens = async () => {
|
||||
alert('Токены успешно распределены!');
|
||||
|
||||
} catch (error) {
|
||||
console.error('Ошибка распределения токенов:', error);
|
||||
// console.error('Ошибка распределения токенов:', error);
|
||||
alert('Ошибка при распределении токенов');
|
||||
} finally {
|
||||
isDistributing.value = false;
|
||||
|
||||
@@ -380,7 +380,7 @@ const performDeposit = async () => {
|
||||
isProcessing.value = true;
|
||||
|
||||
// Здесь будет логика депозита
|
||||
console.log('Депозит:', depositData.value);
|
||||
// console.log('Депозит:', depositData.value);
|
||||
|
||||
// Временная логика
|
||||
const asset = assets.value.find(a => a.id === depositData.value.asset);
|
||||
@@ -414,7 +414,7 @@ const performDeposit = async () => {
|
||||
alert('Депозит успешно выполнен!');
|
||||
|
||||
} catch (error) {
|
||||
console.error('Ошибка депозита:', error);
|
||||
// console.error('Ошибка депозита:', error);
|
||||
alert('Ошибка при выполнении депозита');
|
||||
} finally {
|
||||
isProcessing.value = false;
|
||||
@@ -428,7 +428,7 @@ const performWithdraw = async () => {
|
||||
isProcessing.value = true;
|
||||
|
||||
// Здесь будет логика вывода
|
||||
console.log('Вывод:', withdrawData.value);
|
||||
// console.log('Вывод:', withdrawData.value);
|
||||
|
||||
// Временная логика
|
||||
const asset = assets.value.find(a => a.id === withdrawData.value.asset);
|
||||
@@ -469,7 +469,7 @@ const performWithdraw = async () => {
|
||||
alert('Вывод успешно выполнен!');
|
||||
|
||||
} catch (error) {
|
||||
console.error('Ошибка вывода:', error);
|
||||
// console.error('Ошибка вывода:', error);
|
||||
alert('Ошибка при выполнении вывода');
|
||||
} finally {
|
||||
isProcessing.value = false;
|
||||
|
||||
Reference in New Issue
Block a user