11import { useEffect } from 'react'
2- import type { Router } from 'next/router'
2+ import type { NextRouter , useRouter } from 'next/router'
33
44/**
55 * Don't let a user navigate or close the page if changes aren't saved
66 * @param unsaved Are there unsaved changes?
7- * @param nextRouter If using NextJS, the next router (prevents NextJS navigation)
7+ * @param nextRouter If using NextJS, the next router instance or hook (prevents NextJS navigation)
88 */
9- export function useUnsaved ( unsaved ?: boolean , nextRouter ?: Router ) : void {
9+ export function useUnsaved ( unsaved ?: boolean , nextRouter ?: NextRouter | typeof useRouter ) : void {
10+ const router = typeof nextRouter === 'function' ? nextRouter ( ) : nextRouter
11+
1012 useEffect ( ( ) => {
1113 if ( unsaved ) {
1214 /**
@@ -23,15 +25,15 @@ export function useUnsaved (unsaved?: boolean, nextRouter?: Router): void {
2325 */
2426 function preventUnsavedNav ( url : string ) : void {
2527 const urlSplit = url . split ( '?' ) [ 0 ] ! . split ( '/' )
26- if ( nextRouter ?. pathname . split ( '/' ) . every ( ( subroute , i ) => ( subroute . startsWith ( '[' ) && subroute . endsWith ( ']' ) ) || subroute === urlSplit [ i ] ) ) return
28+ if ( router ?. pathname . split ( '/' ) . every ( ( subroute , i ) => ( subroute . startsWith ( '[' ) && subroute . endsWith ( ']' ) ) || subroute === urlSplit [ i ] ) ) return
2729
2830 if ( ! confirm ( 'Changes you made may not be saved.' ) ) throw new Error ( 'Navigation Canceled' )
2931 }
3032
31- nextRouter ?. events . on ( 'routeChangeStart' , preventUnsavedNav )
33+ router ?. events . on ( 'routeChangeStart' , preventUnsavedNav )
3234 window . addEventListener ( 'beforeunload' , preventUnsavedClose )
3335 return ( ) => {
34- nextRouter ?. events . off ( 'routeChangeStart' , preventUnsavedNav )
36+ router ?. events . off ( 'routeChangeStart' , preventUnsavedNav )
3537 window . removeEventListener ( 'beforeunload' , preventUnsavedClose )
3638 }
3739 }
0 commit comments