/**
* 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 (