# System Configuration - Frontend Integration Guide ## ๐Ÿ“‹ Overview The Royal Enfield Workflow Management System now uses **centralized, backend-driven configuration**. All system settings are fetched from the backend API and cached on the frontend. ## ๐Ÿšซ **NO MORE HARDCODED VALUES!** ### โŒ Before (Hardcoded): ```typescript const MAX_MESSAGE_LENGTH = 2000; const WORK_START_HOUR = 9; const MAX_APPROVAL_LEVELS = 10; ``` ### โœ… After (Backend-Driven): ```typescript import { configService, getWorkNotesConfig } from '@/services/configService'; const config = await getWorkNotesConfig(); const maxLength = config.maxMessageLength; // From backend ``` --- ## ๐ŸŽฏ How to Use Configuration ### **Method 1: Full Configuration Object** ```typescript import { configService } from '@/services/configService'; // In component useEffect(() => { const loadConfig = async () => { const config = await configService.getConfig(); console.log('Max file size:', config.upload.maxFileSizeMB); console.log('Working hours:', config.workingHours); }; loadConfig(); }, []); ``` ### **Method 2: Helper Functions** ```typescript import { getWorkingHours, getTATThresholds, getUploadLimits, getWorkNotesConfig, getFeatureFlags } from '@/services/configService'; // Get specific configuration const workingHours = await getWorkingHours(); const tatThresholds = await getTATThresholds(); const uploadLimits = await getUploadLimits(); ``` ### **Method 3: React Hook (Recommended)** Create a custom hook: ```typescript // src/hooks/useSystemConfig.ts import { useState, useEffect } from 'react'; import { configService, SystemConfig } from '@/services/configService'; export function useSystemConfig() { const [config, setConfig] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { const loadConfig = async () => { const cfg = await configService.getConfig(); setConfig(cfg); setLoading(false); }; loadConfig(); }, []); return { config, loading }; } // Usage in component: function MyComponent() { const { config, loading } = useSystemConfig(); if (loading) return
Loading...
; return (
Max file size: {config.upload.maxFileSizeMB} MB
); } ``` --- ## ๐Ÿ”„ Configuration Flow ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Backend (.env) โ”‚ โ”‚ Environment โ”‚ โ”‚ Variables โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ system.config.tsโ”‚ โ”‚ (Centralized) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ–บ tat.config.ts (TAT settings) โ”œโ”€โ”€โ”€โ”€โ”€โ–บ tatTimeUtils.ts (Uses working hours) โ””โ”€โ”€โ”€โ”€โ”€โ–บ config.routes.ts (API endpoint) โ”‚ โ–ผ GET /api/v1/config โ”‚ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Frontend configService โ”‚ โ”‚ (Cached in memory) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ–บ Components (via hook) โ”œโ”€โ”€โ”€โ”€โ”€โ–บ Utils (slaTracker) โ””โ”€โ”€โ”€โ”€โ”€โ–บ Services ``` --- ## ๐Ÿ“Š Configuration Values ### **Working Hours** ```typescript const workingHours = await getWorkingHours(); // { // START_HOUR: 9, // END_HOUR: 18, // START_DAY: 1, // Monday // END_DAY: 5, // Friday // TIMEZONE: 'Asia/Kolkata' // } ``` ### **TAT Thresholds** ```typescript const thresholds = await getTATThresholds(); // { // warning: 50, // 50% - First reminder // critical: 75, // 75% - Urgent reminder // breach: 100 // 100% - Breach alert // } ``` ### **Upload Limits** ```typescript const limits = await getUploadLimits(); // { // maxFileSizeMB: 10, // allowedFileTypes: ['pdf', 'doc', ...], // maxFilesPerRequest: 10 // } ``` ### **Feature Flags** ```typescript const features = await getFeatureFlags(); // { // ENABLE_AI_CONCLUSION: true, // ENABLE_TEMPLATES: false, // ENABLE_ANALYTICS: true, // ENABLE_EXPORT: true // } ``` --- ## ๐ŸŽจ Example Integrations ### **File Upload Component** ```typescript import { getUploadLimits } from '@/services/configService'; function FileUpload() { const [maxSize, setMaxSize] = useState(10); useEffect(() => { const loadLimits = async () => { const limits = await getUploadLimits(); setMaxSize(limits.maxFileSizeMB); }; loadLimits(); }, []); return ( ); } ``` ### **Work Notes Message Input** ```typescript import { getWorkNotesConfig } from '@/services/configService'; function MessageInput() { const [maxLength, setMaxLength] = useState(2000); useEffect(() => { const loadConfig = async () => { const config = await getWorkNotesConfig(); setMaxLength(config.maxMessageLength); }; loadConfig(); }, []); return (