- 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
145 lines
5.7 KiB
Markdown
145 lines
5.7 KiB
Markdown
# ✅ Виправлення постійного перезавантаження кабінетів мікроДАО
|
||
|
||
**Дата:** 2025-11-23
|
||
**Статус:** ✅ Виправлено
|
||
|
||
---
|
||
|
||
## 🐛 Проблема
|
||
|
||
Сторінки кабінетів мікроДАО постійно перезавантажувалися через:
|
||
- Нестабільні обчислення на кожному рендері
|
||
- Відсутність мемоізації
|
||
- Занадто часті оновлення через React Query
|
||
|
||
---
|
||
|
||
## ✅ Рішення
|
||
|
||
### 1. Додано мемоізацію обчислень
|
||
|
||
**Використано `useMemo` для:**
|
||
- `orchestratorMapping` - маппінг між агентами та мікроДАО
|
||
- `microDaoId` - правильний ID мікроДАО
|
||
- `orchestratorAgentId` - ID агента-оркестратора
|
||
- `orchestratorFromNode1` - пошук оркестратора серед агентів з НОДИ1
|
||
- `allAgents` - об'єднаний список агентів
|
||
- `teamData` - дані команди (з fallback)
|
||
|
||
**Файл:** `src/pages/MicroDaoCabinetPage.tsx`
|
||
|
||
```typescript
|
||
// Мемоізуємо маппінг
|
||
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
|
||
|
||
**Додано налаштування для зменшення перезавантажень:**
|
||
|
||
```typescript
|
||
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
|
||
- ✅ Стабільна робота кабінетів мікроДАО
|
||
|
||
**Результат:**
|
||
- ✅ Сторінки кабінетів мікроДАО працюють стабільно
|
||
- ✅ Немає зайвих перезавантажень
|
||
- ✅ Ефективне використання кешу
|
||
|
||
---
|
||
|
||
**Проблема з постійним перезавантаженням виправлена!** 🎉
|
||
|