fix(chat): подавлять push-уведомления при открытом активном чате и автоотметка прочтения в task chat

- Добавлены active_chat_* поля в user_presence и endpoint /api/devices/active-chat

- Сервер не шлёт Web Push/Pushy, если получатель смотрит в тот же чат на видимой вкладке

- Клиент сообщает серверу и Service Worker об активном чате из Chat.tsx и TaskChat.tsx

- TaskChat: входящие сообщения автоматически отмечаются прочитанными при видимой вкладке

- SW: подавляет foreground/system push, если активный чат совпадает
This commit is contained in:
2026-07-16 18:59:00 +03:00
parent 63c83a059d
commit 7672dd98df
9 changed files with 317 additions and 1 deletions

View File

@@ -2493,6 +2493,12 @@ export const userPresence = pgTable("user_presence", {
isOnline: boolean("is_online").default(false),
lastSeenAt: timestamp("last_seen_at").defaultNow(),
activeDevices: integer("active_devices").default(0),
// Активный чат: используется сервером, чтобы не слать push, если пользователь
// уже смотрит в этот чат на видимой вкладке.
activeChatType: text("active_chat_type"), // 'messenger' | 'task'
activeChatId: integer("active_chat_id"),
activeChatVisible: boolean("active_chat_visible").default(false),
activeChatUpdatedAt: timestamp("active_chat_updated_at").defaultNow(),
}, (table) => ({
userIndex: index("user_presence_user_idx").on(table.userId),
onlineIndex: index("user_presence_online_idx").on(table.isOnline),