Files
microdao-daarion/MICRODAO-CABINET-RELOAD-FIX.md
Apple 3de3c8cb36 feat: Add presence heartbeat for Matrix online status
- matrix-gateway: POST /internal/matrix/presence/online endpoint
- usePresenceHeartbeat hook with activity tracking
- Auto away after 5 min inactivity
- Offline on page close/visibility change
- Integrated in MatrixChatRoom component
2025-11-27 00:19:40 -08:00

5.7 KiB
Raw Blame History

Виправлення постійного перезавантаження кабінетів мікроДАО

Дата: 2025-11-23
Статус: Виправлено


🐛 Проблема

Сторінки кабінетів мікроДАО постійно перезавантажувалися через:

  • Нестабільні обчислення на кожному рендері
  • Відсутність мемоізації
  • Занадто часті оновлення через React Query

Рішення

1. Додано мемоізацію обчислень

Використано useMemo для:

  • orchestratorMapping - маппінг між агентами та мікроДАО
  • microDaoId - правильний ID мікроДАО
  • orchestratorAgentId - ID агента-оркестратора
  • orchestratorFromNode1 - пошук оркестратора серед агентів з НОДИ1
  • allAgents - об'єднаний список агентів
  • teamData - дані команди (з fallback)

Файл: src/pages/MicroDaoCabinetPage.tsx

// Мемоізуємо маппінг
const orchestratorMapping = useMemo(
  () => getAgentByMicroDaoId(microDaoIdParam),
  [microDaoIdParam]
);

// Мемоізуємо ID
const microDaoId = useMemo(
  () => orchestratorMapping?.microDaoId || microDaoIdParam,
  [orchestratorMapping, microDaoIdParam]
);

// Мемоізуємо пошук оркестратора
const orchestratorFromNode1 = useMemo(() => {
  // ... логіка пошуку
}, [node1AgentsData, orchestratorAgentId, orchestratorMapping]);

// Мемоізуємо об'єднаний список агентів
const allAgents = useMemo(() => {
  // ... логіка об'єднання
}, [agentsData?.items, orchestratorFromNode1]);

2. Оптимізовано React Query

Додано налаштування для зменшення перезавантажень:

const { data: team } = useQuery({
  queryKey: ['team', microDaoId],
  queryFn: async () => { /* ... */ },
  enabled: !!microDaoId,
  staleTime: 60000, // Дані вважаються свіжими 1 хвилину
  gcTime: 300000, // Кеш зберігається 5 хвилин
  refetchOnWindowFocus: false, // Не оновлювати при фокусі вікна
  refetchOnMount: false, // Не оновлювати при монтуванні (якщо дані є в кеші)
});

Налаштування:

  • staleTime: 60000 - дані вважаються свіжими 1 хвилину
  • gcTime: 300000 - кеш зберігається 5 хвилин
  • refetchOnWindowFocus: false - не оновлювати при фокусі вікна
  • refetchOnMount: false - не оновлювати при монтуванні (якщо дані є в кеші)

3. Оптимізовано завантаження агентів з НОДИ1

Змінено queryKey:

  • Було: ['node1-agents-for-microdao', microDaoId]
  • Стало: ['node1-agents-for-microdao']

Причина: Агенти з НОДИ1 однакові для всіх мікроДАО, тому не потрібно робити окремий запит для кожного мікроДАО.


📊 Результат

До виправлення:

  • Сторінка постійно перезавантажувалася
  • Обчислення виконувалися на кожному рендері
  • React Query робив занадто багато запитів

Після виправлення:

  • Сторінка стабільна, не перезавантажується
  • Обчислення мемоізовані
  • React Query використовує кеш ефективно
  • Менше запитів до API

🔧 Технічні деталі

Мемоізація

Використано useMemo для:

  1. orchestratorMapping - обчислюється тільки при зміні microDaoIdParam
  2. microDaoId - обчислюється тільки при зміні orchestratorMapping або microDaoIdParam
  3. orchestratorAgentId - обчислюється тільки при зміні orchestratorMapping
  4. orchestratorFromNode1 - обчислюється тільки при зміні node1AgentsData, orchestratorAgentId або orchestratorMapping
  5. allAgents - обчислюється тільки при зміні agentsData?.items або orchestratorFromNode1
  6. teamData - обчислюється тільки при зміні team або orchestratorMapping

React Query оптимізація

Налаштування для всіх запитів:

  • staleTime: 60000 - дані свіжі 1 хвилину
  • gcTime: 300000 - кеш зберігається 5 хвилин
  • refetchOnWindowFocus: false - не оновлювати при фокусі
  • refetchOnMount: false - не оновлювати при монтуванні

Статус

Виправлено:

  • Постійне перезавантаження усунуто
  • Мемоізація обчислень
  • Оптимізація React Query
  • Стабільна робота кабінетів мікроДАО

Результат:

  • Сторінки кабінетів мікроДАО працюють стабільно
  • Немає зайвих перезавантажень
  • Ефективне використання кешу

Проблема з постійним перезавантаженням виправлена! 🎉