/** * Integration Examples * * This file shows how to integrate the new template-driven RequestDetail * component into your existing application. */ import { useEffect, useState } from 'react'; import { Route, Routes, useNavigate, useParams, Link, BrowserRouter, NavigateFunction } from 'react-router-dom'; import { useAuth } from '@/contexts/AuthContext'; import { RequestDetailTemplated } from './RequestDetailTemplated'; import { RequestDetail } from './RequestDetail'; import { registerTemplate, selectTemplate, getTemplate } from './templates'; // Mock components for examples const Home = () =>
Home
; const Login = () =>
Login
; const Dashboard = () =>
Dashboard
; const ProtectedRoute = () =>
Protected
; const Modal = ({ children, onClose }: any) =>
{children}
; const HomePage = () =>
Home
; const LoginPage = () =>
Login
; const DashboardPage = () =>
Dashboard
; const NotFoundPage = () =>
Not Found
; // Mock hooks const useRequests = () => [] as any[]; // Mock data const requests = [] as any[]; const notifications = [] as any[]; /** * Example 1: Simple Route Integration * * Replace your existing route with the new template-driven component */ export function SimpleRouteIntegration() { return ( {/* Old way - still works for backward compatibility */} } /> {/* New way - template-driven (recommended) */} } /> ); } /** * Example 2: Gradual Migration Strategy * * Run both versions side-by-side during migration */ export function GradualMigration() { return ( {/* Legacy route for existing links */} } /> {/* New template-driven route */} } /> {/* Dealer-specific route */} } /> {/* Vendor-specific route */} } /> ); } /** * Example 3: Conditional Rendering Based on User Role */ export function ConditionalRenderingExample() { return function RequestDetailRoute() { const { user } = useAuth(); const { requestId } = useParams(); // Use new template system for dealers and vendors if (user?.role === 'dealer' || user?.role === 'vendor') { return ; } // Use old component for other users (during migration) return ; }; } /** * Example 4: Dashboard Integration */ export function DashboardIntegration() { const navigate = useNavigate(); const handleViewRequest = (request: any) => { // Automatic template selection based on request type navigate(`/request/${request.requestId}`); // Or explicit template if (request.category === 'claim-management') { navigate(`/dealer/claim/${request.requestId}`); } }; return (
{requests.map(request => (

{request.title}

))}
); } /** * Example 5: Modal Integration */ export function ModalIntegration() { const [selectedRequestId, setSelectedRequestId] = useState(null); return ( <> {selectedRequestId && ( setSelectedRequestId(null)}> setSelectedRequestId(null)} /> )} ); } /** * Example 6: App.tsx Integration */ export function AppIntegrationExample() { return ( {/* Public routes */} } /> } /> {/* Protected routes */} }> } /> {/* Request Detail Routes */} } /> {/* Dealer-specific routes */} } /> {/* Vendor-specific routes */} } /> ); } /** * Example 7: Custom Template Registration at App Startup */ export function AppInitialization() { useEffect(() => { // Register custom templates at app startup import('./templates/customTemplates').then(({ customTemplates }) => { customTemplates.forEach(template => { registerTemplate(template); }); }); }, []); return ; } /** * Example 8: Dynamic Template Selection Hook */ export function useDynamicTemplate(requestId: string) { const [template, setTemplate] = useState('standard'); const { user } = useAuth(); useEffect(() => { // Fetch request details fetch(`/api/requests/${requestId}`) .then(res => res.json()) .then(request => { // Select template based on request data const templateId = selectTemplate(user, request); setTemplate(templateId); }); }, [requestId, user]); return template; } /** * Example 9: Using with Dynamic Template */ export function DynamicTemplateExample() { const { requestId } = useParams(); const templateId = useDynamicTemplate(requestId || ''); return ( ); } /** * Example 10: Table Row Click Handler */ export function TableIntegration() { const navigate = useNavigate(); const handleRowClick = (request: any) => { // Navigate to appropriate template based on request type if (request.category === 'claim-management') { navigate(`/dealer/claim/${request.requestId}`); } else if (request.category === 'vendor') { navigate(`/vendor/request/${request.requestId}`); } else { navigate(`/request/${request.requestId}`); } }; return ( {requests.map(request => ( handleRowClick(request)} className="cursor-pointer hover:bg-gray-50" > ))}
{request.requestId} {request.title} {request.status}
); } /** * Example 11: Notification Click Handler */ export function NotificationIntegration() { const navigate = useNavigate(); const handleNotificationClick = (notification: any) => { const { requestId, requestType } = notification; // Navigate with appropriate template switch (requestType) { case 'dealer-claim': navigate(`/request/${requestId}?template=dealerClaim`); break; case 'vendor': navigate(`/request/${requestId}?template=vendor`); break; default: navigate(`/request/${requestId}`); } }; return (
{notifications.map(notification => (
handleNotificationClick(notification)} > {notification.message}
))}
); } /** * Example 12: Search Results Integration */ export function SearchResultsIntegration() { const [searchResults, setSearchResults] = useState([]); const navigate = useNavigate(); const handleSearchResultClick = (result: any) => { // Use explicit template if known, otherwise let auto-selection work if (result.template) { navigate(`/request/${result.requestId}?template=${result.template}`); } else { navigate(`/request/${result.requestId}`); } }; return (
{searchResults.map(result => (
handleSearchResultClick(result)} className="search-result-item" >

{result.title}

{result.description}

{result.category}
))}
); } /** * Complete Integration Example * * This shows a complete integration with: * - Route configuration * - Protected routes * - Custom template registration * - Navigation helpers */ // main.tsx or App.tsx import { BrowserRouter } from 'react-router-dom'; import { AuthProvider } from '@/contexts/AuthContext'; import { registerTemplate } from '@/pages/RequestDetail/templates'; import { customTemplates } from './customTemplates'; function App() { // Register custom templates on app load useEffect(() => { customTemplates.forEach(registerTemplate); }, []); return ( {/* Public Routes */} } /> } /> {/* Protected Routes */} }> } /> {/* Universal Request Detail Route */} } /> {/* Type-specific routes (optional) */} } /> } /> {/* Catch all */} } /> ); } export default App; /** * Helper Functions */ // Navigate to request with appropriate template export function navigateToRequest( navigate: NavigateFunction, requestId: string, request?: any ) { if (request?.category === 'claim-management') { navigate(`/dealer/claim/${requestId}`); } else if (request?.category === 'vendor') { navigate(`/vendor/order/${requestId}`); } else { navigate(`/request/${requestId}`); } } // Get request URL with appropriate template export function getRequestUrl(requestId: string, request?: any): string { if (request?.category === 'claim-management') { return `/dealer/claim/${requestId}`; } else if (request?.category === 'vendor') { return `/vendor/order/${requestId}`; } else { return `/request/${requestId}`; } } // Check if user can access template export function canAccessTemplate( templateId: string, user: any, request: any ): boolean { const template = getTemplate(templateId); return template?.canAccess?.(user, request) ?? true; } /** * Usage in Components */ // Example: Dashboard request list function RequestList() { const navigate = useNavigate(); const requests = useRequests(); return (
{requests.map(request => (
navigateToRequest(navigate, request.requestId, request)} className="request-item" >

{request.title}

{request.description}

{request.category}
))}
); } // Example: Link generation function RequestLink({ request }: { request: any }) { const url = getRequestUrl(request.requestId, request); return ( View Request {request.requestId} ); } /** * TypeScript Types for Integration */ interface NavigationOptions { requestId: string; template?: string; request?: any; queryParams?: Record; } function navigateToRequestAdvanced( navigate: NavigateFunction, options: NavigationOptions ) { const { requestId, template, request, queryParams } = options; let url: string; if (template) { url = `/request/${requestId}?template=${template}`; } else if (request) { url = getRequestUrl(requestId, request); } else { url = `/request/${requestId}`; } if (queryParams) { const params = new URLSearchParams(queryParams); url += `${url.includes('?') ? '&' : '?'}${params.toString()}`; } navigate(url); } /** * Notes: * * 1. Always prefer automatic template selection over explicit template prop * 2. Use explicit template only when necessary (e.g., deep links) * 3. Register custom templates at app startup * 4. Use navigation helpers for consistent routing * 5. Handle access control at route level */