diff --git a/frontend/src/views/StackView.vue b/frontend/src/views/StackView.vue index b2a37d4..dce73c3 100644 --- a/frontend/src/views/StackView.vue +++ b/frontend/src/views/StackView.vue @@ -29,12 +29,17 @@ let pollTimer: number | undefined -async function loadAll() { - loading.value = true +let loaded = false + +async function loadAll(silent = false) { + // silent-опрос (фоновые тики) не включает скелетон и не заменяет массивы, + // если данные не изменились — иначе страница дёргается каждые несколько секунд + if (!silent || !loaded) loading.value = true try { const [taskList, projectList] = await Promise.all([api.listTasks(), api.listProjects()]) - tasks.value = taskList - projects.value = projectList + if (JSON.stringify(taskList) !== JSON.stringify(tasks.value)) tasks.value = taskList + if (JSON.stringify(projectList) !== JSON.stringify(projects.value)) projects.value = projectList + loaded = true } catch (e) { error.value = String(e) } finally { @@ -45,7 +50,7 @@ // Опрос: LLM детализирует задачу в фоне — предложение появится через секунды function startPolling() { pollTimer = window.setInterval(async () => { - if (!editing.value) await loadAll() + if (!editing.value) await loadAll(true) }, 5000) }