mirror of
https://github.com/Stirling-Tools/Stirling-PDF.git
synced 2025-08-24 21:29:25 +00:00
125 lines
3.0 KiB
TypeScript
125 lines
3.0 KiB
TypeScript
![]() |
/**
|
||
|
* URL synchronization hooks for tool routing
|
||
|
*/
|
||
|
|
||
|
import { useEffect, useCallback } from 'react';
|
||
|
import { ModeType } from '../contexts/NavigationContext';
|
||
|
import { parseToolRoute, updateToolRoute, clearToolRoute } from '../utils/urlRouting';
|
||
|
|
||
|
/**
|
||
|
* Hook to sync navigation mode with URL
|
||
|
*/
|
||
|
export function useNavigationUrlSync(
|
||
|
currentMode: ModeType,
|
||
|
setMode: (mode: ModeType) => void,
|
||
|
enableSync: boolean = true
|
||
|
) {
|
||
|
// Initialize mode from URL on mount
|
||
|
useEffect(() => {
|
||
|
if (!enableSync) return;
|
||
|
|
||
|
const route = parseToolRoute();
|
||
|
if (route.mode !== currentMode) {
|
||
|
setMode(route.mode);
|
||
|
}
|
||
|
}, []); // Only run on mount
|
||
|
|
||
|
// Update URL when mode changes
|
||
|
useEffect(() => {
|
||
|
if (!enableSync) return;
|
||
|
|
||
|
if (currentMode === 'pageEditor') {
|
||
|
clearToolRoute();
|
||
|
} else {
|
||
|
updateToolRoute(currentMode, currentMode);
|
||
|
}
|
||
|
}, [currentMode, enableSync]);
|
||
|
|
||
|
// Handle browser back/forward navigation
|
||
|
useEffect(() => {
|
||
|
if (!enableSync) return;
|
||
|
|
||
|
const handlePopState = () => {
|
||
|
const route = parseToolRoute();
|
||
|
if (route.mode !== currentMode) {
|
||
|
setMode(route.mode);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
window.addEventListener('popstate', handlePopState);
|
||
|
return () => window.removeEventListener('popstate', handlePopState);
|
||
|
}, [currentMode, setMode, enableSync]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Hook to sync tool workflow with URL
|
||
|
*/
|
||
|
export function useToolWorkflowUrlSync(
|
||
|
selectedToolKey: string | null,
|
||
|
selectTool: (toolKey: string) => void,
|
||
|
clearTool: () => void,
|
||
|
enableSync: boolean = true
|
||
|
) {
|
||
|
// Initialize tool from URL on mount
|
||
|
useEffect(() => {
|
||
|
if (!enableSync) return;
|
||
|
|
||
|
const route = parseToolRoute();
|
||
|
if (route.toolKey && route.toolKey !== selectedToolKey) {
|
||
|
selectTool(route.toolKey);
|
||
|
} else if (!route.toolKey && selectedToolKey) {
|
||
|
clearTool();
|
||
|
}
|
||
|
}, []); // Only run on mount
|
||
|
|
||
|
// Update URL when tool changes
|
||
|
useEffect(() => {
|
||
|
if (!enableSync) return;
|
||
|
|
||
|
if (selectedToolKey) {
|
||
|
const route = parseToolRoute();
|
||
|
if (route.toolKey !== selectedToolKey) {
|
||
|
updateToolRoute(selectedToolKey as ModeType, selectedToolKey);
|
||
|
}
|
||
|
}
|
||
|
}, [selectedToolKey, enableSync]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Hook to get current URL route information
|
||
|
*/
|
||
|
export function useCurrentRoute() {
|
||
|
const getCurrentRoute = useCallback(() => {
|
||
|
return parseToolRoute();
|
||
|
}, []);
|
||
|
|
||
|
return getCurrentRoute;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Hook to programmatically navigate to tools
|
||
|
*/
|
||
|
export function useToolNavigation() {
|
||
|
const navigateToTool = useCallback((toolKey: string) => {
|
||
|
updateToolRoute(toolKey as ModeType, toolKey);
|
||
|
|
||
|
// Dispatch a custom event to notify other components
|
||
|
window.dispatchEvent(new CustomEvent('toolNavigation', {
|
||
|
detail: { toolKey }
|
||
|
}));
|
||
|
}, []);
|
||
|
|
||
|
const navigateToHome = useCallback(() => {
|
||
|
clearToolRoute();
|
||
|
|
||
|
// Dispatch a custom event to notify other components
|
||
|
window.dispatchEvent(new CustomEvent('toolNavigation', {
|
||
|
detail: { toolKey: null }
|
||
|
}));
|
||
|
}, []);
|
||
|
|
||
|
return {
|
||
|
navigateToTool,
|
||
|
navigateToHome
|
||
|
};
|
||
|
}
|