Re_Figma_Code/src/utils/requestNavigation.ts

80 lines
2.2 KiB
TypeScript

/**
* Global Request Navigation Utility
*
* Centralized navigation logic for request-related routes.
* This utility decides where to navigate when clicking on request cards
* from anywhere in the application.
*
* Features:
* - Single point of navigation logic
* - Handles draft vs active requests
* - Supports different flow types (CUSTOM, DEALER_CLAIM)
* - Type-safe navigation
*/
import { NavigateFunction } from 'react-router-dom';
import { getRequestDetailRoute, RequestFlowType } from './requestTypeUtils';
export interface RequestNavigationOptions {
requestId: string;
requestTitle?: string;
status?: string;
request?: any; // Full request object if available
navigate: NavigateFunction;
}
/**
* Navigate to the appropriate request detail page based on request type
*
* This is the single point of navigation for all request cards.
* It handles:
* - Draft requests (navigate to edit)
* - Different flow types (CUSTOM, DEALER_CLAIM)
* - Status-based routing
*/
export function navigateToRequest(options: RequestNavigationOptions): void {
const { requestId, status, request, navigate } = options;
// Check if request is a draft - if so, route to edit form instead of detail view
const isDraft = status?.toLowerCase() === 'draft' || status === 'DRAFT';
if (isDraft) {
navigate(`/edit-request/${requestId}`);
return;
}
// Determine the appropriate route based on request type
const route = getRequestDetailRoute(requestId, request);
navigate(route);
}
/**
* Navigate to create a new request based on flow type
*/
export function navigateToCreateRequest(
navigate: NavigateFunction,
flowType: RequestFlowType = 'CUSTOM'
): void {
const route = flowType === 'DEALER_CLAIM'
? '/claim-management'
: '/new-request';
navigate(route);
}
/**
* Create a navigation handler function for request cards
* This can be used directly in onClick handlers
*/
export function createRequestNavigationHandler(
navigate: NavigateFunction
) {
return (requestId: string, requestTitle?: string, status?: string, request?: any) => {
navigateToRequest({
requestId,
requestTitle,
status,
request,
navigate,
});
};
}