All files / client/src/views/admin/components EmailNotificationTriggerSelector.tsx

58.82% Statements 10/17
0% Branches 0/2
66.66% Functions 4/6
58.82% Lines 10/17

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                356x 57x 98x   57x 57x 57x   57x                               399x 399x                                     1x            
import { ReactElement, useState } from "react";
import { useTranslation } from "react-i18next";
import styled from "styled-components";
import { EmailNotificationTrigger } from "shared/types/emailNotification";
import { Checkbox } from "client/components/Checkbox";
import { useAppDispatch, useAppSelector } from "client/utils/hooks";
import { submitSetEmailNotificationTriggers } from "client/views/admin/adminThunks";
 
export const EmailNotificationTriggerSelector = (): ReactElement => {
  const emailNotificationTrigger = useAppSelector(
    (state) => state.admin.emailNotificationTrigger,
  );
  const { t } = useTranslation();
  const dispatch = useAppDispatch();
  const [loading, setLoading] = useState<boolean>(false);
 
  const toggleTrigger = async (
    trigger: EmailNotificationTrigger,
  ): Promise<void> => {
    const nextTriggers = emailNotificationTrigger.includes(trigger)
      ? emailNotificationTrigger.filter((value) => value !== trigger)
      : [...emailNotificationTrigger, trigger];
 
    setLoading(true);
    await dispatch(submitSetEmailNotificationTriggers(nextTriggers));
    setLoading(false);
  };
 
  return (
    <div>
      <TriggerList>
        {Object.entries(EmailNotificationTrigger).map(([name, trigger]) => {
          const readableName = t(`admin.emailNotificationTrigger.${trigger}`);
          return (
            <Checkbox
              key={trigger}
              id={`email-notification-trigger-${trigger}`}
              label={`${readableName} (${name})`}
              checked={emailNotificationTrigger.includes(trigger)}
              disabled={loading}
              onChange={() => {
                // eslint-disable-next-line @typescript-eslint/no-floating-promises
                toggleTrigger(trigger);
              }}
            />
          );
        })}
      </TriggerList>
    </div>
  );
};
 
const TriggerList = styled.div`
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin-top: 8px;
`;