import { toast } from 'sonner'; import { AssetRequest } from '@/types/asset-request'; /** * Notification utility for asset request events * Provides toast notifications for immediate feedback on asset request actions */ /** * Show notification when an asset request is submitted * @param request - The submitted asset request */ export const notifyRequestSubmitted = (request: AssetRequest) => { toast.success('Asset Request Submitted', { description: `Your request for ${request.requestedAssets.length} item(s) has been submitted successfully. Request ID: ${request.requestID}`, duration: 5000, }); }; /** * Show notification to admins when a new request is received * This would typically be called in a polling/websocket context * @param request - The new asset request */ export const notifyAdminNewRequest = (request: AssetRequest) => { toast.info('New Asset Request', { description: `${request.employeeName} has submitted a new asset request. Request ID: ${request.requestID}`, duration: 7000, }); }; /** * Show notification when an asset request is approved * @param request - The approved asset request */ export const notifyRequestApproved = (request: AssetRequest) => { const adminComment = request.adminComments ? ` - ${request.adminComments}` : ''; toast.success('Asset Request Approved', { description: `Your asset request #${request.requestID} has been approved by ${request.reviewerName || 'an administrator'}${adminComment}`, duration: 7000, }); }; /** * Show notification when an asset request is rejected * @param request - The rejected asset request */ export const notifyRequestRejected = (request: AssetRequest) => { const adminComment = request.adminComments ? ` Reason: ${request.adminComments}` : ''; toast.error('Asset Request Rejected', { description: `Your asset request #${request.requestID} has been rejected by ${request.reviewerName || 'an administrator'}.${adminComment}`, duration: 10000, }); }; /** * Show notification when assets are assigned to a request * @param request - The asset request with assigned assets */ export const notifyAssetsAssigned = (request: AssetRequest) => { const assetTypes = request.requestedAssets .map(item => `${item.quantity}x ${item.assetType}`) .join(', '); toast.success('Assets Assigned', { description: `Assets have been assigned to your request #${request.requestID}: ${assetTypes}. Assigned by ${request.assignerName || 'an administrator'}.`, duration: 10000, }); }; /** * Show notification when an admin approves a request (for admin feedback) * @param request - The approved asset request */ export const notifyAdminApprovalSuccess = (request: AssetRequest) => { toast.success('Request Approved', { description: `Asset request #${request.requestID} for ${request.employeeName} has been approved successfully.`, duration: 5000, }); }; /** * Show notification when an admin rejects a request (for admin feedback) * @param request - The rejected asset request */ export const notifyAdminRejectionSuccess = (request: AssetRequest) => { toast.success('Request Rejected', { description: `Asset request #${request.requestID} for ${request.employeeName} has been rejected.`, duration: 5000, }); }; /** * Show notification when an admin assigns assets (for admin feedback) * @param request - The asset request with assigned assets */ export const notifyAdminAssignmentSuccess = (request: AssetRequest) => { toast.success('Assets Assigned', { description: `Assets have been successfully assigned to ${request.employeeName} for request #${request.requestID}.`, duration: 5000, }); }; /** * Show error notification for failed operations * @param operation - The operation that failed * @param error - The error message */ export const notifyError = (operation: string, error: string) => { toast.error(`${operation} Failed`, { description: error, duration: 7000, }); }; /** * Show loading notification for async operations * @param message - The loading message * @returns Toast ID for dismissal */ export const notifyLoading = (message: string) => { return toast.loading(message); }; /** * Dismiss a notification by ID * @param toastId - The toast ID to dismiss */ export const dismissNotification = (toastId: string | number) => { toast.dismiss(toastId); };