All files / Rindu/components/Toast Toast.tsx

100% Statements 11/11
100% Branches 3/3
100% Functions 3/3
100% Lines 11/11

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 5619x   19x 19x   92x 87x   81x   81x 41x     81x 76x             5x                                                                  
import { ReactElement, useEffect, useState } from "react";
 
import { PortalTarget, ToastCard } from "components";
import { useToast } from "hooks/useToast";
 
export default function Toast(): ReactElement | null {
  const [targetNode, setTargetNode] = useState<Element | null>();
 
  const { toasts } = useToast();
 
  useEffect(() => {
    setTargetNode(document.querySelector("#toast"));
  }, []);
 
  if (targetNode === undefined || !toasts.length) {
    return null;
  }
 
  return (
    <PortalTarget targetId="toast">
      <section>
        {toasts.map(({ id, variant, message, displayTime }) => (
          <ToastCard
            key={id}
            id={id}
            variant={variant}
            message={message}
            displayTime={displayTime}
          />
        ))}
        <style jsx>{`
          section {
            max-width: 400px;
            width: fit-content;
            position: fixed;
            left: 50%;
            bottom: 90px;
            transform: translate(-50%, -50%);
            margin: 0 auto;
          }
          :global(#toast) {
            position: relative;
            z-index: 993332323233232399;
          }
          @media screen and (max-width: 500px) {
            section {
              max-width: calc(100% -2rem);
              width: max-content;
            }
          }
        `}</style>
      </section>
    </PortalTarget>
  );
}