UnsavedAlertDialog.tsx 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import { useCallback, useEffect } from 'react';
  2. import { useRouter } from 'next/router';
  3. import { useUnsavedWarning } from '~/stores/editor';
  4. const unsavedAlertMsg = 'Changes you made may not be saved.';
  5. const UnsavedAlertDialog = (): void => {
  6. const router = useRouter();
  7. const { showAlertDialog } = useUnsavedWarning();
  8. const showAlertDialogForRouteChangesByBrowser = useCallback((e) => {
  9. e.preventDefault();
  10. showAlertDialog(unsavedAlertMsg);
  11. e.returnValue = '';
  12. return;
  13. }, [showAlertDialog]);
  14. /*
  15. * Route changes by Browser
  16. * Example: window.location.href, F5
  17. */
  18. useEffect(() => {
  19. window.addEventListener('beforeunload', showAlertDialogForRouteChangesByBrowser);
  20. return () => {
  21. window.removeEventListener('beforeunload', showAlertDialogForRouteChangesByBrowser);
  22. };
  23. }, [showAlertDialogForRouteChangesByBrowser]);
  24. /*
  25. * Route changes by Next Router
  26. * https://nextjs.org/docs/api-reference/next/router
  27. */
  28. useEffect(() => {
  29. router.events.on('routeChangeStart', () => showAlertDialog(unsavedAlertMsg));
  30. return () => {
  31. router.events.off('routeChangeStart', () => showAlertDialog(unsavedAlertMsg));
  32. };
  33. }, [router.events, showAlertDialog]);
  34. return;
  35. };
  36. export default UnsavedAlertDialog;