update
This commit is contained in:
@@ -2,6 +2,7 @@ import React, { createContext, useContext, useState, useCallback, useEffect, use
|
||||
import { useQuery, useQueryClient } from '@tanstack/react-query';
|
||||
import { nextcloudApi } from '../services/nextcloud';
|
||||
import { useLayout } from './LayoutContext';
|
||||
import { useNotification } from './NotificationContext';
|
||||
import type { NextcloudConversation } from '../types/nextcloud.types';
|
||||
|
||||
interface ChatContextType {
|
||||
@@ -21,8 +22,10 @@ interface ChatProviderProps {
|
||||
export const ChatProvider: React.FC<ChatProviderProps> = ({ children }) => {
|
||||
const [selectedRoomToken, setSelectedRoomToken] = useState<string | null>(null);
|
||||
const { chatPanelOpen } = useLayout();
|
||||
const { showNotificationToast } = useNotification();
|
||||
const queryClient = useQueryClient();
|
||||
const prevPanelOpenRef = useRef(chatPanelOpen);
|
||||
const prevUnreadRef = useRef<Map<string, number>>(new Map());
|
||||
|
||||
// Invalidate rooms/connection when panel opens so data is fresh immediately
|
||||
useEffect(() => {
|
||||
@@ -36,7 +39,7 @@ export const ChatProvider: React.FC<ChatProviderProps> = ({ children }) => {
|
||||
const { data: connData } = useQuery({
|
||||
queryKey: ['nextcloud', 'connection'],
|
||||
queryFn: () => nextcloudApi.getConversations(),
|
||||
refetchInterval: chatPanelOpen ? 5000 : 60000,
|
||||
refetchInterval: chatPanelOpen ? 5000 : 15000,
|
||||
retry: false,
|
||||
});
|
||||
|
||||
@@ -45,7 +48,7 @@ export const ChatProvider: React.FC<ChatProviderProps> = ({ children }) => {
|
||||
const { data } = useQuery({
|
||||
queryKey: ['nextcloud', 'rooms'],
|
||||
queryFn: () => nextcloudApi.getRooms(),
|
||||
refetchInterval: chatPanelOpen ? 5000 : 60000,
|
||||
refetchInterval: chatPanelOpen ? 5000 : 15000,
|
||||
enabled: isConnected,
|
||||
});
|
||||
|
||||
@@ -53,6 +56,21 @@ export const ChatProvider: React.FC<ChatProviderProps> = ({ children }) => {
|
||||
const connected = data?.connected ?? false;
|
||||
const loginName = data?.loginName ?? null;
|
||||
|
||||
// Detect new unread messages while panel is closed and show toast
|
||||
useEffect(() => {
|
||||
if (!rooms.length) return;
|
||||
const prev = prevUnreadRef.current;
|
||||
const isFirstLoad = prev.size === 0;
|
||||
|
||||
for (const room of rooms) {
|
||||
const prevCount = prev.get(room.token) ?? 0;
|
||||
if (!isFirstLoad && !chatPanelOpen && room.unreadMessages > prevCount) {
|
||||
showNotificationToast(room.displayName, 'info');
|
||||
}
|
||||
prev.set(room.token, room.unreadMessages);
|
||||
}
|
||||
}, [rooms, chatPanelOpen, showNotificationToast]);
|
||||
|
||||
const selectRoom = useCallback((token: string | null) => {
|
||||
setSelectedRoomToken(token);
|
||||
}, []);
|
||||
|
||||
Reference in New Issue
Block a user