31 lines
993 B
TypeScript
31 lines
993 B
TypeScript
import { createContext, useContext } from "react";
|
|
|
|
export type UnsavedNavigationAction = () => void;
|
|
|
|
export type UnsavedChangesRegistration = {
|
|
title?: string;
|
|
message?: string;
|
|
onSave: () => boolean | Promise<boolean>;
|
|
onDiscard?: () => void;
|
|
};
|
|
|
|
export type UnsavedChangesContextValue = {
|
|
hasUnsavedChanges: boolean;
|
|
registerUnsavedChanges: (registration: UnsavedChangesRegistration | null) => () => void;
|
|
requestNavigation: (action: UnsavedNavigationAction) => void;
|
|
requestDiscard: (action: UnsavedNavigationAction) => void;
|
|
};
|
|
|
|
export const UnsavedChangesContext = createContext<UnsavedChangesContextValue | null>(null);
|
|
|
|
const fallbackUnsavedChangesContext: UnsavedChangesContextValue = {
|
|
hasUnsavedChanges: false,
|
|
registerUnsavedChanges: () => () => undefined,
|
|
requestNavigation: (action) => action(),
|
|
requestDiscard: (action) => action()
|
|
};
|
|
|
|
export function useUnsavedChanges() {
|
|
return useContext(UnsavedChangesContext) ?? fallbackUnsavedChangesContext;
|
|
}
|