199 lines
4.9 KiB
TypeScript
199 lines
4.9 KiB
TypeScript
/**
|
|
* Hook for handling workflow submission and draft saving
|
|
*/
|
|
|
|
import { useState } from 'react';
|
|
import { toast } from 'sonner';
|
|
import { FormData, RequestTemplate } from '@/hooks/useCreateRequestForm';
|
|
import {
|
|
buildCreatePayload,
|
|
buildUpdatePayload,
|
|
validateApproversForSubmission,
|
|
} from '../utils/payloadBuilders';
|
|
import {
|
|
createAndSubmitWorkflow,
|
|
updateAndSubmitWorkflow,
|
|
createWorkflow,
|
|
updateWorkflowRequest,
|
|
} from '../services/createRequestService';
|
|
|
|
interface UseSubmissionOptions {
|
|
formData: FormData;
|
|
selectedTemplate: RequestTemplate | null;
|
|
documents: File[];
|
|
documentsToDelete: string[];
|
|
user: any;
|
|
isEditing: boolean;
|
|
editRequestId: string;
|
|
onSubmit?: (requestData: any) => void;
|
|
}
|
|
|
|
export function useCreateRequestSubmission({
|
|
formData,
|
|
selectedTemplate,
|
|
documents,
|
|
documentsToDelete,
|
|
user,
|
|
isEditing,
|
|
editRequestId,
|
|
onSubmit,
|
|
}: UseSubmissionOptions) {
|
|
const [submitting, setSubmitting] = useState(false);
|
|
const [savingDraft, setSavingDraft] = useState(false);
|
|
|
|
const handleSubmit = async () => {
|
|
if (submitting || savingDraft) return;
|
|
|
|
// Validate approvers
|
|
const validation = validateApproversForSubmission(
|
|
formData.approvers || [],
|
|
formData.approverCount || 1
|
|
);
|
|
|
|
if (!validation.valid) {
|
|
alert(validation.message);
|
|
return;
|
|
}
|
|
|
|
setSubmitting(true);
|
|
|
|
try {
|
|
if (isEditing && editRequestId) {
|
|
// Update existing workflow
|
|
const updatePayload = buildUpdatePayload(
|
|
formData,
|
|
user,
|
|
documentsToDelete
|
|
);
|
|
|
|
await updateAndSubmitWorkflow(
|
|
editRequestId,
|
|
updatePayload,
|
|
documents,
|
|
documentsToDelete
|
|
);
|
|
|
|
// Show toast after backend confirmation
|
|
toast.success('Request Submitted Successfully!', {
|
|
description: `Your request "${formData.title}" has been submitted and sent for approval.`,
|
|
duration: 5000,
|
|
});
|
|
|
|
onSubmit?.({
|
|
...formData,
|
|
backendId: editRequestId,
|
|
template: selectedTemplate,
|
|
});
|
|
} else {
|
|
// Create new workflow
|
|
const createPayload = buildCreatePayload(
|
|
formData,
|
|
selectedTemplate,
|
|
user
|
|
);
|
|
|
|
const result = await createAndSubmitWorkflow(createPayload, documents);
|
|
|
|
// Show toast after backend confirmation
|
|
toast.success('Request Submitted Successfully!', {
|
|
description: `Your request "${formData.title}" has been created and sent for approval.`,
|
|
duration: 5000,
|
|
});
|
|
|
|
onSubmit?.({
|
|
...formData,
|
|
backendId: result.id,
|
|
template: selectedTemplate,
|
|
});
|
|
}
|
|
} catch (error: any) {
|
|
console.error('Failed to submit workflow:', error);
|
|
toast.error('Failed to Submit Request', {
|
|
description: error?.response?.data?.message || error?.message || 'An error occurred while submitting the request.',
|
|
duration: 5000,
|
|
});
|
|
setSubmitting(false);
|
|
}
|
|
};
|
|
|
|
const handleSaveDraft = async () => {
|
|
// Validate minimum required fields
|
|
if (
|
|
!selectedTemplate ||
|
|
!formData.title.trim() ||
|
|
!formData.description.trim() ||
|
|
!formData.priority
|
|
) {
|
|
return;
|
|
}
|
|
|
|
if (submitting || savingDraft) return;
|
|
|
|
setSavingDraft(true);
|
|
|
|
try {
|
|
if (isEditing && editRequestId) {
|
|
// Update existing draft
|
|
const updatePayload = buildUpdatePayload(
|
|
formData,
|
|
user,
|
|
documentsToDelete
|
|
);
|
|
|
|
await updateWorkflowRequest(
|
|
editRequestId,
|
|
updatePayload,
|
|
documents,
|
|
documentsToDelete
|
|
);
|
|
|
|
toast.success('Draft Saved Successfully!', {
|
|
description: `Your request "${formData.title}" has been saved as draft.`,
|
|
duration: 5000,
|
|
});
|
|
|
|
onSubmit?.({
|
|
...formData,
|
|
backendId: editRequestId,
|
|
template: selectedTemplate,
|
|
});
|
|
} else {
|
|
// Create new draft
|
|
const createPayload = buildCreatePayload(
|
|
formData,
|
|
selectedTemplate,
|
|
user
|
|
);
|
|
|
|
const result = await createWorkflow(createPayload, documents);
|
|
|
|
toast.success('Draft Saved Successfully!', {
|
|
description: `Your request "${formData.title}" has been saved as draft.`,
|
|
duration: 5000,
|
|
});
|
|
|
|
onSubmit?.({
|
|
...formData,
|
|
backendId: result.id,
|
|
template: selectedTemplate,
|
|
});
|
|
}
|
|
} catch (error: any) {
|
|
console.error('Failed to save draft:', error);
|
|
toast.error('Failed to Save Draft', {
|
|
description: error?.response?.data?.message || error?.message || 'An error occurred while saving the draft.',
|
|
duration: 5000,
|
|
});
|
|
setSavingDraft(false);
|
|
}
|
|
};
|
|
|
|
return {
|
|
submitting,
|
|
savingDraft,
|
|
handleSubmit,
|
|
handleSaveDraft,
|
|
};
|
|
}
|
|
|