Passport Application System
Overview
This document provides technical details about the Passport Application React component, which is part of the student portal system. The component allows students to apply for passport-related certificates and track their application status.
Key Features
- Application Form:
- Supports both fresh and renewal passport applications
- Normal and tatkal (urgent) processing modes
- Travel plan information collection
-
Form validation
-
Application Status Tracking:
- View history of all passport applications
- See current status (Approved/Rejected/Pending)
-
View remarks from administrators
-
User Interface:
- Tab-based navigation between application and status views
- Responsive design for all device sizes
- Modern UI with icons and visual indicators
Technical Stack
- Frontend: React.js with functional components
- State Management: React Query for data fetching and mutations
- UI Library: DaisyUI (Tailwind CSS component library)
- Icons: React Icons (Font Awesome set)
- Form Handling: React state management with validation
- API Client: Custom
newRequestwrapper (likely around Axios)
Code Structure Explanation
1. Initial Setup and State Management
const initialFormData = {
applicationType: 'fresh',
placeOfBirth: '',
semester: '',
mode: 'normal',
tatkalReason: '',
travelPlans: 'no',
travelDetails: '',
fromDate: '',
toDate: ''
};
const [formData, setFormData] = useState(initialFormData);
const [formErrors, setFormErrors] = useState({});
const [activeTab, setActiveTab] = useState('application');
initialFormData: Default values for the form fieldsformData: Current state of the form inputsformErrors: Validation error messagesactiveTab: Controls which view is displayed (application form or status)
2. Data Fetching with React Query
// Get user data from localStorage
const {data:userData} = JSON.parse(localStorage.getItem("currentUser"));
const {userId} = userData.user;
// Fetch student data
const { isLoading, error, data: studentData } = useQuery({
queryKey: [`passport-${userId}`],
queryFn: () =>
newRequest.get(`/student/${userId}/passport`).then((res) => res.data),
});
// Fetch application history
const { data: applications = [] } = useQuery({
queryKey: ['passport-applications'],
queryFn: () =>
newRequest.get(`/student/${userId}/passport/applications`).then((res) => res.data),
});
- Uses React Query's
useQueryhook for data fetching - Student data is fetched based on the logged-in user's ID
- Application history is stored in the
applicationsvariable - Default value of empty array prevents undefined errors
3. Form Validation
const validateForm = () => {
const errors = {};
if (!formData.placeOfBirth?.trim()) {
errors.placeOfBirth = 'Place of birth is required';
}
// ... other validation checks
setFormErrors(errors);
return Object.keys(errors).length === 0;
};
- Checks required fields
- Validates date ranges for travel plans
- Sets error messages in
formErrorsstate - Returns true if form is valid
4. Form Submission
const createApplication = useMutation({
mutationFn: (formData) => {
return newRequest.post(`/student/${userId}/passport/apply`, formData);
},
onSuccess: () => {
queryClient.invalidateQueries(['passport-applications']);
setFormData(initialFormData);
setFormErrors({});
toast.success('Passport application submitted successfully');
setActiveTab('status');
},
// ... error handling
});
const handleSubmit = (e) => {
e.preventDefault();
if (validateForm()) {
createApplication.mutate(formData);
}
};
- Uses React Query's
useMutationfor form submission - On success:
- Refetches application history
- Resets form
- Shows success notification
- Switches to status tab
- Only submits if form validation passes
5. UI Components
InfoDisplay Component
const InfoDisplay = ({ label, value, icon: Icon }) => (
<div className="flex items-center space-x-3 py-2">
{Icon && (
<div className="flex-shrink-0 w-10 h-10 rounded-full bg-indigo-100 flex items-center justify-center border border-indigo-200 shadow-sm">
<Icon className="w-5 h-5 text-indigo-600" />
</div>
)}
<div>
<div className="text-xs font-medium text-gray-500 uppercase tracking-wider mb-0.5">{label}</div>
<div className="text-sm font-semibold text-gray-800">{value}</div>
</div>
</div>
);
- Reusable component for displaying student information
- Shows label and value with an optional icon
- Consistent styling across all information displays
Application Form
The form is divided into several sections:
- Application Type: Radio buttons for fresh/renewal
- Student Information: Displays readonly student data
- Additional Details: Place of birth and semester selection
- Application Mode: Normal or tatkal with reason field
- Travel Plans: Optional travel information
- Submit Buttons: With reset functionality
Status Table
Displays application history with:
- Application date
- Type and mode
- Remarks
- Status with color-coded indicators
6. Styling Approach
- Uses DaisyUI (Tailwind CSS component library) for consistent styling
- Custom gradient text for headings
- Responsive grid layouts
- Animated transitions for better UX
- Color-coded status indicators
- Icon integration for visual cues
Technical Considerations
- Performance:
- React Query optimizes data fetching and caching
-
Memoization could be added for complex components if needed
-
Security:
- User authentication handled at higher level
-
User-specific data fetched based on authenticated user ID
-
Accessibility:
- Semantic HTML structure
- Proper labeling of form elements
-
Sufficient color contrast
-
Error Handling:
- Form validation with clear error messages
- API error handling with toast notifications
Integration Points
- API Endpoints:
- GET
/student/{userId}/passport- Student data - GET
/student/{userId}/passport/applications- Application history -
POST
/student/{userId}/passport/apply- Submit new application -
Dependencies:
- React Query for data management
- React Icons for UI icons
- DaisyUI/Tailwind CSS for styling
- Custom
newRequestfor API calls