diff --git a/components/EOISection.vue b/components/EOISection.vue index a70d57d..e64b67e 100644 --- a/components/EOISection.vue +++ b/components/EOISection.vue @@ -580,6 +580,7 @@ const generateEOI = async (retryCount = 0) => { documentId: string | number; clientSigningUrl: string; signingLinks: Record; + documensoID?: string; }>('/api/email/generate-eoi-document', { method: 'POST', headers: { @@ -587,7 +588,9 @@ const generateEOI = async (retryCount = 0) => { }, body: { interestId: props.interest.Id.toString() - } + }, + // Increase timeout to 60 seconds to handle slow Documenso API calls + timeout: 60000 }); if (response.success) { @@ -595,6 +598,13 @@ const generateEOI = async (retryCount = 0) => { ? 'EOI already exists - signature links retrieved' : 'EOI generated successfully'); + // Update local state immediately to show UI changes + if (response.documensoID) { + // Force update the hasGeneratedEOI computed by setting documentExists + documentExists.value = true; + documentValidated.value = true; + } + emit('eoi-generated', { signingLinks: response.signingLinks }); emit('update'); // Trigger parent to refresh data @@ -608,15 +618,28 @@ const generateEOI = async (retryCount = 0) => { } catch (error: any) { console.error('Failed to generate EOI:', error); - // Retry logic - if (retryCount < 3) { - console.log(`Retrying EOI generation... Attempt ${retryCount + 2}/4`); - await new Promise(resolve => setTimeout(resolve, (retryCount + 1) * 1000)); + // Check if it's a timeout error + const isTimeoutError = error.code === 'ECONNABORTED' || + error.message?.includes('timeout') || + error.statusCode === 502 || + error.statusCode === 504; + + // Retry logic with better handling for timeouts + if (retryCount < 4 && (isTimeoutError || error.statusCode === 502)) { + const waitTime = Math.min((retryCount + 1) * 2000, 8000); // Exponential backoff, max 8 seconds + console.log(`Retrying EOI generation due to timeout... Attempt ${retryCount + 2}/5 (waiting ${waitTime}ms)`); + toast.info(`Connection timeout. Retrying in ${waitTime/1000} seconds...`); + await new Promise(resolve => setTimeout(resolve, waitTime)); return generateEOI(retryCount + 1); } // Show error message after all retries failed - toast.error(error.data?.statusMessage || error.message || 'Failed to generate EOI after multiple attempts'); + const errorMessage = error.data?.statusMessage || error.message || 'Failed to generate EOI'; + if (isTimeoutError) { + toast.error('The server is taking too long to respond. Please try again in a few moments.'); + } else { + toast.error(errorMessage); + } } finally { isGenerating.value = false; } diff --git a/pages/dashboard/interest-list.vue b/pages/dashboard/interest-list.vue index ae61d6b..520b8da 100644 --- a/pages/dashboard/interest-list.vue +++ b/pages/dashboard/interest-list.vue @@ -128,7 +128,7 @@

Try adjusting your search or filters

-
+
{ return filtered; }); +// Sorted filtered interests for mobile view (newest first) +const sortedFilteredInterests = computed(() => { + if (!filteredInterests.value) return []; + + // Sort by Id in descending order (newest first) + return [...filteredInterests.value].sort((a, b) => b.Id - a.Id); +}); + // Helper function to get initials const getInitials = (name: string) => { if (!name) return '?'; diff --git a/server/api/email/generate-eoi-document.ts b/server/api/email/generate-eoi-document.ts index 99c09d8..f5da271 100644 --- a/server/api/email/generate-eoi-document.ts +++ b/server/api/email/generate-eoi-document.ts @@ -403,6 +403,7 @@ export default defineEventHandler(async (event) => { return { success: true, documentId: documentResponse.documentId, + documensoID: documentResponse.documentId.toString(), // Include this for immediate UI update clientSigningUrl: signingLinks['Client'] || '', signingLinks: signingLinks };