Исправлены проблемы с сохранением и убраны console.logs
This commit is contained in:
@@ -15,7 +15,7 @@ export interface UseFormulaAutoSaveOptions {
|
||||
|
||||
// Ключ для localStorage
|
||||
const getStorageKey = (templateId: string) => {
|
||||
console.log('🔑 Получен templateId:', templateId)
|
||||
// console.log('🔑 Получен templateId:', templateId)
|
||||
return `formula_data_${templateId}`
|
||||
}
|
||||
|
||||
@@ -58,7 +58,7 @@ export const useFormulaAutoSave = (
|
||||
const parsedData: SavedFormulaData = JSON.parse(savedDataStr)
|
||||
setSavedData(parsedData)
|
||||
versionCounter.current = parsedData.version + 1
|
||||
console.log(
|
||||
// console.log(
|
||||
'📂 Загружены сохраненные формулы (версия:',
|
||||
parsedData.version,
|
||||
')'
|
||||
@@ -73,7 +73,7 @@ export const useFormulaAutoSave = (
|
||||
const performSave = useCallback(
|
||||
async (data: Record<string, Record<string, any>>) => {
|
||||
if (Object.keys(data).length === 0) {
|
||||
console.log('📭 Нет данных для сохранения')
|
||||
// console.log('📭 Нет данных для сохранения')
|
||||
return
|
||||
}
|
||||
|
||||
@@ -110,7 +110,7 @@ export const useFormulaAutoSave = (
|
||||
setSavedData(savedData)
|
||||
setLastSavedRevision(revision)
|
||||
|
||||
console.log(
|
||||
// console.log(
|
||||
'💾 Сохранено формул:',
|
||||
Object.values(data).reduce(
|
||||
(sum, sheet) => sum + Object.keys(sheet).length,
|
||||
@@ -136,7 +136,7 @@ export const useFormulaAutoSave = (
|
||||
|
||||
// Автосохранение с дебаунсом
|
||||
const scheduleAutoSave = useCallback(() => {
|
||||
console.log('⏰ scheduleAutoSave вызван, проверяем условия:', {
|
||||
// console.log('⏰ scheduleAutoSave вызван, проверяем условия:', {
|
||||
enableAutoSave,
|
||||
isCalculating,
|
||||
isSaving,
|
||||
@@ -144,21 +144,21 @@ export const useFormulaAutoSave = (
|
||||
})
|
||||
|
||||
if (!enableAutoSave || isCalculating || isSaving || !templateId) {
|
||||
console.log('❌ Автосохранение отменено по условиям')
|
||||
// console.log('❌ Автосохранение отменено по условиям')
|
||||
return
|
||||
}
|
||||
|
||||
// Очищаем предыдущий таймер
|
||||
if (saveTimeoutRef.current) {
|
||||
clearTimeout(saveTimeoutRef.current)
|
||||
console.log('🔄 Очищен предыдущий таймер автосохранения')
|
||||
// console.log('🔄 Очищен предыдущий таймер автосохранения')
|
||||
}
|
||||
|
||||
console.log(`⏳ Запланировано автосохранение через ${autoSaveDelay}ms`)
|
||||
// console.log(`⏳ Запланировано автосохранение через ${autoSaveDelay}ms`)
|
||||
saveTimeoutRef.current = setTimeout(() => {
|
||||
console.log('🎯 Выполняем отложенное автосохранение')
|
||||
// console.log('🎯 Выполняем отложенное автосохранение')
|
||||
const currentData = getAllModifiedCells()
|
||||
console.log('📋 Данные для автосохранения:', currentData)
|
||||
// console.log('📋 Данные для автосохранения:', currentData)
|
||||
performSave(currentData)
|
||||
}, autoSaveDelay)
|
||||
}, [
|
||||
@@ -173,7 +173,7 @@ export const useFormulaAutoSave = (
|
||||
|
||||
// Эффект для автосохранения при изменениях
|
||||
useEffect(() => {
|
||||
console.log('🔍 Проверка условий автосохранения:', {
|
||||
// console.log('🔍 Проверка условий автосохранения:', {
|
||||
enableAutoSave,
|
||||
revision,
|
||||
lastSavedRevision,
|
||||
@@ -193,10 +193,10 @@ export const useFormulaAutoSave = (
|
||||
!isCalculating &&
|
||||
!isSaving
|
||||
) {
|
||||
console.log('✅ Планируем автосохранение...')
|
||||
// console.log('✅ Планируем автосохранение...')
|
||||
scheduleAutoSave()
|
||||
} else {
|
||||
console.log('⏸️ Автосохранение пропущено по условиям')
|
||||
// console.log('⏸️ Автосохранение пропущено по условиям')
|
||||
}
|
||||
}, [
|
||||
enableAutoSave,
|
||||
@@ -209,20 +209,20 @@ export const useFormulaAutoSave = (
|
||||
|
||||
// Ручное сохранение
|
||||
const manualSave = useCallback(() => {
|
||||
console.log('🖱️ Ручное сохранение вызвано')
|
||||
// console.log('🖱️ Ручное сохранение вызвано')
|
||||
|
||||
// Отменяем автосохранение если оно запланировано
|
||||
if (saveTimeoutRef.current) {
|
||||
clearTimeout(saveTimeoutRef.current)
|
||||
saveTimeoutRef.current = null
|
||||
console.log('⏹️ Отменено запланированное автосохранение')
|
||||
// console.log('⏹️ Отменено запланированное автосохранение')
|
||||
}
|
||||
|
||||
const currentData = getAllModifiedCells()
|
||||
console.log('📋 Данные для сохранения:', currentData)
|
||||
// console.log('📋 Данные для сохранения:', currentData)
|
||||
|
||||
if (Object.keys(currentData).length === 0) {
|
||||
console.log('📭 Нет измененных данных для сохранения')
|
||||
// console.log('📭 Нет измененных данных для сохранения')
|
||||
return
|
||||
}
|
||||
|
||||
@@ -243,7 +243,7 @@ export const useFormulaAutoSave = (
|
||||
if (savedDataStr) {
|
||||
const parsedData: SavedFormulaData = JSON.parse(savedDataStr)
|
||||
|
||||
console.log('📂 Формулы загружены из localStorage:', {
|
||||
// console.log('📂 Формулы загружены из localStorage:', {
|
||||
templateId,
|
||||
version: parsedData.version,
|
||||
timestamp: parsedData.timestamp,
|
||||
@@ -273,7 +273,7 @@ export const useFormulaAutoSave = (
|
||||
setLastSavedRevision(0)
|
||||
versionCounter.current = 1
|
||||
|
||||
console.log('🗑️ Сохраненные формулы очищены:', { templateId })
|
||||
// console.log('🗑️ Сохраненные формулы очищены:', { templateId })
|
||||
} catch (error) {
|
||||
console.error('❌ Ошибка при очистке сохраненных формул:', error)
|
||||
}
|
||||
|
||||
@@ -218,7 +218,7 @@ export function useMultiSheetEngine({
|
||||
const setTemplateData = useCallback(
|
||||
(data: Record<string, Record<string, any>>) => {
|
||||
templateDataRef.current = JSON.parse(JSON.stringify(data)) // Глубокая копия
|
||||
console.log('📋 Установлены данные шаблона:', templateDataRef.current)
|
||||
// console.log('📋 Установлены данные шаблона:', templateDataRef.current)
|
||||
},
|
||||
[]
|
||||
)
|
||||
@@ -267,14 +267,14 @@ export function useMultiSheetEngine({
|
||||
if (normalizedCurrent !== normalizedTemplate) {
|
||||
// Если текущего значения нет (ячейка очищена), отправляем ''
|
||||
modifiedSheet[cellAddress] = currentVal
|
||||
console.log(
|
||||
`🔧 Пользовательское изменение ${sheetName}:${cellAddress}:`,
|
||||
{
|
||||
template: normalizedTemplate,
|
||||
current: normalizedCurrent,
|
||||
value: currentVal,
|
||||
}
|
||||
)
|
||||
// console.log(
|
||||
// `🔧 Пользовательское изменение ${sheetName}:${cellAddress}:`,
|
||||
// {
|
||||
// template: normalizedTemplate,
|
||||
// current: normalizedCurrent,
|
||||
// value: currentVal,
|
||||
// }
|
||||
// )
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { useCallback, useEffect, useRef, useState } from 'react'
|
||||
import { useCallback, useEffect, useState } from 'react'
|
||||
import { useDebounce } from 'use-debounce'
|
||||
import {
|
||||
ApiSheet,
|
||||
createSheet,
|
||||
@@ -12,41 +13,13 @@ export interface UseSheetAutoSaveOptions {
|
||||
enableAutoSave?: boolean
|
||||
}
|
||||
|
||||
/**
|
||||
* Хук для автосохранения листов через API
|
||||
*
|
||||
* Функции:
|
||||
* - Автоматическое сохранение с дебаунсом при изменениях
|
||||
* - Ручное сохранение по требованию
|
||||
* - Создание и обновление листов через API
|
||||
* - Загрузка существующих листов
|
||||
*/
|
||||
// Утилита для извлечения UUID из templateId
|
||||
const extractUUID = (id: string): string => {
|
||||
// Если это уже чистый UUID, возвращаем как есть
|
||||
const uuidRegex =
|
||||
/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i
|
||||
if (uuidRegex.test(id)) {
|
||||
return id
|
||||
}
|
||||
|
||||
// Если есть префикс (например "template-"), извлекаем UUID
|
||||
const match = id.match(
|
||||
/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i
|
||||
)
|
||||
if (match) {
|
||||
return match[0]
|
||||
}
|
||||
|
||||
return id // Возвращаем оригинал если не найден UUID
|
||||
}
|
||||
|
||||
export const useSheetAutoSave = (
|
||||
getAllModifiedCells: () => Record<string, Record<string, any>>,
|
||||
isCalculating: boolean,
|
||||
revision: number,
|
||||
options: UseSheetAutoSaveOptions = {}
|
||||
) => {
|
||||
console.log('getAllModifiedCells', getAllModifiedCells())
|
||||
const { templateId, autoSaveDelay = 2000, enableAutoSave = true } = options
|
||||
|
||||
// Состояние
|
||||
@@ -56,68 +29,40 @@ export const useSheetAutoSave = (
|
||||
const [sheets, setSheets] = useState<Record<string, ApiSheet>>({})
|
||||
const [isLoading, setIsLoading] = useState(false)
|
||||
|
||||
// Refs
|
||||
const saveTimeoutRef = useRef<number | null>(null)
|
||||
// Дебаунсинг ревизии для автосохранения
|
||||
const [debouncedRevision] = useDebounce(revision, autoSaveDelay)
|
||||
|
||||
// Загрузка листов для шаблона при инициализации
|
||||
const loadSheets = useCallback(async () => {
|
||||
if (!templateId) return {}
|
||||
|
||||
const cleanTemplateId = extractUUID(templateId)
|
||||
const uuidRegex =
|
||||
/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i
|
||||
|
||||
if (!uuidRegex.test(cleanTemplateId)) {
|
||||
console.error('❌ Не удалось извлечь валидный UUID для загрузки:', {
|
||||
original: templateId,
|
||||
extracted: cleanTemplateId,
|
||||
})
|
||||
setLastSaveError('Неверный ID шаблона')
|
||||
return {}
|
||||
}
|
||||
|
||||
setIsLoading(true)
|
||||
try {
|
||||
const response = await getSheetsByTemplate(cleanTemplateId)
|
||||
/*
|
||||
* В API могут существовать листы как с «сырым» именем (Report/Calculations),
|
||||
* так и уже нормализованные (L/R). Чтобы случайный порядок ответов не
|
||||
* приводил к потере данных (один объект перезаписывал другой), собираем
|
||||
* листы в map с объединением ячеек, а не простым overwrite.
|
||||
*/
|
||||
const sheetsMap = response.sheets.reduce(
|
||||
(acc, sheet) => {
|
||||
// Приводим названия к единым «L»/«R»
|
||||
const normalizedName =
|
||||
sheet.name === 'Report'
|
||||
? 'L'
|
||||
: sheet.name === 'Calculations'
|
||||
? 'R'
|
||||
: sheet.name
|
||||
const response = await getSheetsByTemplate(templateId)
|
||||
|
||||
if (acc[normalizedName]) {
|
||||
// Уже есть лист с таким именем — мерджим данные, приоритет у более
|
||||
// свежего объекта (sheet), но оставляем существующие ячейки если их
|
||||
// нет в новом
|
||||
acc[normalizedName] = {
|
||||
...sheet,
|
||||
name: normalizedName,
|
||||
const sheetsMap = response.sheets.reduce<Record<string, ApiSheet>>(
|
||||
(acc, sheet) => {
|
||||
const existingSheet = acc[sheet.name]
|
||||
|
||||
if (existingSheet) {
|
||||
// Если лист уже есть, объединяем ячейки
|
||||
acc[sheet.name] = {
|
||||
...sheet, // берем актуальную версию листа
|
||||
cells: {
|
||||
...acc[normalizedName].cells,
|
||||
...sheet.cells,
|
||||
...existingSheet.cells, // старые ячейки
|
||||
...sheet.cells, // новые заменяют старые с тем же ключом
|
||||
},
|
||||
}
|
||||
} else {
|
||||
acc[normalizedName] = { ...sheet, name: normalizedName }
|
||||
acc[sheet.name] = { ...sheet }
|
||||
}
|
||||
|
||||
return acc
|
||||
},
|
||||
{} as Record<string, ApiSheet>
|
||||
{}
|
||||
)
|
||||
|
||||
setSheets(sheetsMap)
|
||||
console.log('📂 Загружены листы для шаблона:', Object.keys(sheetsMap))
|
||||
return sheetsMap
|
||||
} catch (error) {
|
||||
console.error('❌ Ошибка при загрузке листов:', error)
|
||||
@@ -138,71 +83,29 @@ export const useSheetAutoSave = (
|
||||
// Основная функция сохранения через API
|
||||
const performSave = useCallback(
|
||||
async (data: Record<string, Record<string, any>>) => {
|
||||
// Сохраняем все листы, но пропускаем пустые
|
||||
const sheetNames = Object.keys(data)
|
||||
if (sheetNames.length === 0) {
|
||||
console.log('📭 Нет данных для сохранения')
|
||||
return
|
||||
}
|
||||
if (!templateId) return
|
||||
|
||||
if (!templateId) {
|
||||
console.warn('⚠️ Не указан templateId для сохранения листов')
|
||||
return
|
||||
}
|
||||
// Получаем список всех листов, которые нужно обработать:
|
||||
// 1. Листы с данными (из data)
|
||||
// 2. Существующие листы, которые могли быть очищены
|
||||
const dataSheetNames = Object.keys(data)
|
||||
const existingSheetNames = Object.keys(sheets)
|
||||
const allSheetNames = new Set([...dataSheetNames, ...existingSheetNames])
|
||||
|
||||
// Извлекаем и валидируем UUID из templateId
|
||||
const cleanTemplateId = extractUUID(templateId)
|
||||
const uuidRegex =
|
||||
/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i
|
||||
|
||||
if (!uuidRegex.test(cleanTemplateId)) {
|
||||
console.error('❌ Не удалось извлечь валидный UUID из templateId:', {
|
||||
original: templateId,
|
||||
extracted: cleanTemplateId,
|
||||
})
|
||||
setLastSaveError('Неверный ID шаблона')
|
||||
return
|
||||
}
|
||||
|
||||
console.log('🧹 Очищенный templateId:', {
|
||||
original: templateId,
|
||||
clean: cleanTemplateId,
|
||||
})
|
||||
if (allSheetNames.size === 0) return
|
||||
|
||||
setIsSaving(true)
|
||||
setLastSaveError(null)
|
||||
|
||||
try {
|
||||
const savePromises = sheetNames.map(async sheetName => {
|
||||
const sheetCells = data[sheetName]
|
||||
const savePromises = Array.from(allSheetNames).map(async sheetName => {
|
||||
const sheetCells = data[sheetName] || {} // если данных нет, используем пустой объект
|
||||
const existingSheet = sheets[sheetName]
|
||||
|
||||
// Проверяем что есть данные для сохранения
|
||||
if (!sheetCells || Object.keys(sheetCells).length === 0) {
|
||||
console.log(`⏭️ Пропускаем лист "${sheetName}" - нет данных`)
|
||||
return
|
||||
}
|
||||
|
||||
if (existingSheet) {
|
||||
// Объединяем старые и новые данные, чтобы не потерять предыдущие изменения
|
||||
const mergedCells = {
|
||||
...existingSheet.cells,
|
||||
...sheetCells,
|
||||
}
|
||||
|
||||
// Проверяем, изменилось ли что-нибудь
|
||||
const isChanged = Object.keys(sheetCells).some(
|
||||
key => existingSheet.cells[key] !== sheetCells[key]
|
||||
)
|
||||
|
||||
if (!isChanged) {
|
||||
console.log(`⏭️ Лист "${sheetName}" без новых изменений`)
|
||||
return
|
||||
}
|
||||
|
||||
console.log(`🔄 Обновляем лист "${sheetName}" (patch)`)
|
||||
// Всегда сохраняем, даже если ячейки пустые (очистка листа)
|
||||
await patchSheet(existingSheet.id, {
|
||||
cells: mergedCells,
|
||||
cells: sheetCells,
|
||||
})
|
||||
|
||||
// Обновляем локальное состояние
|
||||
@@ -210,52 +113,41 @@ export const useSheetAutoSave = (
|
||||
...prev,
|
||||
[sheetName]: {
|
||||
...existingSheet,
|
||||
cells: mergedCells,
|
||||
cells: sheetCells,
|
||||
updated_at: new Date().toISOString(),
|
||||
},
|
||||
}))
|
||||
} else {
|
||||
// Создаем новый лист
|
||||
console.log(`✨ Создаем новый лист "${sheetName}"`)
|
||||
console.log('📋 Данные для создания:', {
|
||||
name: sheetName,
|
||||
cells: sheetCells,
|
||||
template_id: cleanTemplateId,
|
||||
cellsCount: Object.keys(sheetCells).length,
|
||||
})
|
||||
const newSheet = await createSheet({
|
||||
name: sheetName,
|
||||
cells: sheetCells,
|
||||
template_id: cleanTemplateId,
|
||||
})
|
||||
// Создаем новый лист только если есть данные
|
||||
if (Object.keys(sheetCells).length > 0) {
|
||||
const newSheet = await createSheet({
|
||||
name: sheetName,
|
||||
cells: sheetCells,
|
||||
template_id: templateId,
|
||||
})
|
||||
|
||||
// Получаем полную информацию о созданном листе
|
||||
const fullSheetData: ApiSheet = {
|
||||
id: newSheet.id,
|
||||
name: sheetName,
|
||||
cells: sheetCells,
|
||||
template_id: cleanTemplateId,
|
||||
created_at: new Date().toISOString(),
|
||||
updated_at: new Date().toISOString(),
|
||||
deleted_at: null,
|
||||
// Получаем полную информацию о созданном листе
|
||||
const fullSheetData: ApiSheet = {
|
||||
id: newSheet.id,
|
||||
name: sheetName,
|
||||
cells: sheetCells,
|
||||
template_id: templateId,
|
||||
created_at: new Date().toISOString(),
|
||||
updated_at: new Date().toISOString(),
|
||||
deleted_at: null,
|
||||
}
|
||||
|
||||
// Обновляем локальное состояние
|
||||
setSheets(prev => ({
|
||||
...prev,
|
||||
[sheetName]: fullSheetData,
|
||||
}))
|
||||
}
|
||||
|
||||
// Обновляем локальное состояние
|
||||
setSheets(prev => ({
|
||||
...prev,
|
||||
[sheetName]: fullSheetData,
|
||||
}))
|
||||
}
|
||||
})
|
||||
|
||||
await Promise.all(savePromises)
|
||||
setLastSavedRevision(revision)
|
||||
|
||||
const totalCells = Object.values(data).reduce(
|
||||
(sum, sheet) => sum + Object.keys(sheet).length,
|
||||
0
|
||||
)
|
||||
console.log('💾 Сохранено ячеек:', totalCells, 'в листах:', sheetNames)
|
||||
} catch (error) {
|
||||
const errorMessage =
|
||||
error instanceof Error ? error.message : 'Неизвестная ошибка'
|
||||
@@ -268,98 +160,33 @@ export const useSheetAutoSave = (
|
||||
[templateId, sheets, revision]
|
||||
)
|
||||
|
||||
// Автосохранение с дебаунсом
|
||||
const scheduleAutoSave = useCallback(() => {
|
||||
console.log('⏰ scheduleAutoSave вызван, проверяем условия:', {
|
||||
enableAutoSave,
|
||||
isCalculating,
|
||||
isSaving,
|
||||
templateId,
|
||||
})
|
||||
// Автосохранение при изменении дебаунсированной ревизии
|
||||
useEffect(() => {
|
||||
const shouldAutoSave =
|
||||
enableAutoSave &&
|
||||
debouncedRevision > lastSavedRevision &&
|
||||
!isCalculating &&
|
||||
!isSaving &&
|
||||
templateId
|
||||
|
||||
if (!enableAutoSave || isCalculating || isSaving || !templateId) {
|
||||
console.log('❌ Автосохранение отменено по условиям')
|
||||
return
|
||||
if (shouldAutoSave) {
|
||||
console.log('✅ Выполняем автосохранение для ревизии:', debouncedRevision)
|
||||
performSave(getAllModifiedCells())
|
||||
}
|
||||
|
||||
// Очищаем предыдущий таймер
|
||||
if (saveTimeoutRef.current) {
|
||||
clearTimeout(saveTimeoutRef.current)
|
||||
console.log('🔄 Очищен предыдущий таймер автосохранения')
|
||||
}
|
||||
|
||||
console.log(`⏳ Запланировано автосохранение через ${autoSaveDelay}ms`)
|
||||
saveTimeoutRef.current = setTimeout(() => {
|
||||
console.log('🎯 Выполняем отложенное автосохранение')
|
||||
const currentData = getAllModifiedCells()
|
||||
console.log('📋 Данные для автосохранения:', currentData)
|
||||
performSave(currentData)
|
||||
}, autoSaveDelay)
|
||||
}, [
|
||||
enableAutoSave,
|
||||
debouncedRevision,
|
||||
lastSavedRevision,
|
||||
isCalculating,
|
||||
isSaving,
|
||||
templateId,
|
||||
autoSaveDelay,
|
||||
getAllModifiedCells,
|
||||
performSave,
|
||||
])
|
||||
|
||||
// Эффект для автосохранения при изменениях
|
||||
useEffect(() => {
|
||||
console.log('🔍 Проверка условий автосохранения:', {
|
||||
enableAutoSave,
|
||||
revision,
|
||||
lastSavedRevision,
|
||||
isCalculating,
|
||||
isSaving,
|
||||
templateId,
|
||||
shouldSave:
|
||||
enableAutoSave &&
|
||||
revision > lastSavedRevision &&
|
||||
!isCalculating &&
|
||||
!isSaving,
|
||||
})
|
||||
|
||||
if (
|
||||
enableAutoSave &&
|
||||
revision > lastSavedRevision &&
|
||||
!isCalculating &&
|
||||
!isSaving
|
||||
) {
|
||||
console.log('✅ Планируем автосохранение...')
|
||||
scheduleAutoSave()
|
||||
} else {
|
||||
console.log('⏸️ Автосохранение пропущено по условиям')
|
||||
}
|
||||
}, [
|
||||
enableAutoSave,
|
||||
revision,
|
||||
lastSavedRevision,
|
||||
isCalculating,
|
||||
isSaving,
|
||||
scheduleAutoSave,
|
||||
])
|
||||
|
||||
// Ручное сохранение
|
||||
const manualSave = useCallback(() => {
|
||||
console.log('🖱️ Ручное сохранение вызвано')
|
||||
|
||||
// Отменяем автосохранение если оно запланировано
|
||||
if (saveTimeoutRef.current) {
|
||||
clearTimeout(saveTimeoutRef.current)
|
||||
saveTimeoutRef.current = null
|
||||
console.log('⏹️ Отменено запланированное автосохранение')
|
||||
}
|
||||
|
||||
const currentData = getAllModifiedCells()
|
||||
console.log('📋 Данные для сохранения:', currentData)
|
||||
|
||||
if (Object.keys(currentData).length === 0) {
|
||||
console.log('📭 Нет измененных данных для сохранения')
|
||||
return
|
||||
}
|
||||
|
||||
performSave(currentData)
|
||||
}, [getAllModifiedCells, performSave])
|
||||
|
||||
@@ -376,19 +203,9 @@ export const useSheetAutoSave = (
|
||||
}
|
||||
})
|
||||
|
||||
console.log('📂 Загружены сохраненные листы:', Object.keys(result))
|
||||
return result
|
||||
}, [sheets])
|
||||
|
||||
// Очистка таймаута при размонтировании
|
||||
useEffect(() => {
|
||||
return () => {
|
||||
if (saveTimeoutRef.current) {
|
||||
clearTimeout(saveTimeoutRef.current)
|
||||
}
|
||||
}
|
||||
}, [])
|
||||
|
||||
// Вычисляемые значения
|
||||
const isDataChanged = revision > lastSavedRevision
|
||||
const hasUnsavedChanges = isDataChanged && !isSaving
|
||||
|
||||
Reference in New Issue
Block a user