UnsavedAlertDialog.tsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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. window.alert(alertMsg);
  19. }
  20. return;
  21. }, [isEnabledUnsavedWarning]);
  22. /*
  23. * Route changes by Browser
  24. * Example: window.location.href, F5
  25. */
  26. useEffect(() => {
  27. window.addEventListener('beforeunload', alertUnsavedWarningByBrowser);
  28. return () => {
  29. window.removeEventListener('beforeunload', alertUnsavedWarningByBrowser);
  30. };
  31. }, [alertUnsavedWarningByBrowser]);
  32. /*
  33. * Route changes by Next Router
  34. * https://nextjs.org/docs/api-reference/next/router
  35. */
  36. useEffect(() => {
  37. router.events.on('routeChangeStart', () => alertUnsavedWarningByNextRouter());
  38. return () => {
  39. router.events.off('routeChangeStart', () => alertUnsavedWarningByNextRouter());
  40. };
  41. }, [router.events]);
  42. return;
  43. };
  44. export default UnsavedAlertDialog;