UnsavedAlertDialog.tsx 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import { useCallback, useEffect } from 'react';
  2. import { useRouter } from 'next/router';
  3. import { useIsEnabledUnsavedWarning } from '~/stores/editor';
  4. const alertMsg = 'Changes you made may not be saved.';
  5. const UnsavedAlertDialog = (): void => {
  6. const router = useRouter();
  7. const { data: isEnabledUnsavedWarning } = useIsEnabledUnsavedWarning();
  8. const alertUnsavedWarningByBrowser = useCallback((e) => {
  9. if (isEnabledUnsavedWarning) {
  10. e.preventDefault();
  11. // returnValue should be set to show alert dialog
  12. e.returnValue = alertMsg;
  13. return;
  14. }
  15. }, [isEnabledUnsavedWarning]);
  16. const alertUnsavedWarningByNextRouter = useCallback(() => {
  17. if (isEnabledUnsavedWarning) {
  18. // eslint-disable-next-line no-alert
  19. window.alert(alertMsg);
  20. }
  21. return;
  22. }, [isEnabledUnsavedWarning]);
  23. /*
  24. * Route changes by Browser
  25. * Example: window.location.href, F5
  26. */
  27. useEffect(() => {
  28. window.addEventListener('beforeunload', alertUnsavedWarningByBrowser);
  29. return () => {
  30. window.removeEventListener('beforeunload', alertUnsavedWarningByBrowser);
  31. };
  32. // eslint-disable-next-line react-hooks/exhaustive-deps
  33. }, []);
  34. /*
  35. * Route changes by Next Router
  36. * https://nextjs.org/docs/api-reference/next/router
  37. */
  38. useEffect(() => {
  39. router.events.on('routeChangeStart', alertUnsavedWarningByNextRouter);
  40. return () => {
  41. router.events.off('routeChangeStart', alertUnsavedWarningByNextRouter);
  42. };
  43. // eslint-disable-next-line react-hooks/exhaustive-deps
  44. }, []);
  45. return;
  46. };
  47. export default UnsavedAlertDialog;