All files / libs/design-system/ext/src/lib/clipboard useClipboard.ts

0% Statements 0/35
0% Branches 0/1
0% Functions 0/1
0% Lines 0/35

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                                                                       
import { useCallback } from 'react';
import { useIntl } from 'react-intl';

import { useSnackbars } from '@allshares/studio-design-system';
import { log } from '@amalia/kernel/logger/client';

export const useClipboard = () => {
  const { snackInfo, snackError } = useSnackbars();
  const { formatMessage } = useIntl();

  const copy = useCallback(
    (text: string) => {
      const onSuccess = () => {
        const message =
          text.length < 200
            ? formatMessage({ defaultMessage: 'Copied “{text}” to clipboard.' }, { text })
            : formatMessage({ defaultMessage: 'Copied to clipboard.' });
        snackInfo(message, { autoHideDuration: 1000 });
      };

      const onError = (error: Error) => {
        const message = formatMessage({ defaultMessage: 'Failed to copy “{text}” to clipboard.' }, { text });
        log.error(message, error);
        snackError(message, { autoHideDuration: 1000 });
      };

      // Using the Clipboard API
      // https://developer.mozilla.org/en-US/docs/Web/API/Clipboard/writeText
      navigator.clipboard.writeText(text).then(onSuccess).catch(onError);
    },
    [formatMessage, snackInfo, snackError],
  );

  return { copy };
};