feat: улучшение кэширования и обработки ошибок расписания

- Изменен TTL кэша с 1 часа на 15 минут для нормального использования
- Добавлен fallback кэш на 24 часа для использования при ошибках парсинга
- Улучшена обработка ошибок: при отсутствии кэша показывается страница с ошибкой вместо 500
- Добавлена анимация появления сообщения об ошибке
- Улучшено логирование fallback кэша с указанием возраста
- Добавлены новые сообщения загрузки и логика избежания повторений
This commit is contained in:
kilyabin
2025-11-30 22:50:23 +04:00
parent 3345eb2e3f
commit 86715eaf66
2 changed files with 119 additions and 27 deletions

View File

@@ -52,8 +52,16 @@ const loadingMessages = [
'Объезжаем пробки…',
'Ищем замены…',
'Ждем выходных…',
'Прописываем сетевые настройки...',
'Настраиваем антенны...',
'Обновляем кэш...',
'Готовим кофе...',
'Подкручиваем позитив...',
]
// Размер истории последних сообщений для избежания повторений
const MAX_HISTORY_SIZE = Math.min(3, Math.floor(loadingMessages.length / 2))
interface LoadingOverlayProps {
isLoading: boolean
}
@@ -63,6 +71,8 @@ export function LoadingOverlay({ isLoading }: LoadingOverlayProps) {
const [messageOpacity, setMessageOpacity] = React.useState(0)
const [showError, setShowError] = React.useState(false)
const [errorOpacity, setErrorOpacity] = React.useState(0)
// Храним историю последних показанных сообщений для избежания повторений
const messageHistoryRef = React.useRef<string[]>([])
React.useEffect(() => {
if (!isLoading) {
@@ -70,17 +80,31 @@ export function LoadingOverlay({ isLoading }: LoadingOverlayProps) {
setMessageOpacity(0)
setShowError(false)
setErrorOpacity(0)
messageHistoryRef.current = []
return
}
// Выбираем случайное сообщение при старте загрузки
const getRandomMessage = () => {
const randomIndex = Math.floor(Math.random() * loadingMessages.length)
return loadingMessages[randomIndex]
// Выбираем случайное сообщение, исключая последние показанные
const getRandomMessage = (excludeMessages: string[] = []) => {
const availableMessages = loadingMessages.filter(
msg => !excludeMessages.includes(msg)
)
// Если все сообщения были недавно показаны, сбрасываем историю
if (availableMessages.length === 0) {
messageHistoryRef.current = []
const randomIndex = Math.floor(Math.random() * loadingMessages.length)
return loadingMessages[randomIndex]
}
const randomIndex = Math.floor(Math.random() * availableMessages.length)
return availableMessages[randomIndex]
}
// Устанавливаем первое сообщение
setCurrentMessage(getRandomMessage())
const firstMessage = getRandomMessage()
setCurrentMessage(firstMessage)
messageHistoryRef.current = [firstMessage]
setMessageOpacity(1)
// Таймер для показа сообщения об ошибке после 5 секунд
@@ -99,7 +123,15 @@ export function LoadingOverlay({ isLoading }: LoadingOverlayProps) {
// После fade out меняем сообщение и fade in
setTimeout(() => {
setCurrentMessage(getRandomMessage())
const newMessage = getRandomMessage(messageHistoryRef.current)
setCurrentMessage(newMessage)
// Обновляем историю: добавляем новое сообщение и ограничиваем размер истории
messageHistoryRef.current = [
...messageHistoryRef.current.slice(-(MAX_HISTORY_SIZE - 1)),
newMessage
]
setMessageOpacity(1)
}, 300) // Длительность fade анимации
}, 2000)