useDataSaver.ts 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import isObject from 'lodash/isObject';
  2. import { alertAdded, alertDissmissed } from 'redux/reducers/alerts/alertsSlice';
  3. import { useAppDispatch } from 'lib/hooks/redux';
  4. const AUTO_DISMISS_TIME = 2000;
  5. const useDataSaver = (
  6. subject: string,
  7. data: Record<string, string> | string
  8. ) => {
  9. const dispatch = useAppDispatch();
  10. const copyToClipboard = () => {
  11. if (navigator.clipboard) {
  12. const str =
  13. typeof data === 'string' ? String(data) : JSON.stringify(data);
  14. navigator.clipboard.writeText(str);
  15. dispatch(
  16. alertAdded({
  17. id: subject,
  18. type: 'success',
  19. title: '',
  20. message: 'Copied successfully!',
  21. createdAt: Date.now(),
  22. })
  23. );
  24. setTimeout(() => dispatch(alertDissmissed(subject)), AUTO_DISMISS_TIME);
  25. }
  26. };
  27. const saveFile = () => {
  28. const extension = isObject(data) ? 'json' : 'txt';
  29. const dataStr = `data:text/json;charset=utf-8,${encodeURIComponent(
  30. JSON.stringify(data)
  31. )}`;
  32. const downloadAnchorNode = document.createElement('a');
  33. downloadAnchorNode.setAttribute('href', dataStr);
  34. downloadAnchorNode.setAttribute(
  35. 'download',
  36. `${subject}_${new Date().getTime()}.${extension}`
  37. );
  38. document.body.appendChild(downloadAnchorNode);
  39. downloadAnchorNode.click();
  40. downloadAnchorNode.remove();
  41. };
  42. return { copyToClipboard, saveFile };
  43. };
  44. export default useDataSaver;