All files / src/features/Notifications/NotificationsCenter/hooks useNotificationsActions.tsx

91.66% Statements 33/36
78.57% Branches 11/14
100% Functions 12/12
96.87% Lines 31/32

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91                            25x   25x 2517x 2517x 2517x 2517x   2517x   2517x 1x 2x 2x                           2x 1x 1x 1x     2517x   2517x   36x       2517x 21x   21x   1x     1x         2517x 15x   15x 15x 45x       2517x 5x       2517x                
import { showMessage } from "@common/Toast";
import {
  QKEY_ALL_NOTIFICATIONS,
  QKEY_UNREAD_NOTIFICATIONS,
  QKEY_CHECK_NEW_NOTIFICATIONS,
} from "@constants/queryKeys";
import { useAppSelector } from "@redux/hooks";
import { selectSelectedAccount } from "@redux/slices/auth/accounts";
import { TNotificationIds, markAsRead } from "@services/api/notifications/user";
import { PROFILE_MODAL } from "modals/modal_names";
import { useMutation, useQueryClient } from "react-query";
import useRedirect from "@hooks/common/router/useRedirect";
import { selectUser } from "@redux/slices/auth/auth";
 
const infiniteQueries = [QKEY_UNREAD_NOTIFICATIONS, QKEY_ALL_NOTIFICATIONS];
 
const useNotificationsActions = () => {
  const selectedUser = useAppSelector(selectSelectedAccount);
  const user = useAppSelector(selectUser);
  const merchantId = selectedUser?.id || 0;
  const userId = user?.userAccID || 0;
 
  const queryClient = useQueryClient();
 
  const refetchQueries = () => {
    infiniteQueries.forEach((key) => {
      queryClient.setQueryData(key, (oldData: any) => {
        Eif (!oldData) return undefined;
 
        return {
          pages: [
            {
              data: [],
              nextCursor: null,
              total: 0,
            },
          ],
          pageParams: [undefined],
        };
      });
    });
    infiniteQueries.forEach((q) => queryClient.invalidateQueries(q));
    queryClient.invalidateQueries(QKEY_CHECK_NEW_NOTIFICATIONS);
    queryClient.invalidateQueries(QKEY_UNREAD_NOTIFICATIONS);
    queryClient.invalidateQueries(QKEY_ALL_NOTIFICATIONS);
  };
 
  const { redirectToModal } = useRedirect();
 
  const markAsReadMutation = useMutation(
    (notificationsIds: TNotificationIds) => {
      return markAsRead(merchantId, userId, notificationsIds);
    },
  );
 
  const markAllAsRead = () => {
    Iif (!userId || !merchantId) return;
 
    markAsReadMutation.mutate(["*"], {
      onSuccess: () => {
        refetchQueries();
      },
      onError: () => {
        showMessage("Error", "Whoops... an error occured");
      },
    });
  };
 
  const markNotificationAsRead = async (id: number) => {
    Iif (!userId || !merchantId) return;
 
    await markAsReadMutation.mutateAsync([id]);
    [...infiniteQueries, QKEY_CHECK_NEW_NOTIFICATIONS].forEach((key) =>
      queryClient.invalidateQueries(key),
    );
  };
 
  const handleConfigurationClick = () =>
    redirectToModal(PROFILE_MODAL, {
      initialTab: "Notifications",
    });
 
  return {
    markAllAsRead,
    markNotificationAsRead,
    handleConfigurationClick,
  };
};
 
export default useNotificationsActions;