Create Ticket Page
The Create Ticket page allows users to create a new ticket for a specific device. It is located at iot-frontend/src/pages/create-ticket/[createTicket].tsx.
Authentication
Similar to other pages, the Create Ticket page requires authentication. It uses the useAuth hook to check the authentication status.
const { isAuthenticated, isLoading } = useAuth();If isLoading is true, a loading indicator is displayed. If isAuthenticated is false, the user is redirected to the login page.
Fetching Device ID
The fetchDeviceId function is used to fetch the device ID from the URL.
function fetchDeviceId() {
const pathname = usePathname();
const parts = pathname ? pathname.split('/') : [];
const deviceId = parts[parts.length - 1]
? parseInt(parts[parts.length - 1] as string)
: 0;
return deviceId;
}The device ID is extracted from the URL and parsed as an integer. If the device ID is undefined, it defaults to 0.
Email Validation
The Create Ticket page includes email validation functions to ensure valid email formats.
const isEmail = (email: string) =>
/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i.test(email);
const isValidEmails = (emails: string) => {
const emailArray = emails.split(',').map((email) => email.trim());
return emailArray.every(isEmail);
};The isEmail function checks if a single email address is in a valid format, while the isValidEmails function validates a comma-separated list of email addresses.
State Management
The Create Ticket page uses the useState hook to manage the state of various form fields and other variables.
const [to, setTo] = useState('');
const [cc, setCc] = useState('');
const [bcc, setBcc] = useState('');
const [subject, setSubject] = useState('');
const [message, setMessage] = useState(
'Hi team, There is something wrong with...'
);
const [isSubmitLoading, setIsSubmitLoading] = useState(false);
const [showModal, setShowModal] = useState(false);
const [errors, setErrors] = useState<{ [key: string]: string }>({});These state variables store the values of the email fields (to, cc, bcc, subject, message), loading state, modal visibility, and form errors.
Handling Create Ticket
The handleCreateTicket function is called when the user submits the create ticket form.
const handleCreateTicket = async (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
// Reset errors
setErrors({});
setIsSubmitLoading(true);
// Validate fields
const validationErrors: { [key: string]: string } = {};
// ... field validation logic ...
if (Object.keys(validationErrors).length > 0) {
setErrors(validationErrors);
setIsSubmitLoading(false);
return;
}
try {
const response = await fetch('/api/sendEmail', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ to, cc, bcc, subject, message, deviceData }),
});
if (response.ok) {
// Show success modal
setShowModal(true);
} else {
// Handle error responses
// ...
}
} catch (error) {
// Handle errors
// ...
} finally {
setIsSubmitLoading(false);
}
};The function performs the following steps:
- Prevents the default form submission behavior.
- Resets any previous errors.
- Sets the loading state to
true. - Validates the form fields and sets validation errors if any.
- If there are validation errors, updates the errors state and sets the loading state back to
false. - If there are no validation errors, sends a POST request to the
/api/sendEmailendpoint with the form data. - Handles the response from the API, showing a success modal if the response is successful, or handling error responses appropriately.
- Catches any errors that occur during the process and handles them accordingly.
- Finally, sets the loading state back to
false.
Using Resend for Email Sending
The Create Ticket page uses the Resend service for sending emails. Refer to the Resend Documentation for more details on how Resend is integrated into the application.